xtnd_xlst.c
上传用户:dayuan858
上传日期:2007-01-04
资源大小:194k
文件大小:2k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. #include <config.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/file.h>
  5. #include <sys/wait.h>
  6. #include "popper.h"
  7. /*
  8.  *  xlst:   POP XTND function to list headers from messages
  9.  */
  10. pop_xlst (p)
  11. POP     *   p;
  12. {
  13.     char                    buffer[MAXLINELEN];     /*  Read buffer */
  14.     MsgInfoList         *   mp;         /*  Pointer to message info list */
  15.     int min,max;
  16.     int len = strlen(p->pop_parm[2]);
  17.     /*  Convert the first parameter into an integer */
  18.     if (p->parm_count==3)
  19.       min = max = atoi(p->pop_parm[3]);
  20.     else
  21.     {
  22.       min = 1;
  23.       max = p->msg_count;
  24.     }
  25.     /*  Is requested message out of range? */
  26.     if ((min < 1) || (min > p->msg_count))
  27.         return (pop_msg (p,POP_FAILURE,"Message %d does not exist.",min));
  28.     /* yes, we can do this */
  29.     pop_msg (p,POP_SUCCESS,"xlst command accepted; headers coming.");
  30.     for (;min<=max;min++)
  31.     {
  32.       /*  Get a pointer to the message in the message list */
  33.       mp = &p->mlp[min-1];
  34.       /*  Is the message flagged for deletion? */
  35.       if (mp->del_flag) continue;
  36.       /*  Position to the start of the message */
  37.       (void)fseek(p->drop, (OFF_T)mp->offset, 0);
  38.       /*  Skip the first line (the sendmail "From" line) */
  39.       (void)fgets (buffer,MAXMSGLINELEN,p->drop);
  40.       /*  scan until we fine the header or a blank line */
  41.       while (fgets(buffer,MAXMSGLINELEN,p->drop)) {
  42.           if (*buffer=='n') break;
  43.           if (!strncasecmp(buffer,p->pop_parm[2],len))
  44.           {
  45.             /* found it! */
  46.             fprintf(p->output,"%d ",min);
  47.             pop_sendline (p,buffer);
  48.             while (fgets(buffer,MAXMSGLINELEN,p->drop))
  49.             {
  50.               if (*buffer!=' ' && *buffer!='t') break;
  51.               pop_sendline(p,buffer);
  52.             }
  53.             break;
  54.           }
  55.       }
  56.   }
  57.   /*  "." signals the end of a multi-line transmission */
  58.   (void)fputs(".rn",p->output);
  59.   (void)fflush(p->output);
  60.   return(POP_SUCCESS);
  61. }