⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dummydos.c

📁 mgcp协议源代码。支持多种编码:g711
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Program:	Dummy routines for DOS * * Author:	Mark Crispin *		Networks and Distributed Computing *		Computing & Communications *		University of Washington *		Administration Building, AG-44 *		Seattle, WA  98195 *		Internet: MRC@CAC.Washington.EDU * * Date:	24 May 1993 * Last Edited:	28 August 2000 * * Copyright 2000 by the University of Washington * *  Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appears in all copies and that both the * above copyright notice and this permission notice appear in supporting * documentation, and that the name of the University of Washington not be * used in advertising or publicity pertaining to distribution of the software * without specific, written prior permission.  This software is made * available "as is", and * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */#include <ctype.h>#include <errno.h>#include <fcntl.h>#include "mail.h"#include "osdep.h"#include <sys\stat.h>#include <dos.h>#include "dummy.h"#include "misc.h"long dummy_badname (char *tmp,char *s);/* Dummy routines *//* Driver dispatch used by MAIL */DRIVER dummydriver = {  "dummy",			/* driver name */  DR_LOCAL|DR_MAIL,		/* driver flags */  (DRIVER *) NIL,		/* next driver */  dummy_valid,			/* mailbox is valid for us */  dummy_parameters,		/* manipulate parameters */  dummy_scan,			/* scan mailboxes */  dummy_list,			/* list mailboxes */  dummy_lsub,			/* list subscribed mailboxes */  dummy_subscribe,		/* subscribe to mailbox */  NIL,				/* unsubscribe from mailbox */  dummy_create,			/* create mailbox */  dummy_delete,			/* delete mailbox */  dummy_rename,			/* rename mailbox */  NIL,				/* status of mailbox */  dummy_open,			/* open mailbox */  dummy_close,			/* close mailbox */  NIL,				/* fetch message "fast" attributes */  NIL,				/* fetch message flags */  NIL,				/* fetch overview */  NIL,				/* fetch message structure */  NIL,				/* fetch header */  NIL,				/* fetch text */  NIL,				/* fetch message data */  NIL,				/* unique identifier */  NIL,				/* message number from UID */  NIL,				/* modify flags */  NIL,				/* per-message modify flags */  NIL,				/* search for message based on criteria */  NIL,				/* sort messages */  NIL,				/* thread messages */  dummy_ping,			/* ping mailbox to see if still alive */  dummy_check,			/* check for new messages */  dummy_expunge,		/* expunge deleted messages */  dummy_copy,			/* copy messages to another mailbox */  dummy_append,			/* append string message to mailbox */  NIL				/* garbage collect stream */};				/* prototype stream */MAILSTREAM dummyproto = {&dummydriver};				/* driver parameters */static char *file_extension = NIL;/* Dummy validate mailbox * Accepts: mailbox name * Returns: our driver if name is valid, NIL otherwise */DRIVER *dummy_valid (char *name){  char *s,tmp[MAILTMPLEN];  struct stat sbuf;				/* must be valid local mailbox */  return (name && *name && (*name != '{') &&	  (s = mailboxfile (tmp,name)) && (!*s || !stat (s,&sbuf))) ?	    &dummydriver : NIL;}/* Dummy manipulate driver parameters * Accepts: function code *	    function-dependent value * Returns: function-dependent return value */void *dummy_parameters (long function,void *value){  void *ret = NIL;  switch ((int) function) {  case SET_EXTENSION:    if (file_extension) fs_give ((void **) &file_extension);    if (*(char *) value) file_extension = cpystr ((char *) value);  case GET_EXTENSION:    ret = (void *) file_extension;  }  return ret;}/* Dummy scan mailboxes * Accepts: mail stream *	    reference *	    pattern to search *	    string to scan */#define LISTTMPLEN 128void dummy_scan (MAILSTREAM *stream,char *ref,char *pat,char *contents){  char *s,test[LISTTMPLEN],file[LISTTMPLEN];  long i = 0;  if (!pat || !*pat) {		/* empty pattern? */    if (dummy_canonicalize (test,ref,"*")) {				/* tie off name at root */      if (s = strchr (test,'\\')) *++s = '\0';      else test[0] = '\0';      dummy_listed (stream,'\\',test,LATT_NOINFERIORS,NIL);    }  }				/* get canonical form of name */  else if (dummy_canonicalize (test,ref,pat)) {				/* found any wildcards? */    if (s = strpbrk (test,"%*")) {				/* yes, copy name up to that point */      strncpy (file,test,(size_t) (i = s - test));      file[i] = '\0';		/* tie off */    }    else strcpy (file,test);	/* use just that name then */				/* find directory name */    if (s = strrchr (file,'\\')) {      *++s = '\0';		/* found, tie off at that point */      s = file;    }				/* silly case */    else if (file[0] == '#') s = file;				/* do the work */    dummy_list_work (stream,s,test,contents,0);    if (pmatch ("INBOX",test))	/* always an INBOX */      dummy_listed (stream,NIL,"INBOX",LATT_NOINFERIORS,contents);  }}/* Dummy list mailboxes * Accepts: mail stream *	    reference *	    pattern to search */void dummy_list (MAILSTREAM *stream,char *ref,char *pat){  dummy_scan (stream,ref,pat,NIL);}/* Dummy list subscribed mailboxes * Accepts: mail stream *	    pattern to search */void dummy_lsub (MAILSTREAM *stream,char *ref,char *pat){  void *sdb = NIL;  char *s,*t,test[MAILTMPLEN];  int showuppers = pat[strlen (pat) - 1] == '%';				/* get canonical form of name */  if (dummy_canonicalize (test,ref,pat) && (s = sm_read (&sdb))) do    if (*s != '{') {      if (pmatch_full (s,test,'\\')) {	if (pmatch (s,"INBOX")) mm_lsub (stream,NIL,s,LATT_NOINFERIORS);	else mm_lsub (stream,'\\',s,NIL);      }      else while (showuppers && (t = strrchr (s,'\\'))) {	*t = '\0';		/* tie off the name */	if (pmatch_full (s,test,'\\')) mm_lsub (stream,'\\',s,LATT_NOSELECT);      }    }  while (s = sm_read (&sdb));	/* until no more subscriptions */}/* Dummy subscribe to mailbox * Accepts: mail stream *	    mailbox to add to subscription list * Returns: T on success, NIL on failure */long dummy_subscribe (MAILSTREAM *stream,char *mailbox){  char *s,tmp[MAILTMPLEN];  struct stat sbuf;				/* must be valid local mailbox */  if ((s = mailboxfile (tmp,mailbox)) && *s && !stat (s,&sbuf) &&      ((sbuf.st_mode & S_IFMT) == S_IFREG)) return sm_subscribe (mailbox);  sprintf (tmp,"Can't subscribe %s: not a mailbox",mailbox);  mm_log (tmp,ERROR);  return NIL;}/* Dummy list mailboxes worker routine * Accepts: mail stream *	    directory name to search *	    search pattern *	    string to scan *	    search level */void dummy_list_work (MAILSTREAM *stream,char *dir,char *pat,char *contents,		      long level){  struct find_t f;  struct stat sbuf;  char *s,tmp[LISTTMPLEN],tmpx[LISTTMPLEN];  char *base = (dir && (dir[0] == '\\')) ? NIL : myhomedir ();				/* build name */  if (base) sprintf (tmpx,"%s\\",base);  else tmpx[0] = '\0';  if (dir) strcat (tmpx,dir);				/* punt if bogus name */  if (!mailboxfile (tmp,tmpx)) return;				/* make directory wildcard */  strcat (tmp,(tmp[strlen (tmp) -1] == '\\') ? "*." : "\\*.");  strcat (tmp,file_extension ? file_extension : "*");				/* do nothing if can't open directory */  if (!_dos_findfirst (tmp,_A_NORMAL|_A_SUBDIR,&f)) {				/* list it if not at top-level */    if (!level && dir && pmatch_full (dir,pat,'\\'))      dummy_listed (stream,'\\',dir,LATT_NOSELECT,contents);				/* scan directory */    if (tmpx[strlen (tmpx) - 1] == '\\') do if (*f.name != '.') {      if (base) sprintf (tmpx,"%s\\",base);      else tmpx[0] = '\0';      if (dir) sprintf (tmpx + strlen (tmpx),"%s%s",dir,f.name);      else strcat (tmpx,f.name);      if (!stat (mailboxfile (tmp,tmpx),&sbuf)) {				/* suppress extension */	if (file_extension && (s = strchr (f.name,'.'))) *s = '\0';				/* now make name we'd return */	if (dir) sprintf (tmp,"%s%s",dir,f.name);	else strcpy (tmp,f.name);				/* only interested in file type */	switch (sbuf.st_mode & S_IFMT) {	case S_IFDIR:		/* directory? */	  if (pmatch_full (tmp,pat,'\\')) {	    dummy_listed (stream,'\\',tmp,LATT_NOSELECT,contents);	    strcat (tmp,"\\");	/* set up for dmatch call */	  }				/* try again with trailing / */	  else if (pmatch_full (strcat (tmp,"\\"),pat,'\\'))	    dummy_listed (stream,'\\',tmp,LATT_NOSELECT,contents);	  if (dmatch (tmp,pat,'\\') &&	      (level < (long) mail_parameters (NIL,GET_LISTMAXLEVEL,NIL)))	    dummy_list_work (stream,tmp,pat,contents,level+1);	  break;	case S_IFREG:		/* ordinary name */	  if (pmatch_full (tmp,pat,'\\') && !pmatch ("INBOX",tmp))	    dummy_listed (stream,'\\',tmp,LATT_NOINFERIORS,contents);	  break;	}      }    }    while (!_dos_findnext (&f));  }}/* Mailbox found * Accepts: hierarchy delimiter *	    mailbox name *	    attributes *	    contents to search before calling mm_list() * Returns: T, always */#define BUFSIZE MAILTMPLENlong dummy_listed (MAILSTREAM *stream,char delimiter,char *name,		   long attributes,char *contents){  struct stat sbuf;  int fd;  size_t csiz,ssiz,bsiz;  char *buf,tmp[MAILTMPLEN];  if (contents) {		/* want to search contents? */				/* forget it if can't select or open */    if ((attributes & LATT_NOSELECT) || !(csiz = strlen (contents)) ||	stat (mailboxfile (tmp,name),&sbuf) || (csiz > sbuf.st_size) ||	((fd = open (tmp,O_RDONLY,NIL)) < 0)) return T;				/* get buffer including slop */        buf = (char *) fs_get (BUFSIZE + (ssiz = 4 * ((csiz / 4) + 1)) + 1);    memset (buf,'\0',ssiz);	/* no slop area the first time */    while (sbuf.st_size) {	/* until end of file */      read (fd,buf+ssiz,bsiz = min (sbuf.st_size,BUFSIZE));      if (search ((unsigned char *) buf,bsiz+ssiz,		  (unsigned char *) contents,csiz)) break;      memcpy (buf,buf+BUFSIZE,ssiz);      sbuf.st_size -= bsiz;	/* note that we read that much */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -