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

📄 bezrkdos.c

📁 mgcp协议源代码。支持多种编码:g711
💻 C
📖 第 1 页 / 共 2 页
字号:
void bezerk_check (MAILSTREAM *stream){  unsigned long i = 1;  if (bezerk_ping (stream)) {	/* ping mailbox */				/* get new message status */    while (i <= stream->nmsgs) mail_elt (stream,i++);    mm_log ("Check completed",(long) NIL);  }}/* Berkeley mail expunge mailbox * Accepts: MAIL stream */void bezerk_expunge (MAILSTREAM *stream){  mm_log ("Expunge ignored on readonly mailbox",WARN);}/* Berkeley mail copy message(s) * Accepts: MAIL stream *	    sequence *	    destination mailbox *	    copy options * Returns: T if success, NIL if failed */long bezerk_copy (MAILSTREAM *stream,char *sequence,char *mailbox,long options){  char tmp[MAILTMPLEN];  struct stat sbuf;  MESSAGECACHE *elt;  unsigned long i,j,k;  int fd;  mailproxycopy_t pc =    (mailproxycopy_t) mail_parameters (stream,GET_MAILPROXYCOPY,NIL);  if (!((options & CP_UID) ? mail_uid_sequence (stream,sequence) :	mail_sequence (stream,sequence))) return NIL;				/* make sure valid mailbox */  if (!bezerk_isvalid (mailbox,tmp) && errno) {    if (errno == ENOENT)      mm_notify (stream,"[TRYCREATE] Must create mailbox before append",		 (long) NIL);    else if (pc) return (*pc) (stream,sequence,mailbox,options);    else if (mailboxfile (tmp,mailbox)) {      sprintf (tmp,"Not a Bezerk-format mailbox: %s",mailbox);      mm_log (tmp,ERROR);    }    else bezerk_badname (tmp,mailbox);    return NIL;  }				/* open the destination */  if ((fd = open (mailboxfile (tmp,mailbox),		  O_BINARY|O_WRONLY|O_APPEND|O_CREAT,S_IREAD|S_IWRITE)) < 0) {    sprintf (tmp,"Unable to open copy mailbox: %s",strerror (errno));    mm_log (tmp,ERROR);    return NIL;  }  mm_critical (stream);		/* go critical */  fstat (fd,&sbuf);		/* get current file size */				/* for each requested message */  for (i = 1; i <= stream->nmsgs; i++)    if ((elt = mail_elt (stream,i))->sequence) {      lseek (LOCAL->fd,elt->private.special.offset,SEEK_SET);				/* number of bytes to copy */      j = elt->private.msg.full.offset + elt->rfc822_size;      do {			/* read from source position */	k = min (j,(unsigned long) MAILTMPLEN);	read (LOCAL->fd,tmp,(unsigned int) k);	if (write (fd,tmp,(unsigned int) k) < 0) {	  sprintf (tmp,"Unable to write message: %s",strerror (errno));	  mm_log (tmp,ERROR);	  chsize (fd,sbuf.st_size);	  close (fd);		/* punt */	  mm_nocritical (stream);	  return NIL;	}      } while (j -= k);		/* until done */    }  close (fd);			/* close the file */  mm_nocritical (stream);	/* release critical */				/* delete all requested messages */  if (options & CP_MOVE) for (i = 1; i <= stream->nmsgs; i++)    if ((elt = mail_elt (stream,i))->sequence) elt->deleted = T;  return T;}/* Berkeley mail append message from stringstruct * Accepts: MAIL stream *	    destination mailbox *	    append callback *	    data for callback * Returns: T if append successful, else NIL */#define BUFLEN MAILTMPLENlong bezerk_append (MAILSTREAM *stream,char *mailbox,append_t af,void *data){  struct stat sbuf;  int fd;  unsigned long i,j;  char *flags,*date,buf[BUFLEN],tmp[MAILTMPLEN],file[MAILTMPLEN];  FILE *sf,*df;  MESSAGECACHE elt;  STRING *message;  long ret = LONGT;				/* default stream to prototype */  if (!stream) stream = &bezerkproto;				/* make sure valid mailbox */  if (!bezerk_isvalid (mailbox,tmp) && errno) {    if (errno == ENOENT) {      if (((mailbox[0] == 'I') || (mailbox[0] == 'i')) &&	  ((mailbox[1] == 'N') || (mailbox[1] == 'n')) &&	  ((mailbox[2] == 'B') || (mailbox[2] == 'b')) &&	  ((mailbox[3] == 'O') || (mailbox[3] == 'o')) &&	  ((mailbox[4] == 'X') || (mailbox[4] == 'x')) && !mailbox[5])	bezerk_create (NIL,"INBOX");      else {	mm_notify (stream,"[TRYCREATE] Must create mailbox before append",NIL);	return NIL;      }    }    else if (mailboxfile (tmp,mailbox)) {      sprintf (tmp,"Not a Bezerk-format mailbox: %.80ss",mailbox);      mm_log (tmp,ERROR);    }    else bezerk_badname (tmp,mailbox);    return NIL;  }  tzset ();			/* initialize timezone stuff */				/* get first message */  if (!(*af) (stream,data,&flags,&date,&message)) return NIL;  if (!(sf = tmpfile ())) {	/* must have scratch file */    sprintf (tmp,"Unable to create scratch file: %.80s",strerror (errno));    mm_log (tmp,ERROR);  }  do {				/* parse date */    if (!date) rfc822_date (date = tmp);    if (!mail_parse_date (&elt,date)) {      sprintf (tmp,"Bad date in append: %.80s",date);      mm_log (tmp,ERROR);    }    else {			/* user wants to suppress time zones? */      if (mail_parameters (NIL,GET_NOTIMEZONES,NIL)) {	time_t when = mail_longdate (&elt);	date = ctime (&when);	/* use traditional date */      }				/* use POSIX-style date */      else date = mail_cdate (tmp,&elt);      if (!bezerk_append_msg (stream,sf,flags,date,message)) {	sprintf (tmp,"Error writing scratch file: %.80s",strerror (errno));	mm_log (tmp,ERROR);      }				/* get next message */      else if ((*af) (stream,data,&flags,&date,&message)) continue;    }    fclose (sf);		/* punt scratch file */    return NIL;			/* give up */  } while (message);		/* until no more messages */  if (fflush (sf) || fstat (fileno (sf),&sbuf)) {    sprintf (tmp,"Error finishing scratch file: %.80s",strerror (errno));    mm_log (tmp,ERROR);    fclose (sf);		/* punt scratch file */    return NIL;			/* give up */  }  i = sbuf.st_size;		/* size of scratch file */  mm_critical (stream);		/* go critical */				/* open the destination */  if (((fd = open (mailboxfile (tmp,mailbox),		  O_BINARY|O_WRONLY|O_APPEND|O_CREAT,S_IREAD|S_IWRITE)) < 0) ||      !(df = fdopen (fd,"ab"))) {    mm_nocritical (stream);	/* done with critical */    sprintf (tmp,"Can't open append mailbox: %s",strerror (errno));    mm_log (tmp,ERROR);    return NIL;  }  fstat (fd,&sbuf);		/* get current file size */  while (i)			/* until written all bytes */    if ((j = fread (buf,1,min ((long) BUFLEN,i),sf)) &&	(fwrite (buf,1,j,df) == j)) i -= j;  fclose (sf);			/* done with scratch file */				/* make sure append wins */  if (i || (fflush (df) == EOF)) {    chsize (fd,sbuf.st_size);	/* revert file */    close (fd);			/* make sure fclose() doesn't corrupt us */    sprintf (buf,"Message append failed: %s",strerror (errno));    mm_log (buf,ERROR);    ret = NIL;			/* return error */  }  fclose (df);  mm_nocritical (stream);	/* release critical */  return ret;}/* Write single message to append scratch file * Accepts: MAIL stream *	    scratch file *	    flags *	    message stringstruct * Returns: NIL if write error, else T */int bezerk_append_msg (MAILSTREAM *stream,FILE *sf,char *flags,char *date,		     STRING *msg){  int c;  unsigned long i,uf;  char tmp[MAILTMPLEN];  long f = mail_parse_flags (stream,flags,&uf);				/* build initial header */  if ((fprintf (sf,"From %s@%s %sStatus: ",		myusername (),mylocalhost (),date) < 0) ||      (f&fSEEN && (putc ('R',sf) == EOF)) ||      (fputs ("\nX-Status: ",sf) == EOF) ||      (f&fDELETED && (putc ('D',sf) == EOF)) ||      (f&fFLAGGED && (putc ('F',sf) == EOF)) ||      (f&fANSWERED && (putc ('A',sf) == EOF)) ||      (f&fDRAFT && (putc ('T',sf) == EOF)) ||      (fputs ("\nX-Keywords:",sf) == EOF)) return NIL;  while (uf)			/* write user flags */    if (fprintf (sf," %s",stream->user_flags[find_rightmost_bit (&uf)]) < 0)      return NIL;				/* tie off flags */  if (putc ('\n',sf) == EOF) return NIL;  while (SIZE (msg)) {		/* copy text to scratch file */				/* possible delimiter if line starts with F */    if ((c = 0xff & SNX (msg)) == 'F') {				/* copy line to buffer */      for (i = 1,tmp[0] = c; SIZE (msg) && (c != '\n') && (i < MAILTMPLEN);)	if (((c = 0xff & SNX (msg)) != '\r') || !(SIZE (msg)) ||	    (CHR (msg) != '\n')) tmp[i++] = c;      if ((i > 4) && (tmp[1] == 'r') && (tmp[2] == 'o') && (tmp[3] == 'm') &&	  (tmp[4] == ' ')) {	/* possible "From " line? */				/* yes, see if need to write a widget */	if (((c != '\n') || bezerk_valid_line (tmp,NIL,NIL)) &&	    (putc ('>',sf) == EOF)) return NIL;      }				/* write buffered text */      if (fwrite (tmp,1,i,sf) != i) return NIL;      if (c == '\n') continue;	/* all done if got a complete line */    }				/* copy line, toss out CR from CRLF */    do if (((c == '\r') && SIZE (msg) && ((c = 0xff & SNX (msg)) != '\n') &&	    (putc ('\r',sf) == EOF)) || (putc (c,sf) == EOF)) return NIL;    while ((c != '\n') && SIZE (msg) && ((c = 0xff & SNX (msg)) ? c : T));  }				/* write trailing newline and return */  return (putc ('\n',sf) == EOF) ? NIL : T;}/* Return bad file name error message * Accepts: temporary buffer *	    file name * Returns: long NIL always */long bezerk_badname (char *tmp,char *s){  sprintf (tmp,"Invalid mailbox name: %s",s);  mm_log (tmp,ERROR);  return (long) NIL;}/* Parse mailbox * Accepts: MAIL stream * Returns: T if parse OK *	    NIL if failure, stream aborted */long bezerk_parse (MAILSTREAM *stream){  struct stat sbuf;  MESSAGECACHE *elt;  char *s,*t,tmp[MAILTMPLEN + 1],*db,datemsg[100];  long i;  int j,ti,zn;  long curpos = LOCAL->filesize;  long nmsgs = stream->nmsgs;  long recent = stream->recent;  short silent = stream->silent;  fstat (LOCAL->fd,&sbuf);	/* get status */  if (sbuf.st_size < curpos) {	/* sanity check */    sprintf (tmp,"Mailbox shrank from %ld to %ld!",curpos,sbuf.st_size);    mm_log (tmp,ERROR);    bezerk_close (stream,NIL);    return NIL;  }  stream->silent = T;		/* don't pass up mm_exists() events yet */  db = datemsg + strlen (strcpy (datemsg,"Unparsable date: "));  while (sbuf.st_size - curpos){/* while there is data to read */				/* get to that position in the file */    lseek (LOCAL->fd,curpos,SEEK_SET);				/* read first buffer's worth */    read (LOCAL->fd,tmp,j = (int) min (i,(long) MAILTMPLEN));    tmp[j] = '\0';		/* tie off buffer */    if (!(ti = bezerk_valid_line (tmp,&t,&zn))) {      mm_log ("Mailbox format invalidated (consult an expert), aborted",ERROR);      bezerk_close (stream,NIL);      return NIL;    }				/* swell the cache */    mail_exists (stream,++nmsgs);				/* instantiate an elt for this message */    (elt = mail_elt (stream,nmsgs))->valid = T;    elt->private.uid = ++stream->uid_last;				/* note file offset of header */    elt->private.special.offset = curpos;				/* note offset of message */    elt->private.msg.full.offset =      (s = ((*t == '\015') ? (t + 2) : (t + 1))) - tmp;				/* generate plausable IMAPish date string */    db[2] = db[6] = db[20] = '-'; db[11] = ' '; db[14] = db[17] = ':';				/* dd */    db[0] = t[ti - 2]; db[1] = t[ti - 1];				/* mmm */    db[3] = t[ti - 6]; db[4] = t[ti - 5]; db[5] = t[ti - 4];				/* hh */    db[12] = t[ti + 1]; db[13] = t[ti + 2];				/* mm */    db[15] = t[ti + 4]; db[16] = t[ti + 5];    if (t[ti += 6] == ':') {	/* ss if present */      db[18] = t[++ti]; db[19] = t[++ti];      ti++;			/* move to space */    }    else db[18] = db[19] = '0';	/* assume 0 seconds */				/* yy -- advance over timezone if necessary */    if (++zn == ++ti) ti += (((t[zn] == '+') || (t[zn] == '-')) ? 6 : 4);    db[7] = t[ti]; db[8] = t[ti + 1]; db[9] = t[ti + 2]; db[10] = t[ti + 3];    t = zn ? (t + zn) : "LCL";	/* zzz */    db[21] = *t++; db[22] = *t++; db[23] = *t++;    if ((db[21] != '+') && (db[21] != '-')) db[24] = '\0';    else {			/* numeric time zone */      db[20] = ' '; db[24] = *t++; db[25] = *t++; db[26] = '\0';    }				/* set internal date */    if (!mail_parse_date (elt,db)) mm_log (datemsg,WARN);    curpos += s - tmp;		/* advance position after header */    t = strchr (s,'\012');	/* start of next line */				/* find start of next message */    while (!(bezerk_valid_line (s,NIL,NIL))) {      if (t) {			/* have next line? */	t++;			/* advance to new line */	curpos += t - s;	/* update position and size */	elt->rfc822_size += ((t - s) + ((t[-2] == '\015') ? 0 : 1));	s = t;			/* move to next line */	t = strchr (s,'\012');      }      else {			/* try next buffer */	j = strlen (s);		/* length of unread data in buffer */	if ((i = sbuf.st_size - curpos) && (i != j)) {				/* get to that position in the file */	  lseek (LOCAL->fd,curpos,SEEK_SET);				/* read another buffer's worth */	  read (LOCAL->fd,s = tmp,j = (int) min (i,(long) MAILTMPLEN));	  tmp[j] = '\0';	/* tie off buffer */	  if (!(t = strchr (s,'\012'))) fatal ("Line too long in mailbox");	}	else {	  curpos += j;		/* last bit of data */	  elt->rfc822_size += j;	  break;	}      }    }  }				/* update parsed file size */  LOCAL->filesize = sbuf.st_size;  stream->silent = silent;	/* can pass up events now */  mail_exists (stream,nmsgs);	/* notify upper level of new mailbox size */  mail_recent (stream,recent);	/* and of change in recent messages */  return T;			/* return the winnage */}/* Berkeley locate header for a message * Accepts: MAIL stream *	    message number *	    pointer to returned header size * Returns: position of header in file */unsigned long bezerk_hdrpos (MAILSTREAM *stream,unsigned long msgno,			     unsigned long *size){  long siz;  size_t i = 0;  char c = '\0';  char *s;  char tmp[MAILTMPLEN];  MESSAGECACHE *elt = mail_elt (stream,msgno);  long pos = elt->private.special.offset + elt->private.msg.full.offset;				/* is size known? */  if (!(*size = elt->private.msg.header.text.size)) {				/* get to header position */    lseek (LOCAL->fd,pos,SEEK_SET);				/* search message for CRLF CRLF */    for (siz = 1; siz <= elt->rfc822_size; siz++) {      if (!i &&			/* buffer empty? */	  (read (LOCAL->fd,s = tmp,		 i = (size_t) min(elt->rfc822_size-siz,(long)MAILTMPLEN))<= 0))	return pos;      else i--;				/* two newline sequence? */      if ((c == '\012') && (*s == '\012')) {				/* yes, note for later */	elt->private.msg.header.text.size = (*size = siz);	return pos;		/* return to caller */      }      else if ((c == '\012') && (*s == '\015')) {				/* yes, note for later */	elt->private.msg.header.text.size = (*size = siz + 1);	return pos;		/* return to caller */      }      else c = *s++;		/* next character */    }  }  return pos;			/* have position */}

⌨️ 快捷键说明

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