env_t20.c
上传用户:ycwykj01
上传日期:2007-01-04
资源大小:1819k
文件大小:6k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: Environment routines -- TOPS-20 version
  3.  *
  4.  * Author: Mark Crispin
  5.  * 6158 Lariat Loop NE
  6.  * Bainbridge Island, WA  98110-2098
  7.  * Internet: MRC@Panda.COM
  8.  *
  9.  * Date: 1 August 1988
  10.  * Last Edited: 28 September 1998
  11.  *
  12.  * Copyright 1998 by Mark Crispin
  13.  *
  14.  *  Permission to use, copy, modify, and distribute this software and its
  15.  * documentation for any purpose and without fee is hereby granted, provided
  16.  * that the above copyright notices appear in all copies and that both the
  17.  * above copyright notices and this permission notice appear in supporting
  18.  * documentation, and that the name of Mark Crispin not be used in advertising
  19.  * or publicity pertaining to distribution of the software without specific,
  20.  * written prior permission.  This software is made available "as is", and
  21.  * MARK CRISPIN DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
  22.  * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF
  23.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL
  24.  * MARK CRISPIN BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES
  25.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  26.  * WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT
  27.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
  28.  * THIS SOFTWARE.
  29.  *
  30.  */
  31. /* Dedication:
  32.  * This file is dedicated with affection to the TOPS-20 operating system, which
  33.  * set standards for user and programmer friendliness that have still not been
  34.  * equaled by more `modern' operating systems.
  35.  * Wasureru mon ka!!!!
  36.  */
  37. /* c-client environment parameters */
  38. static char *myUserName = NIL; /* user name */
  39. static char *myHomeDir = NIL; /* home directory name */
  40. static char *myLocalHost = NIL; /* local host name */
  41. static char *myNewsrc = NIL; /* newsrc file name */
  42. /* Environment manipulate parameters
  43.  * Accepts: function code
  44.  *     function-dependent value
  45.  * Returns: function-dependent return value
  46.  */
  47. void *env_parameters (long function,void *value)
  48. {
  49.   switch ((int) function) {
  50.   case SET_USERNAME:
  51.     if (myUserName) fs_give ((void **) &myUserName);
  52.     myUserName = cpystr ((char *) value);
  53.     break;
  54.   case GET_USERNAME:
  55.     value = (void *) myUserName;
  56.     break;
  57.   case SET_HOMEDIR:
  58.     if (myHomeDir) fs_give ((void **) &myHomeDir);
  59.     myHomeDir = cpystr ((char *) value);
  60.     break;
  61.   case GET_HOMEDIR:
  62.     value = (void *) myHomeDir;
  63.     break;
  64.   case SET_LOCALHOST:
  65.     if (myLocalHost) fs_give ((void **) &myLocalHost);
  66.     myLocalHost = cpystr ((char *) value);
  67.     break;
  68.   case GET_LOCALHOST:
  69.     value = (void *) myLocalHost;
  70.     break;
  71.   case SET_NEWSRC:
  72.     if (myNewsrc) fs_give ((void **) &myNewsrc);
  73.     myNewsrc = cpystr ((char *) value);
  74.     break;
  75.   case GET_NEWSRC:
  76.     value = (void *) myNewsrc;
  77.     break;
  78.   default:
  79.     value = NIL; /* error case */
  80.     break;
  81.   }
  82.   return value;
  83. }
  84. /* Write current time in RFC 822 format
  85.  * Accepts: destination string
  86.  */
  87. void rfc822_date (char *date)
  88. {
  89.   int zone;
  90.   char *zonename;
  91.   struct tm *t;
  92.   struct timeval tv;
  93.   struct timezone tz;
  94.   gettimeofday (&tv,&tz); /* get time and timezone poop */
  95.   t = localtime (&tv.tv_sec); /* convert to individual items */
  96.   zone = -tz.tz_minuteswest; /* TOPS-20 doesn't have tm_gmtoff or tm_zone */
  97.   zonename = timezone (tz.tz_minuteswest,t->tm_isdst);
  98. /* and output it */
  99.   sprintf (date,"%s, %d %s %d %02d:%02d:%02d %+03d%02d (%s)",
  100.    days[t->tm_wday],t->tm_mday,months[t->tm_mon],t->tm_year+1900,
  101.    t->tm_hour,t->tm_min,t->tm_sec,
  102.    (t->tm_isdst ? 1 : 0) + zone/60,abs (zone) % 60,zonename);
  103. }
  104. /* Write current time in internal format
  105.  * Accepts: destination string
  106.  */
  107. void internal_date (char *date)
  108. {
  109.   int zone;
  110.   struct tm *t;
  111.   struct timeval tv;
  112.   struct timezone tz;
  113.   gettimeofday (&tv,&tz); /* get time and timezone poop */
  114.   t = localtime (&tv.tv_sec); /* convert to individual items */
  115.   zone = -tz.tz_minuteswest; /* TOPS-20 doesn't have tm_gmtoff or tm_zone */
  116. /* and output it */
  117.   sprintf (date,"%2d-%s-%d %02d:%02d:%02d %+03d%02d",
  118.    t->tm_mday,months[t->tm_mon],t->tm_year+1900,
  119.    t->tm_hour,t->tm_min,t->tm_sec,
  120.    (t->tm_isdst ? 1 : 0) + zone/60,abs (zone) % 60);
  121. }
  122. /* Return my user name
  123.  * Accepts: pointer to optional flags
  124.  * Returns: my user name
  125.  */
  126. char *myusername_full (unsigned long *flags)
  127. {
  128.   if (!myUserName) { /* get user name if don't have it yet */
  129.     char tmp[MAILTMPLEN];
  130.     int argblk[5],i;
  131.     jsys (GJINF,argblk); /* get job poop */
  132.     if (!(i = argblk[1])) { /* remember user number */
  133.       if (flags) *flags = MU_NOTLOGGEDIN;
  134.       return "SYSTEM"; /* not logged in */
  135.     }
  136.     argblk[1] = (int) (tmp-1); /* destination */
  137.     argblk[2] = i; /* user number */
  138.     jsys (DIRST,argblk); /* get user name string */
  139.     myUserName = cpystr (tmp); /* copy user name */
  140.     argblk[1] = 0; /* no flags */
  141.     argblk[2] = i; /* user number */
  142.     argblk[3] = 0; /* no stepping */
  143.     jsys (RCDIR,argblk); /* get home directory */
  144.     argblk[1] = (int) (tmp-1); /* destination */
  145.     argblk[2] = argblk[3]; /* home directory number */
  146.     jsys (DIRST,argblk); /* get home directory string */
  147.     myHomeDir = cpystr (tmp); /* copy home directory */
  148.     if (!myNewsrc) { /* set news file name if not defined */
  149.       sprintf (tmp,"%sNEWSRC",myhomedir ());
  150.       myNewsrc = cpystr (tmp);
  151.     }
  152.     if (flags) *flags = MU_LOGGEDIN;
  153.   }
  154.   return myUserName;
  155. }
  156. /* Return my local host name
  157.  * Returns: my local host name
  158.  */
  159. char *mylocalhost ()
  160. {
  161.   if (!myLocalHost) { /* initialize if first time */
  162.     char tmp[MAILTMPLEN];
  163.     int argblk[5];
  164.     argblk[1] = _GTHNS; /* convert number to string */
  165.     argblk[2] = (int) (tmp-1);
  166.     argblk[3] = -1; /* want local host */
  167.     if (!jsys (GTHST,argblk)) strcpy (tmp,"LOCAL");
  168.     myLocalHost = cpystr (tmp);
  169.   }
  170.   return myLocalHost;
  171. }
  172. /* Return my home directory name
  173.  * Returns: my home directory name
  174.  */
  175. char *myhomedir ()
  176. {
  177.   if (!myHomeDir) myusername ();/* initialize if first time */
  178.   return myHomeDir ? myHomeDir : "";
  179. }
  180. /* Determine default prototype stream to user
  181.  * Accepts: type (NIL for create, T for append)
  182.  * Returns: default prototype stream
  183.  */
  184. MAILSTREAM *default_proto (long type)
  185. {
  186.   return NIL; /* no default prototype */
  187. }
  188. /* Emulator for BSD syslog() routine
  189.  * Accepts: priority
  190.  *     message
  191.  *     parameters
  192.  */
  193. void syslog (int priority,const char *message,...)
  194. {
  195. }
  196. /* Emulator for BSD openlog() routine
  197.  * Accepts: identity
  198.  *     options
  199.  *     facility
  200.  */
  201. void openlog (const char *ident,int logopt,int facility)
  202. {
  203. }