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

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: DOS 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: 10 June 1999
  14.  *
  15.  * Copyright 1999 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 *myLocalHost = NIL; /* local host name */
  36. static char *myClientHost = NIL;/* client host name */
  37. static char *myServerHost = NIL;/* server host name */
  38. static char *myHomeDir = NIL; /* home directory name */
  39. static char *myNewsrc = NIL; /* newsrc file name */
  40. static long list_max_level = 5; /* maximum level of list recursion */
  41. /* home namespace */
  42. static NAMESPACE nshome = {"",'\',NIL,NIL};
  43. /* namespace list */
  44. static NAMESPACE *nslist[3] = {&nshome,NIL,NIL};
  45. #include "write.c" /* include safe writing routines */
  46. /* Dummy definitions to prevent errors */
  47. #define server_login(user,pass,argc,argv) NIL
  48. #define myusername() ""
  49. #define MD5ENABLE "\.nosuch.."
  50. /* Get all authenticators */
  51. #include "auths.c"
  52. /* Environment manipulate parameters
  53.  * Accepts: function code
  54.  *     function-dependent value
  55.  * Returns: function-dependent return value
  56.  */
  57. void *env_parameters (long function,void *value)
  58. {
  59.   switch ((int) function) {
  60.   case SET_NAMESPACE:
  61.     fatal ("SET_NAMESPACE not permitted");
  62.   case GET_NAMESPACE:
  63.     value = (void *) nslist;
  64.     break;
  65.   case SET_HOMEDIR:
  66.     myHomeDir = cpystr ((char *) value);
  67.     break;
  68.   case GET_HOMEDIR:
  69.     value = (void *) myHomeDir;
  70.     break;
  71.   case SET_LOCALHOST:
  72.     myLocalHost = cpystr ((char *) value);
  73.     break;
  74.   case GET_LOCALHOST:
  75.     value = (void *) myLocalHost;
  76.     break;
  77.   case SET_NEWSRC:
  78.     if (myNewsrc) fs_give ((void **) &myNewsrc);
  79.     myNewsrc = cpystr ((char *) value);
  80.     break;
  81.   case GET_NEWSRC:
  82.     if (!myNewsrc) { /* set news file name if not defined */
  83.       char tmp[MAILTMPLEN];
  84.       sprintf (tmp,"%s\NEWSRC",myhomedir ());
  85.       myNewsrc = cpystr (tmp);
  86.     }
  87.     value = (void *) myNewsrc;
  88.     break;
  89.   case SET_LISTMAXLEVEL:
  90.     list_max_level = (long) value;
  91.     break;
  92.   case GET_LISTMAXLEVEL:
  93.     value = (void *) list_max_level;
  94.     break;
  95.   default:
  96.     value = NIL; /* error case */
  97.     break;
  98.   }
  99.   return value;
  100. }
  101. /* Write current time
  102.  * Accepts: destination string
  103.  *     optional format of day-of-week prefix
  104.  *     format of date and time
  105.  *     flag whether to append symbolic timezone
  106.  */
  107. static void do_date (char *date,char *prefix,char *fmt,int suffix)
  108. {
  109.   time_t tn = time (0);
  110.   struct tm *t = gmtime (&tn);
  111.   int zone = t->tm_hour * 60 + t->tm_min;
  112.   int julian = t->tm_yday;
  113.   t = localtime (&tn); /* get local time now */
  114. /* minus UTC minutes since midnight */
  115.   zone = t->tm_hour * 60 + t->tm_min - zone;
  116.   /* julian can be one of:
  117.    *  36x  local time is December 31, UTC is January 1, offset -24 hours
  118.    *    1  local time is 1 day ahead of UTC, offset +24 hours
  119.    *    0  local time is same day as UTC, no offset
  120.    *   -1  local time is 1 day behind UTC, offset -24 hours
  121.    * -36x  local time is January 1, UTC is December 31, offset +24 hours
  122.    */
  123.   if (julian = t->tm_yday -julian)
  124.     zone += ((julian < 0) == (abs (julian) == 1)) ? -24*60 : 24*60;
  125.   if (prefix) { /* want day of week? */
  126.     sprintf (date,prefix,days[t->tm_wday]);
  127.     date += strlen (date); /* make next sprintf append */
  128.   }
  129. /* output the date */
  130.   sprintf (date,fmt,t->tm_mday,months[t->tm_mon],t->tm_year+1900,
  131.    t->tm_hour,t->tm_min,t->tm_sec,zone/60,abs (zone) % 60);
  132.   if (suffix) { /* append timezone suffix if desired */
  133.     tzset (); /* get timezone from TZ environment stuff */
  134.     sprintf (date + strlen (date)," (%s)",
  135.      tzname[daylight ? (((struct tm *) t)->tm_isdst > 0) : 0]);
  136.   }
  137. }
  138. /* Write current time in RFC 822 format
  139.  * Accepts: destination string
  140.  */
  141. void rfc822_date (char *date)
  142. {
  143.   do_date (date,"%s, ","%d %s %d %02d:%02d:%02d %+03d%02d",T);
  144. }
  145. /* Write current time in internal format
  146.  * Accepts: destination string
  147.  */
  148. void internal_date (char *date)
  149. {
  150.   do_date (date,NIL,"%02d-%s-%d %02d:%02d:%02d %+03d%02d",NIL);
  151. }
  152. /* Return my home directory name
  153.  * Returns: my home directory name
  154.  */
  155. char *myhomedir ()
  156. {
  157.   int i;
  158.   char *s;
  159.   if (!myHomeDir) { /* get home directory name if not yet known */
  160.     i = strlen (myHomeDir = cpystr ((s = getenv ("HOME")) ? s : ""));
  161.     if (i && ((myHomeDir[i-1] == '\') || (myHomeDir[i-1]=='/')))
  162.       myHomeDir[i-1] = ''; /* tie off trailing directory delimiter */
  163.   }
  164.   return myHomeDir;
  165. }
  166. /* Return mailbox file name
  167.  * Accepts: destination buffer
  168.  *     mailbox name
  169.  * Returns: file name
  170.  */
  171. char *mailboxfile (char *dst,char *name)
  172. {
  173.   char *s;
  174.   char *ext = (char *) mail_parameters (NIL,GET_EXTENSION,NIL);
  175. /* forbid extraneous extensions */
  176.   if ((s = strchr ((s = strrchr (name,'\')) ? s : name,'.')) &&
  177.       ((ext = (char *) mail_parameters (NIL,GET_EXTENSION,NIL)) ||
  178.        strchr (s+1,'.'))) return NIL;
  179. /* absolute path name? */
  180.   if ((*name == '\') || (name[1] == ':')) strcpy (dst,name);
  181.   else sprintf (dst,"%s\%s",myhomedir (),name);
  182.   if (ext) sprintf (dst + strlen (dst),".%s",ext);
  183.   return ucase (dst);
  184. }
  185. /* Determine default prototype stream to user
  186.  * Accepts: type (NIL for create, T for append)
  187.  * Returns: default prototype stream
  188.  */
  189. MAILSTREAM *default_proto (long type)
  190. {
  191.   extern MAILSTREAM DEFAULTPROTO;
  192.   return &DEFAULTPROTO; /* return default driver's prototype */
  193. }
  194. /* Global data */
  195. static unsigned rndm = 0; /* initial `random' number */
  196. /* Return random number
  197.  */
  198. long random ()
  199. {
  200.   if (!rndm) srand (rndm = (unsigned) time (0L));
  201.   return (long) rand ();
  202. }
  203. /* Default mailgets routine on DOS
  204.  * Accepts: readin function pointer
  205.  *     stream to use
  206.  *     number of bytes
  207.  *     identifier data
  208.  * Returns: string read in, truncated if necessary
  209.  *
  210.  * This is a sample mailgets routine.  It simply truncates any data larger
  211.  * than 63K.  On most systems, you generally don't use a mailgets
  212.  * routine at all, but on DOS it's required to prevent the application from
  213.  * crashing.
  214.  */
  215. static char *dos_gets_buf = NIL;
  216. char *dos_default_gets (readfn_t f,void *stream,unsigned long size,
  217. GETS_DATA *md)
  218. {
  219.   readprogress_t *rp = mail_parameters (NIL,GET_READPROGRESS,NIL);
  220.   char *ret,tmp[MAILTMPLEN+1];
  221.   unsigned long i,j,dsc,rdi = 0;
  222.   unsigned long dos_max = 63 * 1024;
  223.   if (!dos_gets_buf) /* one-time initialization */
  224.     dos_gets_buf = (char *) fs_get ((size_t) dos_max + 1);
  225.   ret = (md->flags & MG_COPY) ?
  226.     ((char *) fs_get ((size_t) size + 1)) : dos_gets_buf;
  227.   if (size > dos_max) {
  228.     sprintf (tmp,"Mailbox %s, %s %lu[%.80s], %lu octets truncated to %ld",
  229.      md->stream->mailbox,(md->flags & MG_UID) ? "UID" : "#",
  230.      md->msgno,md->what,size,(long) dos_max);
  231.     mm_log (tmp,WARN); /* warn user */
  232.     dsc = size - dos_max; /* number of bytes to discard */
  233.     size = dos_max; /* maximum length string we can read */
  234.   }
  235.   else dsc = 0; /* nothing to discard */
  236.   dos_gets_buf[size] = ''; /* tie off string */
  237.   if (rp) for (i = size; j = min ((long) MAILTMPLEN,(long) i); i -= j) {
  238.     (*f) (stream,j,ret + rdi);
  239.     (*rp) (md,rdi += j);
  240.   }
  241.   else (*f) (stream,size,dos_gets_buf);
  242. /* toss out everything after that */
  243.   for (i = dsc; j = min ((long) MAILTMPLEN,(long) i); i -= j) {
  244.     (*f) (stream,j,tmp);
  245.     if (rp) (*rp) (md,rdi += j);
  246.   }
  247.   return ret;
  248. }
  249. /* Emulator for BSD syslog() routine
  250.  * Accepts: priority
  251.  *     message
  252.  *     parameters
  253.  */
  254. void syslog (int priority,const char *message,...)
  255. {
  256. }
  257. /* Emulator for BSD openlog() routine
  258.  * Accepts: identity
  259.  *     options
  260.  *     facility
  261.  */
  262. void openlog (const char *ident,int logopt,int facility)
  263. {
  264. }