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

📄 mtxnt.c

📁 mgcp协议源代码。支持多种编码:g711
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Program:	MTX mail routines * * 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:	22 May 1990 * Last Edited:	18 October 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 <stdio.h>#include <ctype.h>#include <errno.h>extern int errno;		/* just in case */#include "mail.h"#include "osdep.h"#include <fcntl.h>#include <time.h>#include <sys/stat.h>#include <sys/utime.h>#include "mtxnt.h"#include "misc.h"#include "dummy.h"/* MTX mail routines *//* Driver dispatch used by MAIL */DRIVER mtxdriver = {  "mtx",			/* driver name */				/* driver flags */  DR_LOCAL|DR_MAIL|DR_CRLF|DR_NOSTICKY,  (DRIVER *) NIL,		/* next driver */  mtx_valid,			/* mailbox is valid for us */  mtx_parameters,		/* manipulate parameters */  mtx_scan,			/* scan mailboxes */  mtx_list,			/* list mailboxes */  mtx_lsub,			/* list subscribed mailboxes */  NIL,				/* subscribe to mailbox */  NIL,				/* unsubscribe from mailbox */  mtx_create,			/* create mailbox */  mtx_delete,			/* delete mailbox */  mtx_rename,			/* rename mailbox */  NIL,				/* status of mailbox */  mtx_open,			/* open mailbox */  mtx_close,			/* close mailbox */  mtx_flags,			/* fetch message "fast" attributes */  mtx_flags,			/* fetch message flags */  NIL,				/* fetch overview */  NIL,				/* fetch message envelopes */  mtx_header,			/* fetch message header */  mtx_text,			/* fetch message body */  NIL,				/* fetch partial message text */  NIL,				/* unique identifier */  NIL,				/* message number */  mtx_flag,			/* modify flags */  mtx_flagmsg,			/* per-message modify flags */  NIL,				/* search for message based on criteria */  NIL,				/* sort messages */  NIL,				/* thread messages */  mtx_ping,			/* ping mailbox to see if still alive */  mtx_check,			/* check for new messages */  mtx_expunge,			/* expunge deleted messages */  mtx_copy,			/* copy messages to another mailbox */  mtx_append,			/* append string message to mailbox */  NIL				/* garbage collect stream */};				/* prototype stream */MAILSTREAM mtxproto = {&mtxdriver};/* MTX mail validate mailbox * Accepts: mailbox name * Returns: our driver if name is valid, NIL otherwise */DRIVER *mtx_valid (char *name){  char tmp[MAILTMPLEN];  return mtx_isvalid (name,tmp) ? &mtxdriver : NIL;}/* MTX mail test for valid mailbox * Accepts: mailbox name * Returns: T if valid, NIL otherwise */int mtx_isvalid (char *name,char *tmp){  int fd;  int ret = NIL;  char *s,file[MAILTMPLEN];  struct stat sbuf;  struct utimbuf times;  errno = EINVAL;		/* assume invalid argument */				/* if file, get its status */  if ((s = mailboxfile (file,name)) && !stat (s,&sbuf) &&      ((sbuf.st_mode & S_IFMT) == S_IFREG)) {    if (!sbuf.st_size)errno = 0;/* empty file */    else if ((fd = open (file,O_BINARY|O_RDONLY,NIL)) >= 0) {      memset (tmp,'\0',MAILTMPLEN);      if ((read (fd,tmp,64) >= 0) && (s = strchr (tmp,'\015')) &&	  (s[1] == '\012')) {	/* valid format? */	*s = '\0';		/* tie off header */				/* must begin with dd-mmm-yy" */	ret = (((tmp[2] == '-' && tmp[6] == '-') ||		(tmp[1] == '-' && tmp[5] == '-')) &&	       (s = strchr (tmp+20,',')) && strchr (s+2,';')) ? T : NIL;      }      else errno = -1;		/* bogus format */      close (fd);		/* close the file */				/* preserve atime and mtime */      times.actime = sbuf.st_atime;      times.modtime = sbuf.st_mtime;      utime (file,&times);	/* set the times */    }  }				/* in case INBOX but not mtx format */  else if ((errno == ENOENT) && ((name[0] == 'I') || (name[0] == 'i')) &&	   ((name[1] == 'N') || (name[1] == 'n')) &&	   ((name[2] == 'B') || (name[2] == 'b')) &&	   ((name[3] == 'O') || (name[3] == 'o')) &&	   ((name[4] == 'X') || (name[4] == 'x')) && !name[5]) errno = -1;  return ret;			/* return what we should */}/* MTX manipulate driver parameters * Accepts: function code *	    function-dependent value * Returns: function-dependent return value */void *mtx_parameters (long function,void *value){  return NIL;}/* MTX mail scan mailboxes * Accepts: mail stream *	    reference *	    pattern to search *	    string to scan */void mtx_scan (MAILSTREAM *stream,char *ref,char *pat,char *contents){  if (stream) dummy_scan (NIL,ref,pat,contents);}/* MTX mail list mailboxes * Accepts: mail stream *	    reference *	    pattern to search */void mtx_list (MAILSTREAM *stream,char *ref,char *pat){  if (stream) dummy_list (NIL,ref,pat);}/* MTX mail list subscribed mailboxes * Accepts: mail stream *	    reference *	    pattern to search */void mtx_lsub (MAILSTREAM *stream,char *ref,char *pat){  if (stream) dummy_lsub (NIL,ref,pat);}/* MTX mail create mailbox * Accepts: MAIL stream *	    mailbox name to create * Returns: T on success, NIL on failure */long mtx_create (MAILSTREAM *stream,char *mailbox){  return dummy_create (stream,mailbox);}/* MTX mail delete mailbox * Accepts: MAIL stream *	    mailbox name to delete * Returns: T on success, NIL on failure */long mtx_delete (MAILSTREAM *stream,char *mailbox){  return mtx_rename (stream,mailbox,NIL);}/* MTX mail rename mailbox * Accepts: MAIL stream *	    old mailbox name *	    new mailbox name (or NIL for delete) * Returns: T on success, NIL on failure */long mtx_rename (MAILSTREAM *stream,char *old,char *newname){  long ret = T;  char c,*s,tmp[MAILTMPLEN],file[MAILTMPLEN],lock[MAILTMPLEN];  int ld;  int fd = open (mailboxfile (file,old),O_BINARY|O_RDWR,NIL);  struct stat sbuf;  if (fd < 0) {			/* open mailbox */    sprintf (tmp,"Can't open mailbox %.80s: %s",old,strerror (errno));    mm_log (tmp,ERROR);    return NIL;  }				/* get exclusive parse/append permission */  if ((ld = lockname (lock,old,LOCK_EX)) < 0) {    mm_log ("Unable to lock rename mailbox",ERROR);    return NIL;  }				/* lock out other users */  if (flock (fd,LOCK_EX|LOCK_NB)) {    close (fd);			/* couldn't lock, give up on it then */    sprintf (tmp,"Mailbox %.80s is in use by another process",old);    mm_log (tmp,ERROR);    unlockfd (ld,lock);		/* release exclusive parse/append permission */    return NIL;  }  if (newname) {		/* want rename? */    if (!((s = mailboxfile (tmp,newname)) && *s) ||	((s = strrchr (s,'\\')) && !s[1])) {      sprintf (tmp,"Can't rename mailbox %.80s to %.80s: invalid name",	       old,newname);      mm_log (tmp,ERROR);      ret = NIL;		/* set failure */    }				/* found superior to destination name? */    if (s && (s != tmp) && ((tmp[1] != ':') || (s != tmp + 2))) {      c = s[1];			/* remember character after delimiter */      *s = s[1] = '\0';		/* tie off name at delimiter */				/* name doesn't exist, create it */      if (stat (tmp,&sbuf) || ((sbuf.st_mode & S_IFMT) != S_IFDIR)) {	*s = '\\';		/* restore delimiter */	if (!dummy_create (stream,tmp)) ret = NIL;      }      else *s = '\\';		/* restore delimiter */      s[1] = c;			/* restore character after delimiter */    }    flock (fd,LOCK_UN);		/* release lock on the file */    close (fd);			/* pacify NTFS */				/* rename the file */    if (ret && rename (file,tmp)) {      sprintf (tmp,"Can't rename mailbox %.80s to %.80s: %s",old,newname,	       strerror (errno));      mm_log (tmp,ERROR);      ret = NIL;		/* set failure */    }  }  else {    flock (fd,LOCK_UN);		/* release lock on the file */    close (fd);			/* pacify NTFS */    if (unlink (file)) {      sprintf (tmp,"Can't delete mailbox %.80s: %.80s",old,strerror (errno));      mm_log (tmp,ERROR);      ret = NIL;		/* set failure */    }  }  unlockfd (ld,lock);		/* release exclusive parse/append permission */  return ret;			/* return success */}/* MTX mail open * Accepts: stream to open * Returns: stream on success, NIL on failure */MAILSTREAM *mtx_open (MAILSTREAM *stream){  int fd,ld;  char tmp[MAILTMPLEN];				/* return prototype for OP_PROTOTYPE call */  if (!stream) return &mtxproto;  if (stream->local) fatal ("mtx recycle stream");  if (stream->rdonly ||      (fd = open (mailboxfile (tmp,stream->mailbox),O_BINARY|O_RDWR,NIL)) < 0){    if ((fd=open(mailboxfile(tmp,stream->mailbox),O_BINARY|O_RDONLY,NIL)) < 0){      sprintf (tmp,"Can't open mailbox: %.80s",strerror (errno));      mm_log (tmp,ERROR);      return NIL;    }    else if (!stream->rdonly) {	/* got it, but readonly */      mm_log ("Can't get write access to mailbox, access is readonly",WARN);      stream->rdonly = T;    }  }  stream->local = fs_get (sizeof (MTXLOCAL));  LOCAL->fd = fd;		/* bind the file */  LOCAL->buf = (char *) fs_get (MAXMESSAGESIZE + 1);  LOCAL->buflen = MAXMESSAGESIZE;				/* note if an INBOX or not */  stream->inbox = !strcmp(ucase (strcpy (LOCAL->buf,stream->mailbox)),"INBOX");  fs_give ((void **) &stream->mailbox);  stream->mailbox = cpystr (tmp);				/* get shared parse permission */  if ((ld = lockname (tmp,stream->mailbox,LOCK_SH)) < 0) {    mm_log ("Unable to lock open mailbox",ERROR);    return NIL;  }  flock (LOCAL->fd,LOCK_SH);	/* lock the file */  unlockfd (ld,tmp);		/* release shared parse permission */  LOCAL->filesize = 0;		/* initialize parsed file size */  LOCAL->filetime = 0;		/* time not set up yet */  LOCAL->mustcheck = LOCAL->shouldcheck = NIL;  stream->sequence++;		/* bump sequence number */  stream->uid_validity = time (0);				/* parse mailbox */  stream->nmsgs = stream->recent = 0;  if (mtx_ping (stream) && !stream->nmsgs)    mm_log ("Mailbox is empty",(long) NIL);  if (!LOCAL) return NIL;	/* failure if stream died */  stream->perm_seen = stream->perm_deleted =    stream->perm_flagged = stream->perm_answered = stream->perm_draft =      stream->rdonly ? NIL : T;  stream->perm_user_flags = stream->rdonly ? NIL : 0xffffffff;  return stream;		/* return stream to caller */}/* MTX mail close * Accepts: MAIL stream *	    close options */void mtx_close (MAILSTREAM *stream,long options){  if (stream && LOCAL) {	/* only if a file is open */    int silent = stream->silent;    stream->silent = T;		/* note this stream is dying */    if (options & CL_EXPUNGE) mtx_expunge (stream);    stream->silent = silent;	/* restore previous status */    flock (LOCAL->fd,LOCK_UN);	/* unlock local file */    close (LOCAL->fd);		/* close the local file */				/* free local text buffer */    if (LOCAL->buf) fs_give ((void **) &LOCAL->buf);				/* nuke the local data */    fs_give ((void **) &stream->local);    stream->dtb = NIL;		/* log out the DTB */

⌨️ 快捷键说明

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