home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- * *
- * LISTSERV V2 - Send command to LISTSERV on local node (unix) *
- * *
- * Copyright L-Soft international 1994 - All rights reserved *
- * *
- * Compile with -DSPOOL_DIR=\"/xxx/yyy\" *
- * Optionally, with -DLISTSERV=\"xxx\" (if the userid is not listserv) *
- * *
- * Example: su listserv *
- * cc -O -o lcmd -DSPOOL_DIR=\"/spool/listserv\" lcmd.c *
- * chmod 4755 lcmd *
- * exit *
- * lcmd help *
- * *
- ******************************************************************************/
-
- #include <sys/types.h>
- #include <stdio.h>
- #include <string.h>
- #include <errno.h>
- #include <time.h>
- #include <sys/stat.h>
- #include <signal.h>
- #include <pwd.h>
-
- char *getlogin();
-
- #ifndef LISTSERV
- #define LISTSERV "listserv"
- #endif
-
- static unsigned char L_TA2E[] = {
- 0x00,0x01,0x02,0x03,0x37,0x2D,0x2E,0x2F,0x16,0x05,0x25,0x0B,0x0C,0x0D,0x0E,0x0F,
- 0x10,0x11,0x12,0x13,0x3C,0x3D,0x32,0x26,0x18,0x19,0x3F,0x27,0x1C,0x1D,0x1E,0x1F,
- 0x40,0x5A,0x7F,0x7B,0x5B,0x6C,0x50,0x7D,0x4D,0x5D,0x5C,0x4E,0x6B,0x60,0x4B,0x61,
- 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0x7A,0x5E,0x4C,0x7E,0x6E,0x6F,
- 0x7C,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,
- 0xD7,0xD8,0xD9,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xAD,0xE0,0xBD,0x5F,0x6D,
- 0x79,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,
- 0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xC0,0x4F,0xD0,0xA1,0x07,
- 0x20,0x21,0x22,0x23,0x24,0x2A,0x06,0x17,0x28,0x29,0x15,0x2B,0x2C,0x09,0x0A,0x1B,
- 0x30,0x31,0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xE1,
- 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
- 0x58,0x59,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70,0x71,0x72,0x73,0x74,0x75,
- 0x76,0x77,0x78,0x80,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x9A,0x9B,0x9C,0x9D,0x9E,
- 0x9F,0xA0,0xAA,0xAB,0xAC,0xBB,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,
- 0xB8,0xB9,0xBA,0x4A,0xBC,0xFC,0xBE,0xBF,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xDA,0xDB,
- 0xDC,0xDD,0xDE,0xDF,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xFA,0xFB,0x6A,0xFD,0xFE,0xFF
- };
-
- static void syscall_failed(which)
- char *which;
- {
- char buf[256];
- int rc;
-
- rc = errno;
- sprintf(buf, "Error from %s", which);
- perror(buf);
- exit(rc);
- }
-
- static void putstr_EBC(r, f)
- char *r;
- FILE *f;
- {
- int l;
-
- l = strlen(r);
- putc(l >> 8, f);
- putc(l & 255, f);
-
- for (; *r;)
- if (fputc(L_TA2E[*r++], f) == EOF)
- syscall_failed( "fputc");
- }
-
- int main(argc, argv)
- int argc;
- char **argv;
- {
- char buf[65537], fileid[512], workfileid[512], line[512], *w, *r;
- struct stat stat_buff;
- long pid;
- int n;
- FILE *f;
- time_t now;
-
- if (argc < 2) {
- printf("Syntax: lcmd command.\n");
- return(1);
- }
-
- for (argc--, argv++, w = buf; argc--;) {
- if (w != buf)
- *w++ = ' ';
- for (r = *argv++; *r; *w++ = *r++);
- }
- *w = '\0';
-
- sprintf(workfileid, "%s/%.6x.tmp", SPOOL_DIR, pid = getpid());
- if (!(f = fopen(workfileid, "w")))
- syscall_failed("fopen");
-
- if (fwrite("*LSV-V*", 7, 1, f) < 1)
- syscall_failed("fwrite");
-
- if (!(r = getlogin()))
- r = getpwuid(getuid())->pw_name;
- sprintf(line, "1S A %s STANDARD %s LCMD JOB",
- LISTSERV, r);
-
- n = strlen(line);
- putc(n >> 8, f);
- putc(n & 255, f);
- if (fwrite(line, n, 1, f) < 1)
- syscall_failed("fwrite");
-
- putc(0, f);
- putc(0, f);
- putstr_EBC(buf, f);
-
- if (fclose(f))
- syscall_failed("fclose");
-
- for (now = time(0), n = 0;;) {
- sprintf(fileid, "%s/j%.8x-%.6x-%d.job",
- SPOOL_DIR, now, pid, ++n);
- if (lstat(fileid, &stat_buff))
- break;
- }
-
- if (link(workfileid, fileid))
- syscall_failed("link");
- if (unlink(workfileid))
- syscall_failed("unlink");
-
- sprintf(fileid, "%s/%s.PID", SPOOL_DIR, LISTSERV);
- if (f = fopen(fileid, "r")) {
- fscanf(f, "%lu\n", &pid);
- kill(pid, SIGUSR1);
- fclose(f);
- }
- return(0);
- }
-