home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff319.lzh / CNewsSrc / uupc.lzh / uupc / genv.dyna < prev    next >
Text File  |  1990-01-16  |  8KB  |  338 lines

  1. /*     genv.c
  2.  *
  3.  *    Copying and use of this program are controlled by the terms of the
  4.  *    Free Software Foundations GNU Emacs General Public License.
  5.  *
  6.  *    Copyright (C) 1987 Jeff Lydiatt
  7.  *    version        0.1        10 July 87
  8.  *
  9.  *    $Id: genv.dyna,v 1.1 90/01/16 10:30:22 crash Exp Locker: crash $
  10.  */
  11.  
  12. #ifndef lint
  13. static char RCSid[] = "$Id: genv.dyna,v 1.1 90/01/16 10:30:22 crash Exp Locker: crash $";
  14. #endif /* !lint */
  15.  
  16. #include <stdio.h>
  17. #include "genv.h"
  18.  
  19. /* Environment variables are in file "PROFILE" */
  20. #define PROFILE ":usr/lib/uucp/profile"
  21.  
  22. #define SAME    0
  23. #define MAXLINE 255
  24.  
  25. #define DMAILBOX    "mailbox"
  26. #define    DNAME        "noname"
  27. #define    DDOMAIN        "pc.uucp"
  28. #define    DMAILDIR    ":usr/spool/mail"
  29. #define DHOME        ":usr/noname"
  30. #define    DCONFDIR    ":usr/lib/uucp"
  31. #define    DSPOOLDIR    ":usr/spool/uucp"
  32. #define DLOGDIR        ":usr/spool/uucp"
  33. #define DPUBDIR        ":usr/spool/uucppublic"
  34. #define DNEWSSDIR    ":usr/spool/rnews"
  35. #define DTEMPDIR    "RAM:T"
  36. #define    DMAILSERVICE    "host"
  37. #define    DNODENAME    "noname"
  38. #define    DDEVICE        "CON:"
  39. #define    DSPEED        "1200"
  40.  
  41. #define    TFILENAME    "tmpfile"
  42. #define    FILENAME     "%s/%s"
  43.  
  44. #include <stdio.h>
  45. #include <ctype.h>
  46.  
  47. char    *name = NULL;
  48. char    *mailbox = NULL;
  49. char    *home = NULL;
  50. char    *domain = NULL;
  51. char    *maildir = NULL;
  52. char    *confdir = NULL;
  53. char     *spooldir = NULL;
  54. char    *logdir = NULL;
  55. char    *pubdir = NULL;
  56. char    *mailserv = NULL;
  57. char    *nodename = NULL;
  58. char    *device = NULL;
  59. char    *speed = NULL;
  60. char    *tempdir = NULL;
  61.  
  62. /*--------------------------------------------------------------*/
  63. /*    getone: get next character file f.  f already open    */
  64. /*--------------------------------------------------------------*/
  65.  
  66. static int getone( f )
  67. FILE *f;
  68. {
  69.     static char line[256];        /* [FJE] Added "static" */
  70.     static int pos = -1;
  71.     static int len = 0;
  72.  
  73.     if ( ++pos > len || line[pos] == '\0' )  {
  74.         if ( fgets( line, 255, f ) == NULL )
  75.             return EOF;
  76.         pos = -1;
  77.         len = strlen( line );
  78.     }
  79.     return( line[pos] );
  80. }
  81.  
  82. /*--------------------------------------------------------------*/
  83. /*    getsym: get next symbol from file f.  f already open        */
  84. /*--------------------------------------------------------------*/
  85.  
  86. #define ID        1001
  87. #define DELIM    1002
  88. #define STR        1003
  89. #define EOL        1004
  90. #define OTHER    1005
  91. #define UNKNOWN -1000
  92.  
  93. static int getsym( f, sym )
  94. FILE *f;
  95. char *sym;
  96. {
  97.     /*
  98.      * Simple non-reentrant, non-reuseable get next symbol from file f
  99.      *
  100.      * Valid symbols are:
  101.      *            Type    Symbol Returned    Comment
  102.      *
  103.      *    ID        <identifier>    any valid C identifier
  104.      *    DELIM        '='            an equal sign
  105.      *    STR        a string        anything between "" or ''
  106.      *    EOL            '\n'        a newline
  107.      *    EOF                        the end-of-file character
  108.      *    OTHER   a character        anything else
  109.      *
  110.      *    Comments begin with # and are delimited by an end of line
  111.      */
  112.  
  113.     static int lastchar = UNKNOWN;
  114.     int c, delim;
  115.  
  116.     /* strip leading white space */
  117.  
  118.     if ( lastchar != UNKNOWN )
  119.         c = lastchar;
  120.     else
  121.         c = getone( f );
  122.  
  123.     while ( c == ' ' || c == '\t' )
  124.         c = getone( f );
  125.     lastchar = UNKNOWN;
  126.  
  127.     /* Comments are '#' terminated by EOL character */
  128.     if ( c == '#' )
  129.         while ( c != '\n' && c != EOF )
  130.             c = getone( f );
  131.     if ( c == EOF )                            /* End of file? */
  132.         return EOF;
  133.     if ( c == '\n' ) {                        /* End of Line? */
  134.         strcpy( sym, "\n" );
  135.         return EOL;
  136.     }
  137.     if ( c == '=' ) {                        /* Delimiter '='? */
  138.         strcpy( sym, "=" );
  139.         return DELIM;
  140.     }
  141.     if ( c == '\"' || c == '\'' ) {            /* String ? */
  142.         delim = c;
  143.         while ((c = getone( f )) != delim && c != EOF && c != '\n')
  144.             *sym++ = c;
  145.         *sym = '\0';
  146.         c = getone( f );
  147.         return STR;
  148.     }
  149.     if (isalpha( c )) {                        /* Identifier ? */
  150.         *sym++ = c;
  151.         while ( ( c = getone( f )) == '_' || isalnum(c) )
  152.             *sym++ = c;
  153.         *sym = '\0';
  154.         lastchar = c;
  155.         return ID;
  156.     }
  157.     *sym++ = c;
  158.     *sym = '\0';
  159.     return OTHER;
  160. }
  161.  
  162. /*--------------------------------------------------------------*/
  163. /*    xmalloc: Just alloc with die on allocation failure    */
  164. /*--------------------------------------------------------------*/
  165. static char *xmalloc( size )
  166. unsigned int size;
  167. {
  168.     char *malloc();
  169.     register char *p;
  170.  
  171.     if ( (p = malloc( size )) != NULL )
  172.        return p;
  173.  
  174.     fprintf( stderr, "Genv.c: Can't allocated %u bytes\n", size );
  175.     exit( NULL );
  176. }
  177.  
  178. /*--------------------------------------------------------------*/
  179. /*    setenv: insert an environment variable into my list    */
  180. /*--------------------------------------------------------------*/
  181.  
  182. typedef struct environment {
  183.     struct environment *next;
  184.     char *name;
  185.     char *value;
  186. } ENV;
  187.  
  188. static ENV *envList = NULL;
  189.  
  190. static void setenv( var, value )
  191. char *var;
  192. char *value;
  193. {
  194.     register ENV *envframe;
  195.  
  196.     envframe        = (ENV *) xmalloc( sizeof( ENV ));
  197.     envframe->name  = xmalloc( strlen(var)+1 );
  198.     envframe->value = xmalloc( strlen(value)+1 );
  199.     envframe->next  = envList;
  200.     envList            = envframe;
  201.     
  202.     strcpy( envframe->name, var );
  203.     strcpy( envframe->value, value);
  204. }
  205.  
  206. /*--------------------------------------------------------------*/
  207. /*    getenv: get pointer to value of environment variable    */
  208. /*--------------------------------------------------------------*/
  209.  
  210. static char *getenv( var )
  211. char *var;
  212. {
  213.     register ENV *list;
  214.  
  215.     for ( list = envList; list != (ENV *)NULL; list = list->next )
  216.         if ( strcmp( var, list->name ) == SAME )
  217.             return list->value;
  218.  
  219.     return NULL;
  220. }
  221.  
  222. /*--------------------------------------------------------------*/
  223. /*    readenv: read environment from a file.             */
  224. /*--------------------------------------------------------------*/
  225.  
  226. static void readenv()
  227. {
  228.     FILE *f;
  229.     int symval;
  230.     char name[MAXLINE+1], value[MAXLINE+1];
  231.  
  232.     if ( (f = fopen( PROFILE, "r" )) == NULL ) {
  233.         fprintf( stderr, "Can't open profile file \"%s\"\n", PROFILE );
  234.         exit( NULL );
  235.     }
  236.     /*
  237.      *    File is layed out as follows:
  238.      *
  239.      *    <environment variable> '=' <ID> | <STRING> # comment....
  240.      */
  241.     while ( (symval = getsym( f, name )) != EOF ) {
  242.         /* Skip over any comment lines */
  243.         while ( symval == EOL )
  244.             symval = getsym( f, name );
  245.         if ( symval == EOF )
  246.             break;
  247.         if ( symval != ID ) {
  248.             fprintf( stderr, "Bad environment variable name %s\n", name );
  249.             exit( NULL );
  250.         }
  251.         if ( (symval = getsym( f, value )) != DELIM ) {
  252.             fprintf( stderr, "Missing '=' in environment file\n" );
  253.             exit( NULL );
  254.         }
  255.         if ( (symval = getsym( f, value )) != ID && symval != STR ) {
  256.             fprintf( stderr, "missing value in environment file\n");
  257.             exit( NULL );
  258.         }
  259.         setenv( name, value );
  260.     }
  261.     fclose( f );
  262. }
  263.  
  264. /*--------------------------------------------------------------*/
  265. /*    exitenv: free that memory when done!            */
  266. /*--------------------------------------------------------------*/
  267.  
  268. void exitenv()
  269. {
  270.     register ENV *p, *q;    
  271.  
  272.     for ( p = envList; p != NULL; p = q ) {
  273.         free( p->name );
  274.         free( p->value);
  275.         q = p->next;
  276.         free( p );
  277.     }
  278.     envList = NULL;
  279. }
  280.  
  281. static void genv(thename, envname, dflt)
  282. char **thename;
  283. char *envname;
  284. char *dflt;
  285. {
  286.     if ((*thename = getenv( envname )) == NULL) {
  287.         fprintf( stderr, "genv: %s not found, using %s\n", envname, dflt );
  288.         *thename = dflt;
  289.     }
  290. #if 0
  291.     fprintf( stderr, "genv: %s \"%s\"\n", envname, *thename );
  292. #endif
  293. }
  294.  
  295. void loadenv()
  296. {
  297.     readenv();                        /* read the profile from a file */ 
  298.  
  299.     /* get environment var's */
  300.     genv( &name,        NAME,            DNAME );
  301.     genv( &mailbox,        MAILBOX,        DMAILBOX );
  302.     genv( &home,        HOME,            DHOME );
  303.     genv( &domain,        DOMAIN,            DDOMAIN );
  304.     genv( &maildir,        MAILDIR,        DMAILDIR );
  305.     genv( &confdir,        CONFDIR,        DCONFDIR );
  306.     genv( &spooldir,    SPOOLDIR,        DSPOOLDIR );
  307.     genv( &logdir,        LOGDIR,            DLOGDIR );
  308.     genv( &pubdir,        PUBDIR,            DPUBDIR );
  309.     genv( &mailserv,    MAILSERVICE,    DMAILSERVICE );
  310.     genv( &nodename,    NODENAME,        DNODENAME );
  311.     genv( &device,        DEVICE,            DDEVICE );
  312.     genv( &speed,        SPEED,            DSPEED );
  313.     genv( &tempdir,        TEMPDIR,        DTEMPDIR );
  314. }
  315.  
  316. #if 0        /* Needs to be updated via mkfilename() in genv.c */
  317.  
  318. void mkfilename( filename, dirname, name )
  319. char *filename;
  320. char *dirname;
  321. char *name;
  322. {
  323.     sprintf( filename, FILENAME, dirname, name );    
  324.     fprintf( stderr, "New filename %s\n", filename );
  325. }
  326. #endif
  327.  
  328. #ifdef TEST
  329. main()
  330. {
  331.     register ENV *p;    
  332.  
  333.     loadenv();
  334.     for ( p = envList; p != NULL; p = p->next )
  335.         fprintf( stderr, "Name=\"%s\" value=\"%s\"\n", p->name, p->value );
  336. }
  337. #endif
  338.