home *** CD-ROM | disk | FTP | other *** search
/ Unix System Administration Handbook 1997 October / usah_oct97.iso / news / cnews.tar / inject / defaults.c < prev    next >
C/C++ Source or Header  |  1995-01-02  |  5KB  |  255 lines

  1. /*
  2.  * defaults - generate default values for headers.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <ctype.h>
  7. #include <string.h>
  8. #include <pwd.h>
  9. #include <sys/types.h>
  10. #include "news.h"
  11. #include "config.h"
  12. #include "fgetmfs.h"
  13.  
  14. /* imports */
  15. extern int optind;
  16. extern char *optarg;
  17. extern FILE *efopen();
  18. extern char *getenv(), *getlogin();
  19. extern char *emalloc();
  20. extern struct passwd *getmypwent();
  21. extern time_t time();
  22.  
  23. /* exports */
  24. char *progname = "";
  25. int debug;
  26.  
  27. /* forwards */
  28. char *fullname(), *readline(), *getdomainsuf(), *getuserid(), *getfullname();
  29. char *getorg();
  30.  
  31. /* privates */
  32. int usggcos;            /* strictly speaking, "BTL RJE format" */
  33. time_t now;
  34. long pid;
  35. char *server = NULL;
  36. char *client = NULL;
  37. size_t ntrimmed = 0;        /* number of chars trimmed off client */
  38.  
  39. /*
  40.  * main - parse arguments and handle options
  41.  */
  42. main(argc, argv)
  43. int argc;
  44. char *argv[];
  45. {
  46.     int c, errflg = 0;
  47.  
  48.     if (argc > 0)
  49.         progname = argv[0];
  50.     while ((c = getopt(argc, argv, "dp:t:c:s:u")) != EOF)
  51.         switch (c) {
  52.         case 'd':
  53.             ++debug;
  54.             break;
  55.         case 'p':
  56.             pid = atol(optarg);
  57.             break;
  58.         case 't':
  59.             now = atol(optarg);
  60.             break;
  61.         case 'c':
  62.             client = optarg;
  63.             break;
  64.         case 's':
  65.             server = optarg;
  66.             break;
  67.         case 'u':
  68.             usggcos++;
  69.             break;
  70.         default:
  71.             errflg++;
  72.             break;
  73.         }
  74.     if (errflg || optind < argc) {
  75.         (void) fprintf(stderr, "usage: %s [-du] [-p pid] [-t time]\n",
  76.             progname);
  77.         exit(2);
  78.     }
  79.  
  80.     if (client != NULL && server != NULL)
  81.         trimclient();
  82.     getdefaults();
  83.     exit(0);
  84. }
  85.  
  86. /*
  87.  - trimclient - null out (in client) common suffix of client and server
  88.  * length of suffix left in ntrimmed
  89.  */
  90. trimclient()
  91. {
  92.     register size_t clen = strlen(client);
  93.     register char *c = client + clen;
  94.     register char *s = server + strlen(server);
  95.  
  96.     for (; *c == *s && c > client && s > server; c--, s--)
  97.         continue;
  98.     if (*c != *s)
  99.         c++;        /* c -> last identical char */
  100.     else if (c > client && s == server && *(c-1) == '.')
  101.         c--;        /* server name considered to have . on front */
  102.     if (c > client && *(c-1) == '.') {
  103.         /* must not end with . */
  104.         while (*(c-1) == '.' && *c != '\0')
  105.             c++;
  106.     }
  107.     *c = '\0';
  108.     ntrimmed = clen - (c - client);
  109. }
  110.  
  111. getdefaults()
  112. {
  113.     register char *name, *domainsuf, *org;
  114.     register struct passwd *pwp = getmypwent();
  115.  
  116.     printvar("defhostname", hostname());
  117.     domainsuf = getdomainsuf();
  118.     printvar("defmailsuf", domainsuf);
  119.     printvar("defuser", getuserid(pwp));
  120.     name = getfullname(pwp);
  121.     printvar("defname", name);
  122.     free(name);
  123.     org = getorg();
  124.     printvar("deforg", org);
  125.     free(org);
  126.  
  127.     /* compute message-id */
  128.     (void) fputs("defmsgid", stdout);
  129.     (void) putchar('=');
  130.     (void) putchar('\'');
  131.  
  132.     (void) putchar('<');
  133.     intcode(now == 0? time(&now): now);
  134.     (void) putchar('.');
  135.     intcode((time_t)(pid == 0? getpid(): pid));
  136.     if (client != NULL) {
  137.         (void) putchar('.');
  138.         intcode((time_t)ntrimmed);
  139.         if (*client != '\0') {
  140.             (void) putchar('.');
  141.             (void) fputs(client, stdout);
  142.         }
  143.     }
  144.     (void) fputs(domainsuf, stdout);
  145.     (void) putchar('>');
  146.  
  147.     (void) putchar('\'');
  148.     (void) putchar('\n');
  149. }
  150.  
  151. char *                            /* malloced */
  152. getdomainsuf()
  153. {
  154.     register char *line;
  155.     register char *s;
  156. #    define    HAS(s, c)    (strchr(s, c) != NULL)
  157.  
  158.     line = readline(ctlfile("mailname"));
  159.     if (line != NULL) {
  160.         for (s = line; *s != '\0'; s++)
  161.             if (*s == '\t')
  162.                 *s = ' ';
  163.         s = line;
  164.         line = str3save((HAS(s, '@')) ? "%" : "@", s, "");
  165.         free(s);
  166.     } else {
  167.         s = hostname();
  168.         line = str3save("@", s, (HAS(s, '.')) ? "" : ".uucp");
  169.     }
  170.     return line;
  171. }
  172.  
  173. char *                        /* static */
  174. getuserid(pwp)
  175. register struct passwd *pwp;
  176. {
  177.     register char *name;
  178.  
  179.     name = getenv("LOGNAME");
  180.     if (name == NULL)
  181.         name = getenv("USER");
  182.     if (name == NULL)
  183.         name = (pwp == NULL? "nobody": pwp->pw_name);
  184.     return name;
  185. }
  186.  
  187. char *                        /* malloced */
  188. getfullname(pwp)
  189. register struct passwd *pwp;
  190. {
  191.     register char *line, *name;
  192.  
  193.     name = getenv("NAME");
  194.     if (name != NULL)
  195.         return strsave(name);
  196.     else {
  197.         name = str3save(getenv("HOME"), "/", ".name");
  198.         line = readline(name);
  199.         free(name);
  200.         name = (line != NULL? line: strsave(fullname(pwp, usggcos)));
  201.     }
  202.     return name;
  203. }
  204.  
  205. char *                        /* malloced */
  206. getorg()
  207. {
  208.     register char *line;
  209.  
  210.     line = getenv("ORGANIZATION");
  211.     if (line != NULL)
  212.         return strsave(line);
  213.     else {
  214.         line = readline(ctlfile("organization"));    /* american */
  215.         if (line == NULL)
  216.             line = readline(ctlfile("organization")); /* english */
  217.         if (line == NULL)
  218.             line = strsave("");
  219.     }
  220.     return line;
  221. }
  222.  
  223. char *                        /* malloced */
  224. readline(file)
  225. char *file;
  226. {
  227.     register FILE *fp = fopen(file, "r");
  228.     register char *line;
  229.  
  230.     if (fp == NULL)
  231.         return NULL;
  232.     line = fgetms(fp);
  233.     (void) fclose(fp);
  234.     if (line != NULL)
  235.         trim(line);
  236.     return line;
  237. }
  238.  
  239. printvar(var, value)        /* print var='value' with suitable sh quoting */
  240. register char *var, *value;
  241. {
  242.     (void) fputs(var, stdout);
  243.     (void) putchar('=');
  244.     if (*value != '\0') {
  245.         (void) putchar('\'');
  246.         for (; *value != '\0'; value++)
  247.             if (*value == '\'')
  248.                 (void) fputs("'\\''", stdout);
  249.             else
  250.                 (void) putchar(*value);
  251.         (void) putchar('\'');
  252.     }
  253.     (void) putchar('\n');
  254. }
  255.