home *** CD-ROM | disk | FTP | other *** search
/ Netscape Plug-Ins Developer's Kit / Netscape_Plug-Ins_Developers_Kit.iso / SOFTWARE / lsoft / unix / common.tz / common / lcmd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-09  |  4.4 KB  |  147 lines

  1. /******************************************************************************
  2.  *                                                                            *
  3.  * LISTSERV V2 - Send command to LISTSERV on local node (unix)                *
  4.  *                                                                            *
  5.  *         Copyright L-Soft international 1994 - All rights reserved          *
  6.  *                                                                            *
  7.  * Compile with -DSPOOL_DIR=\"/xxx/yyy\"                                      *
  8.  * Optionally, with -DLISTSERV=\"xxx\" (if the userid is not listserv)        *
  9.  *                                                                            *
  10.  * Example: su listserv                                                       *
  11.  *          cc -O -o lcmd -DSPOOL_DIR=\"/spool/listserv\" lcmd.c              *
  12.  *          chmod 4755 lcmd                                                   *
  13.  *          exit                                                              *
  14.  *          lcmd help                                                         *
  15.  *                                                                            *
  16.  ******************************************************************************/
  17.  
  18. #include <sys/types.h>
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <errno.h>
  22. #include <time.h>
  23. #include <sys/stat.h>
  24. #include <signal.h>
  25. #include <pwd.h>
  26.  
  27. char *getlogin();
  28.  
  29. #ifndef LISTSERV
  30. #define LISTSERV "listserv"
  31. #endif
  32.  
  33. static unsigned char L_TA2E[] = {
  34. 0x00,0x01,0x02,0x03,0x37,0x2D,0x2E,0x2F,0x16,0x05,0x25,0x0B,0x0C,0x0D,0x0E,0x0F,
  35. 0x10,0x11,0x12,0x13,0x3C,0x3D,0x32,0x26,0x18,0x19,0x3F,0x27,0x1C,0x1D,0x1E,0x1F,
  36. 0x40,0x5A,0x7F,0x7B,0x5B,0x6C,0x50,0x7D,0x4D,0x5D,0x5C,0x4E,0x6B,0x60,0x4B,0x61,
  37. 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0x7A,0x5E,0x4C,0x7E,0x6E,0x6F,
  38. 0x7C,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,
  39. 0xD7,0xD8,0xD9,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xAD,0xE0,0xBD,0x5F,0x6D,
  40. 0x79,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,
  41. 0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xC0,0x4F,0xD0,0xA1,0x07,
  42. 0x20,0x21,0x22,0x23,0x24,0x2A,0x06,0x17,0x28,0x29,0x15,0x2B,0x2C,0x09,0x0A,0x1B,
  43. 0x30,0x31,0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xE1,
  44. 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
  45. 0x58,0x59,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70,0x71,0x72,0x73,0x74,0x75,
  46. 0x76,0x77,0x78,0x80,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x9A,0x9B,0x9C,0x9D,0x9E,
  47. 0x9F,0xA0,0xAA,0xAB,0xAC,0xBB,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,
  48. 0xB8,0xB9,0xBA,0x4A,0xBC,0xFC,0xBE,0xBF,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xDA,0xDB,
  49. 0xDC,0xDD,0xDE,0xDF,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xFA,0xFB,0x6A,0xFD,0xFE,0xFF
  50. };
  51.  
  52. static void syscall_failed(which)
  53. char *which;
  54. {
  55.     char buf[256];
  56.     int rc;
  57.  
  58.     rc = errno;
  59.     sprintf(buf, "Error from %s", which);
  60.     perror(buf);
  61.     exit(rc);
  62. }
  63.  
  64. static void putstr_EBC(r, f)
  65. char *r;
  66. FILE *f;
  67. {
  68.     int l;
  69.  
  70.     l = strlen(r);
  71.     putc(l >> 8, f);
  72.     putc(l & 255, f);
  73.  
  74.     for (; *r;)
  75.         if (fputc(L_TA2E[*r++], f) == EOF)
  76.             syscall_failed( "fputc");
  77. }
  78.  
  79. int main(argc, argv)
  80. int argc;
  81. char **argv;
  82. {
  83.     char buf[65537], fileid[512], workfileid[512], line[512], *w, *r;
  84.     struct stat stat_buff;
  85.     long pid;
  86.     int n;
  87.     FILE *f;
  88.     time_t now; 
  89.  
  90.     if (argc < 2) {
  91.         printf("Syntax: lcmd command.\n");
  92.         return(1);
  93.     }
  94.  
  95.     for (argc--, argv++, w = buf; argc--;) {
  96.         if (w != buf)
  97.             *w++ = ' ';
  98.         for (r = *argv++; *r; *w++ = *r++);
  99.     }
  100.     *w = '\0';
  101.  
  102.     sprintf(workfileid, "%s/%.6x.tmp", SPOOL_DIR, pid = getpid());
  103.     if (!(f = fopen(workfileid, "w")))
  104.         syscall_failed("fopen");
  105.  
  106.     if (fwrite("*LSV-V*", 7, 1, f) < 1)
  107.         syscall_failed("fwrite");
  108.  
  109.     if (!(r = getlogin()))
  110.         r = getpwuid(getuid())->pw_name;
  111.     sprintf(line, "1S A %s STANDARD %s LCMD JOB",
  112.             LISTSERV, r);
  113.  
  114.     n = strlen(line);
  115.     putc(n >> 8, f);
  116.     putc(n & 255, f);
  117.     if (fwrite(line, n, 1, f) < 1)
  118.         syscall_failed("fwrite");
  119.  
  120.     putc(0, f);
  121.     putc(0, f);
  122.     putstr_EBC(buf, f);
  123.  
  124.     if (fclose(f))
  125.         syscall_failed("fclose");
  126.  
  127.     for (now = time(0), n = 0;;) {
  128.         sprintf(fileid, "%s/j%.8x-%.6x-%d.job",
  129.                 SPOOL_DIR, now, pid, ++n);
  130.         if (lstat(fileid, &stat_buff))
  131.             break;
  132.     }
  133.  
  134.     if (link(workfileid, fileid))
  135.         syscall_failed("link");
  136.     if (unlink(workfileid))
  137.         syscall_failed("unlink");
  138.  
  139.     sprintf(fileid, "%s/%s.PID", SPOOL_DIR, LISTSERV);
  140.     if (f = fopen(fileid, "r")) {
  141.         fscanf(f, "%lu\n", &pid);
  142.         kill(pid, SIGUSR1);
  143.         fclose(f);
  144.     }
  145.     return(0);
  146. }
  147.