home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / UUCPBB21 / uucpbb21.lzh / UUCPBB21 / getenv.c < prev    next >
Text File  |  1994-09-25  |  6KB  |  192 lines

  1. /*  getenv.c   This routine gives pseudo-environment variables for the CoCo.
  2.     Copyright (C) 1993 Bob Billson
  3.  
  4.     This file is part of the OS-9 UUCP package, UUCPbb.
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.     The author of UUCPbb, Bob Billson, can be contacted at:
  21.     bob@kc2wz.bubble.org  or  uunet!kc2wz!bob  or  by snail mail:
  22.     21 Bates Way, Westfield, NJ 07090
  23. */
  24.  
  25. /* This is a combination of Brad Spencer's and Boisy Pitre's getenv.c.  Until
  26.    Level 2 has real environmental variables, this will have to do.
  27.  
  28.    The system defaults are found in the file /dd/sys/profile.  The form is:
  29.    <env_variable>=<data>.  For example:
  30.  
  31.    HOME=/dd/user
  32.    MAIL=/h1/spool/mail
  33.    TERM=coco3
  34.    SHELL=shell
  35.  
  36.    There cannnot be any spaces between <env_variable> and '='.  Each line must
  37.    be terminated with a carriage return.  A pointer to the string starting
  38.    immediately to the right of the '=' is returned if the variable is defined.
  39.    NULL is returned if the variable is undefined.  The default environment
  40.    file must exist, though it can be empty or a NULL is returned.
  41.  
  42.    getenv() first searches /DD/SYS/profile for any matches.  It then tries to
  43.    open the file 'profile' in the user's home directory as defined in the
  44.    password file.  If the file exists and it contains an identical
  45.    environment variable, this will be used instead of the system default.
  46.    There are two exceptions to this: the environment variables MAIL and LOGDIR
  47.    may only be defined in /DD/SYS/profile.  The user's personal profile file
  48.    is not checked.
  49.  
  50.    All returned strings have the carriage return removed and are
  51.    NULL-terminated.  The default system and user environment file names can be
  52.    changed by changing two #defines below.
  53.  
  54.    The data pointed to by the returned pointer is only valid until getenv()
  55.    is called again.  Therefore, it is a good idea to copy it to another string
  56.    array before the next call to getenv().
  57.  
  58.      Bob Billson <bob@kc2wz.bubble.org>   1993 Oct 28 */
  59.  
  60. #ifndef _OSK
  61.  
  62. #include "uucp.h"
  63. #include <password.h>
  64.  
  65. #define ENVFILE  "/dd/sys/profile"
  66. #define USERENV  "profile"
  67.  
  68. static char buf[100];
  69.  
  70.  
  71. char *getenv (var)
  72. char *var;
  73. {
  74.      char buf2[80];
  75.      FILE *f;
  76.      unsigned ouid, setnuid();
  77.      char *home,           
  78.           *homeenv,
  79.           *envfile = ENVFILE,
  80.           *userenv = USERENV,
  81.           *bptr2;
  82.      PWENT *pwentry;
  83.      register char *bptr;
  84.      char *lookformatch();
  85.  
  86.      bptr = (char *)NULL;
  87.      home = (char *)NULL;
  88.      bptr2 = (char *)NULL;
  89.      ouid = setnuid (0);
  90.  
  91.      /* get the default environment */
  92.      if ((f = fopen (envfile, "r")) == NULL)
  93.           return ((char*)NULL);
  94.  
  95.      bptr = lookformatch (f, var, buf, sizeof (buf));
  96.  
  97.      /* MAIL and LOGDIR may only be defined in /DD/SYS/profile */
  98.      if ((strcmp (var, "MAIL") == 0)  ||  (strcmp (var, "LOGDIR") == 0))
  99.        {
  100.           setnuid (ouid);
  101.  
  102.           if (bptr != NULL)
  103.                return (bptr);
  104.           else
  105.                return ((char*)NULL);
  106.        }
  107.  
  108.      pwentry = getpwuid (ouid);
  109.      setnuid (ouid);
  110.      endpwent();
  111.  
  112.      if (pwentry == (PWENT *)ERROR  ||  pwentry == NULL)
  113.           return (bptr);
  114.  
  115.      if (strcmp (var, "HOME") == 0)
  116.           if (bptr != NULL)
  117.             {
  118.                strcat (strcat (bptr, "/"), pwentry->unam);
  119.                return (bptr);
  120.             }
  121.           else
  122.             {
  123.                /* no system HOME defined?  Use the password file entry */
  124.                strcpy (buf, pwentry->udat);
  125.                return (buf);
  126.             }
  127.  
  128.      /* see if the user has an environment file in their home directory */
  129.      strcpy (buf2, pwentry->udat);
  130.      home = buf2;
  131.      homeenv = (char *) malloc (strlen (home) + strlen (userenv) + 5);
  132.  
  133.      if (homeenv == NULL)
  134.           return (bptr);
  135.  
  136.      sprintf (homeenv, "%s/%s", home, userenv);
  137.  
  138.      if ((f = fopen (homeenv, "r")) == NULL)
  139.        {
  140.           free (homeenv);
  141.           return (bptr);
  142.        }
  143.  
  144.      free (homeenv);
  145.      bptr2 = lookformatch (f, var, buf2, sizeof (buf2));
  146.  
  147.      /* if user environment exists it overwrites default */
  148.      if (bptr2 != NULL)
  149.        {
  150.           strcpy (buf, bptr2);
  151.           bptr = buf;
  152.        }
  153.      return (bptr);
  154. }
  155.  
  156.  
  157.  
  158. char *lookformatch (fp, var, buff, bufsize)
  159. FILE *fp;
  160. char *var, *buff;
  161. int bufsize;
  162. {
  163.      register char *bptr;
  164.      int varlen = strlen (var);
  165.  
  166.      while (mfgets (buff, bufsize, fp) != 0)
  167.           if (strncmp (buff, var, varlen) == 0)
  168.                if ((bptr = strchr (buff, '=')) != NULL)
  169.                  {
  170.                     fclose (fp);
  171.                     return (++bptr);
  172.                  }
  173.      fclose (fp);
  174.      return ((char *)NULL);
  175. }
  176.  
  177.  
  178.  
  179. /* set uid to id passed us.  Returns old uid. */
  180.  
  181. unsigned setnuid (newuid)
  182. unsigned newuid;
  183. {
  184.      unsigned olduid;
  185.  
  186.      /* remember who we are */
  187.      olduid = getuid();
  188.      asetuid (newuid);
  189.      return (olduid);
  190. }
  191. #endif
  192.