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

网络编程

开发平台:

Unix_Linux

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