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

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: WCE environment routines
  3.  *
  4.  * Author: Mark Crispin
  5.  * Networks and Distributed Computing
  6.  * Computing & Communications
  7.  * University of Washington
  8.  * Administration Building, AG-44
  9.  * Seattle, WA  98195
  10.  * Internet: MRC@CAC.Washington.EDU
  11.  *
  12.  * Date: 1 August 1988
  13.  * Last Edited: 28 September 1998
  14.  *
  15.  * Copyright 1998 by the University of Washington
  16.  *
  17.  *  Permission to use, copy, modify, and distribute this software and its
  18.  * documentation for any purpose and without fee is hereby granted, provided
  19.  * that the above copyright notice appears in all copies and that both the
  20.  * above copyright notice and this permission notice appear in supporting
  21.  * documentation, and that the name of the University of Washington not be
  22.  * used in advertising or publicity pertaining to distribution of the software
  23.  * without specific, written prior permission.  This software is made available
  24.  * "as is", and
  25.  * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
  26.  * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
  27.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
  28.  * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
  29.  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  30.  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
  31.  * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
  32.  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  33.  *
  34.  */
  35. static char *myUserName = NIL; /* user name */
  36. static char *myLocalHost = NIL; /* local host name */
  37. static char *myClientHost = NIL;/* client host name */
  38. static char *myServerHost = NIL;/* server host name */
  39. static char *myHomeDir = NIL; /* home directory name */
  40. static char *myNewsrc = NIL; /* newsrc file name */
  41. static char *sysInbox = NIL; /* system inbox name */
  42. static long list_max_level = 5; /* maximum level of list recursion */
  43. /* home namespace */
  44. static NAMESPACE nshome = {"",'\',NIL,NIL};
  45. /* namespace list */
  46. static NAMESPACE *nslist[3] = {&nshome,NIL,NIL};
  47. static long alarm_countdown = 0;/* alarm count down */
  48. static void (*alarm_rang) (); /* alarm interrupt function */
  49. static unsigned int rndm = 0; /* initial `random' number */
  50. /* Dummy definitions to prevent errors */
  51. #define server_login(user,pass,argc,argv) NIL
  52. #define myusername() ""
  53. #deinfe MD5ENABLE "\.nosuch.."
  54. /* Environment manipulate parameters
  55.  * Accepts: function code
  56.  *     function-dependent value
  57.  * Returns: function-dependent return value
  58.  */
  59. void *env_parameters (long function,void *value)
  60. {
  61.   switch ((int) function) {
  62.   case SET_NAMESPACE:
  63.     fatal ("SET_NAMESPACE not permitted");
  64.   case GET_NAMESPACE:
  65.     value = (void *) nslist;
  66.     break;
  67.   case SET_HOMEDIR:
  68.     myHomeDir = cpystr ((char *) value);
  69.     break;
  70.   case GET_HOMEDIR:
  71.     value = (void *) myHomeDir;
  72.     break;
  73.   case SET_LOCALHOST:
  74.     myLocalHost = cpystr ((char *) value);
  75.     break;
  76.   case GET_LOCALHOST:
  77.     value = (void *) myLocalHost;
  78.     break;
  79.   case SET_NEWSRC:
  80.     if (myNewsrc) fs_give ((void **) &myNewsrc);
  81.     myNewsrc = cpystr ((char *) value);
  82.     break;
  83.   case GET_NEWSRC:
  84.     if (!myNewsrc) { /* set news file name if not defined */
  85.       char tmp[MAILTMPLEN];
  86.       sprintf (tmp,"%s\NEWSRC",myhomedir ());
  87.       myNewsrc = cpystr (tmp);
  88.     }
  89.     value = (void *) myNewsrc;
  90.     break;
  91.   case SET_SYSINBOX:
  92.     if (sysInbox) fs_give ((void **) &sysInbox);
  93.     sysInbox = cpystr ((char *) value);
  94.     break;
  95.   case GET_SYSINBOX:
  96.     value = (void *) sysInbox;
  97.     break;
  98.   case SET_LISTMAXLEVEL:
  99.     list_max_level = (long) value;
  100.     break;
  101.   case GET_LISTMAXLEVEL:
  102.     value = (void *) list_max_level;
  103.     break;
  104.   default:
  105.     value = NIL; /* error case */
  106.     break;
  107.   }
  108.   return value;
  109. }
  110. /* Write current time
  111.  * Accepts: destination string
  112.  *     optional format of day-of-week prefix
  113.  *     format of date and time
  114.  *     flag whether to append symbolic timezone
  115.  */
  116. static void do_date (char *date,char *prefix,char *fmt,int suffix)
  117. {
  118.   time_t tn = time (0);
  119.   struct tm *t = gmtime (&tn);
  120.   int zone = t->tm_hour * 60 + t->tm_min;
  121.   int julian = t->tm_yday;
  122.   t = localtime (&tn); /* get local time now */
  123. /* minus UTC minutes since midnight */
  124.   zone = t->tm_hour * 60 + t->tm_min - zone;
  125.   /* julian can be one of:
  126.    *  36x  local time is December 31, UTC is January 1, offset -24 hours
  127.    *    1  local time is 1 day ahead of UTC, offset +24 hours
  128.    *    0  local time is same day as UTC, no offset
  129.    *   -1  local time is 1 day behind UTC, offset -24 hours
  130.    * -36x  local time is January 1, UTC is December 31, offset +24 hours
  131.    */
  132.   if (julian = t->tm_yday -julian)
  133.     zone += ((julian < 0) == (abs (julian) == 1)) ? -24*60 : 24*60;
  134.   if (prefix) { /* want day of week? */
  135.     sprintf (date,prefix,days[t->tm_wday]);
  136.     date += strlen (date); /* make next sprintf append */
  137.   }
  138. /* output the date */
  139.   sprintf (date,fmt,t->tm_mday,months[t->tm_mon],t->tm_year+1900,
  140.    t->tm_hour,t->tm_min,t->tm_sec,zone/60,abs (zone) % 60);
  141.   if (suffix) { /* append timezone suffix if desired */
  142.     char *tz;
  143.     tzset (); /* get timezone from TZ environment stuff */
  144.     tz = tzname[daylight ? (((struct tm *) t)->tm_isdst > 0) : 0];
  145.     if (tz && tz[0]) sprintf (date + strlen (date)," (%s)",tz);
  146.   }
  147. }
  148. /* Write current time in RFC 822 format
  149.  * Accepts: destination string
  150.  */
  151. void rfc822_date (char *date)
  152. {
  153.   do_date (date,"%s, ","%d %s %d %02d:%02d:%02d %+03d%02d",T);
  154. }
  155. /* Write current time in internal format
  156.  * Accepts: destination string
  157.  */
  158. void internal_date (char *date)
  159. {
  160.   do_date (date,NIL,"%02d-%s-%d %02d:%02d:%02d %+03d%02d",NIL);
  161. }
  162. /* Return random number
  163.  */
  164. long random ()
  165. {
  166.   if (!rndm) srand (rndm = (unsigned) time (0L));
  167.   return (long) rand ();
  168. }
  169. /* Return default drive
  170.  * Returns: default drive
  171.  */
  172. static char *defaultDrive (void)
  173. {
  174.   char *s;
  175.   return ((s = getenv ("SystemDrive")) && *s) ? s : "C:";
  176. }
  177. /* Return home drive from environment variables
  178.  * Returns: home drive
  179.  */
  180. static char *homeDrive (void)
  181. {
  182.   char *s;
  183.   return ((s = getenv ("HOMEDRIVE")) && *s) ? s : defaultDrive ();
  184. }
  185. /* Return home path from environment variables
  186.  * Accepts: path to write into
  187.  * Returns: home path or NIL if it can't be determined
  188.  */
  189. static char *homePath (char *path)
  190. {
  191.   int i;
  192.   char *s;
  193.   if (!((s = getenv ("HOMEPATH")) && (i = strlen (s)))) return NIL;
  194.   if (((s[i-1] == '\') || (s[i-1] == '/'))) s[i-1] = '';
  195.   sprintf (path,"%s%s",homeDrive (),s);
  196.   return path;
  197. }
  198. /* Return my home directory name
  199.  * Returns: my home directory name
  200.  */
  201. char *myhomedir ()
  202. {
  203.   char tmp[MAILTMPLEN];
  204. /* initialize if first time */
  205.   if (!myHomeDir) myHomeDir = homePath (tmp);
  206.   return myHomeDir ? myHomeDir : homeDrive ();
  207. }
  208. /* Return system standard INBOX
  209.  * Accepts: buffer string
  210.  */
  211. char *sysinbox ()
  212. {
  213.   char tmp[MAILTMPLEN];
  214.   if (!sysInbox) { /* initialize if first time */
  215.     sprintf (tmp,"%s\INBOX",myhomedir ());
  216.     sysInbox = cpystr (tmp); /* system inbox is from mail spool */
  217.   }
  218.   return sysInbox;
  219. }
  220. /* Return mailbox file name
  221.  * Accepts: destination buffer
  222.  *     mailbox name
  223.  * Returns: file name
  224.  */
  225. char *mailboxfile (char *dst,char *name)
  226. {
  227.   char *dir = myhomedir ();
  228.   *dst = ''; /* default to empty string */
  229.   if (((name[0] == 'I') || (name[0] == 'i')) &&
  230.       ((name[1] == 'N') || (name[1] == 'n')) &&
  231.       ((name[2] == 'B') || (name[2] == 'b')) &&
  232.       ((name[3] == 'O') || (name[3] == 'o')) &&
  233.       ((name[4] == 'X') || (name[4] == 'x')) && !name[5]) name = NIL;
  234. /* reject namespace names or names with / */
  235.   if (name && ((*name == '#') || strchr (name,'/'))) return NIL;
  236.   else if (!name) return dst; /* driver selects the INBOX name */
  237. /* absolute path name? */
  238.   else if ((*name == '\') || (name[1] == ':')) return strcpy (dst,name);
  239. /* build resulting name */
  240.   sprintf (dst,"%s\%s",dir,name);
  241.   return dst; /* return it */
  242. }
  243. /* Determine default prototype stream to user
  244.  * Accepts: type (NIL for create, T for append)
  245.  * Returns: default prototype stream
  246.  */
  247. MAILSTREAM *default_proto (long type)
  248. {
  249.   extern MAILSTREAM DEFAULTPROTO;
  250.   return &DEFAULTPROTO; /* return default driver's prototype */
  251. }
  252. /* Emulator for BSD syslog() routine
  253.  * Accepts: priority
  254.  *     message
  255.  *     parameters
  256.  */
  257. void syslog (int priority,const char *message,...)
  258. {
  259. }
  260. /* Emulator for BSD openlog() routine
  261.  * Accepts: identity
  262.  *     options
  263.  *     facility
  264.  */
  265. void openlog (const char *ident,int logopt,int facility)
  266. {
  267. }