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

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: Dummy routines for WCE
  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: 24 May 1993
  13.  * Last Edited: 4 September 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
  24.  * available "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. #include <ctype.h>
  36. #include <stdio.h>
  37. #include <errno.h>
  38. #include <fcntl.h>
  39. #include <direct.h>
  40. #include "mail.h"
  41. #include "osdep.h"
  42. #include <sysstat.h>
  43. #include <dos.h>
  44. #include "dummy.h"
  45. #include "misc.h"
  46. /* Dummy routines */
  47. /* Driver dispatch used by MAIL */
  48. DRIVER dummydriver = {
  49.   "dummy", /* driver name */
  50.   DR_LOCAL|DR_MAIL, /* driver flags */
  51.   (DRIVER *) NIL, /* next driver */
  52.   dummy_valid, /* mailbox is valid for us */
  53.   dummy_parameters, /* manipulate parameters */
  54.   dummy_scan, /* scan mailboxes */
  55.   dummy_list, /* list mailboxes */
  56.   dummy_lsub, /* list subscribed mailboxes */
  57.   NIL, /* subscribe to mailbox */
  58.   NIL, /* unsubscribe from mailbox */
  59.   dummy_create, /* create mailbox */
  60.   dummy_delete, /* delete mailbox */
  61.   dummy_rename, /* rename mailbox */
  62.   NIL, /* status of mailbox */
  63.   dummy_open, /* open mailbox */
  64.   dummy_close, /* close mailbox */
  65.   NIL, /* fetch message "fast" attributes */
  66.   NIL, /* fetch message flags */
  67.   NIL, /* fetch overview */
  68.   NIL, /* fetch message structure */
  69.   NIL, /* fetch header */
  70.   NIL, /* fetch text */
  71.   NIL, /* fetch message data */
  72.   NIL, /* unique identifier */
  73.   NIL, /* message number from UID */
  74.   NIL, /* modify flags */
  75.   NIL, /* per-message modify flags */
  76.   NIL, /* search for message based on criteria */
  77.   NIL, /* sort messages */
  78.   NIL, /* thread messages */
  79.   dummy_ping, /* ping mailbox to see if still alive */
  80.   dummy_check, /* check for new messages */
  81.   dummy_expunge, /* expunge deleted messages */
  82.   dummy_copy, /* copy messages to another mailbox */
  83.   dummy_append, /* append string message to mailbox */
  84.   NIL /* garbage collect stream */
  85. };
  86. /* prototype stream */
  87. MAILSTREAM dummyproto = {&dummydriver};
  88. /* driver parameters */
  89. static char *file_extension = NIL;
  90. /* Dummy validate mailbox
  91.  * Accepts: mailbox name
  92.  * Returns: our driver if name is valid, NIL otherwise
  93.  */
  94. DRIVER *dummy_valid (char *name)
  95. {
  96.   char *s,tmp[MAILTMPLEN];
  97.   struct stat sbuf;
  98. /* must be valid local mailbox */
  99.   return (name && *name && (*name != '{') &&
  100.   (s = mailboxfile (tmp,name)) && (!*s || !stat (s,&sbuf))) ?
  101.     &dummydriver : NIL;
  102. }
  103. /* Dummy manipulate driver parameters
  104.  * Accepts: function code
  105.  *     function-dependent value
  106.  * Returns: function-dependent return value
  107.  */
  108. void *dummy_parameters (long function,void *value)
  109. {
  110.   return value;
  111. }
  112. /* Dummy scan mailboxes
  113.  * Accepts: mail stream
  114.  *     reference
  115.  *     pattern to search
  116.  *     string to scan
  117.  */
  118. void dummy_scan (MAILSTREAM *stream,char *ref,char *pat,char *contents)
  119. {
  120. /* return silently */
  121. }
  122. /* Dummy list mailboxes
  123.  * Accepts: mail stream
  124.  *     reference
  125.  *     pattern to search
  126.  */
  127. void dummy_list (MAILSTREAM *stream,char *ref,char *pat)
  128. {
  129. /* return silently */
  130. }
  131. /* Dummy list subscribed mailboxes
  132.  * Accepts: mail stream
  133.  *     pattern to search
  134.  */
  135. void dummy_lsub (MAILSTREAM *stream,char *ref,char *pat)
  136. {
  137. /* return silently */
  138. }
  139. /* Dummy create mailbox
  140.  * Accepts: mail stream
  141.  *     mailbox name to create
  142.  * Returns: T on success, NIL on failure
  143.  */
  144. long dummy_create (MAILSTREAM *stream,char *mailbox)
  145. {
  146.   return NIL; /* always fails */
  147. }
  148. /* Dummy delete mailbox
  149.  * Accepts: mail stream
  150.  *     mailbox name to delete
  151.  * Returns: T on success, NIL on failure
  152.  */
  153. long dummy_delete (MAILSTREAM *stream,char *mailbox)
  154. {
  155.   return NIL; /* always fails */
  156. }
  157. /* Mail rename mailbox
  158.  * Accepts: mail stream
  159.  *     old mailbox name
  160.  *     new mailbox name
  161.  * Returns: T on success, NIL on failure
  162.  */
  163. long dummy_rename (MAILSTREAM *stream,char *old,char *newname)
  164. {
  165.   return NIL; /* always fails */
  166. }
  167. /* Dummy open
  168.  * Accepts: stream to open
  169.  * Returns: stream on success, NIL on failure
  170.  */
  171. MAILSTREAM *dummy_open (MAILSTREAM *stream)
  172. {
  173.   char tmp[MAILTMPLEN];
  174. /* OP_PROTOTYPE call or silence */
  175.   if (!stream || stream->silent) return NIL;
  176.   if (strcmp (ucase (strcpy (tmp,stream->mailbox)),"INBOX")) {
  177.     sprintf (tmp,"Not a mailbox: %s",stream->mailbox);
  178.     mm_log (tmp,ERROR);
  179.     return NIL; /* always fails */
  180.   }
  181.   if (!stream->silent) { /* only if silence not requested */
  182.     mail_exists (stream,0); /* say there are 0 messages */
  183.     mail_recent (stream,0);
  184.     stream->uid_validity = 1;
  185.   }
  186.   stream->inbox = T; /* note that it's an INBOX */
  187.   return stream; /* return success */
  188. }
  189. /* Dummy close
  190.  * Accepts: MAIL stream
  191.  *     options
  192.  */
  193. void dummy_close (MAILSTREAM *stream,long options)
  194. {
  195. /* return silently */
  196. }
  197. /* Dummy ping mailbox
  198.  * Accepts: MAIL stream
  199.  * Returns: T if stream alive, else NIL
  200.  * No-op for readonly files, since read/writer can expunge it from under us!
  201.  */
  202. long dummy_ping (MAILSTREAM *stream)
  203. {
  204.   return T;
  205. }
  206. /* Dummy check mailbox
  207.  * Accepts: MAIL stream
  208.  * No-op for readonly files, since read/writer can expunge it from under us!
  209.  */
  210. void dummy_check (MAILSTREAM *stream)
  211. {
  212.   dummy_ping (stream); /* invoke ping */
  213. }
  214. /* Dummy expunge mailbox
  215.  * Accepts: MAIL stream
  216.  */
  217. void dummy_expunge (MAILSTREAM *stream)
  218. {
  219. /* return silently */
  220. }
  221. /* Dummy copy message(s)
  222.  * Accepts: MAIL stream
  223.  *     sequence
  224.  *     destination mailbox
  225.  *     options
  226.  * Returns: T if copy successful, else NIL
  227.  */
  228. long dummy_copy (MAILSTREAM *stream,char *sequence,char *mailbox,long options)
  229. {
  230.   if ((options & CP_UID) ? mail_uid_sequence (stream,sequence) :
  231.       mail_sequence (stream,sequence)) fatal ("Impossible dummy_copy");
  232.   return NIL;
  233. }
  234. /* Dummy append message string
  235.  * Accepts: mail stream
  236.  *     destination mailbox
  237.  *     stringstruct of message to append
  238.  * Returns: T on success, NIL on failure
  239.  */
  240. long dummy_append (MAILSTREAM *stream,char *mailbox,char *flags,char *date,
  241.    STRING *message)
  242. {
  243.   char tmp[MAILTMPLEN];
  244.   sprintf (tmp,"Can't append to %s",mailbox);
  245.   mm_log (tmp,ERROR); /* pass up error */
  246.   return NIL; /* always fails */
  247. }
  248. /* Dummy canonicalize name
  249.  * Accepts: buffer to write name
  250.  *     reference
  251.  *     pattern
  252.  * Returns: T if success, NIL if failure
  253.  */
  254. long dummy_canonicalize (char *tmp,char *ref,char *pat)
  255. {
  256.   char dev[4];
  257. /* initially no device */
  258.   dev[0] = dev[1] = dev[2] = dev[3] = '';
  259.   if (ref) switch (*ref) { /* preliminary reference check */
  260.   case '{': /* remote names not allowed */
  261.     return NIL; /* disallowed */
  262.   case '': /* empty reference string */
  263.     break;
  264.   default: /* all other names */
  265.     if (ref[1] == ':') { /* start with device name? */
  266.       dev[0] = *ref++; dev[1] = *ref++;
  267.     }
  268.     break;
  269.   }
  270.   if (pat[1] == ':') { /* device name in pattern? */
  271.     dev[0] = *pat++; dev[1] = *pat++;
  272.     ref = NIL; /* ignore reference */
  273.   }
  274.   switch (*pat) {
  275.   case '#': /* namespace names */
  276.     if (mailboxfile (tmp,pat)) strcpy (tmp,pat);
  277.     else return NIL; /* unknown namespace */
  278.     break;
  279.   case '{': /* remote names not allowed */
  280.     return NIL;
  281.   case '\': /* rooted name */
  282.     ref = NIL; /* ignore reference */
  283.     break;
  284.   }
  285. /* make sure device names are rooted */
  286.   if (dev[0] && (*(ref ? ref : pat) != '\')) dev[2] = '\';
  287. /* build name */
  288.   sprintf (tmp,"%s%s%s",dev,ref ? ref : "",pat);
  289.   ucase (tmp); /* force upper case */
  290.   return T;
  291. }