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

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1989 Regents of the University of California.
  3.  * All rights reserved.  The Berkeley software License Agreement
  4.  * specifies the terms and conditions for redistribution.
  5.  */
  6. /*
  7.  * Copyright (c) 1997 by Qualcomm Incorporated.
  8.  */
  9. #include <config.h>
  10. #include <stdio.h>
  11. #include <sys/types.h>
  12. #include <sys/file.h>
  13. #ifdef POPSCO
  14. # define __SCO_WAIT3__
  15. # include <fcntl.h>
  16. #endif
  17. #include <sys/wait.h>
  18. #if HAVE_SYS_STAT_H
  19. #include <sys/stat.h>
  20. #endif
  21. #if HAVE_FCNTL_H
  22. #include <fcntl.h>
  23. #endif
  24. #include <popper.h>
  25. /*
  26.  *  xmit:   POP XTND function to receive a message from 
  27.  *          a client and send it in the mail
  28.  */
  29. FILE *tmp; /* File descriptor for temporary file */
  30. char temp_xmit[MAXDROPLEN]; /* Name of the temporary filedrop */
  31. pop_xmit (p)
  32. POP     *   p;
  33. {
  34.     int     tfn;     
  35.     /*  Create a temporary file into which to copy the user's message */
  36.     strncpy(temp_xmit, POP_TMPXMIT, sizeof(temp_xmit));
  37. #ifdef DEBUG
  38.     if(p->debug)
  39.         pop_log(p,POP_DEBUG,
  40.             "Creating temporary file for sending a mail message "%s"",
  41.                 temp_xmit);
  42. #endif
  43.     if (((tfn=mkstemp(temp_xmit)) == -1) ||
  44. ((tmp=fdopen(tfn, "w+")) == NULL)) { /* failure, bail out */
  45.         return (pop_msg(p,POP_FAILURE,
  46.             "Unable to create temporary message file "%s", errno = %d",
  47.                 temp_xmit, errno));
  48.     }
  49.     /*  Receive the message */
  50. #ifdef DEBUG
  51.     if(p->debug)pop_log(p,POP_DEBUG,"Receiving mail message");
  52. #endif
  53.     p->xmitting = 1;
  54.     return(pop_msg(p,POP_SUCCESS,"Start sending message."));
  55. }
  56. pop_xmit_recv(p,buffer)
  57. POP  *p;
  58. char *buffer;
  59. {
  60.     /*  Look for initial period */
  61. #ifdef DEBUG
  62.     if(p->debug)pop_log(p,POP_DEBUG,"Receiving: "%.1000s"",buffer);
  63. #endif
  64.     if (*buffer == '.') {
  65.         /*  Exit on end of message */
  66.         if (strcmp(buffer,".rn") == 0) {
  67.             (void) fclose(tmp);
  68.             p->xmitting = 0;
  69.             pop_xmit_exec(p);
  70.         }
  71.         /* sendmail will not remove escaped .. */
  72. else if (buffer[1] == '.')  (void)fputs (&buffer[1], tmp);
  73. else  (void)fputs (buffer, tmp);
  74.     } else    (void)fputs (buffer, tmp);
  75. }
  76.     
  77. pop_xmit_exec(p)
  78. POP *p;
  79. {
  80. #ifdef NeXT
  81.     union wait     stat;
  82. #else
  83.     int     stat;
  84. #endif
  85.     PID_T                   id, pid;
  86.     
  87. #ifdef DEBUG
  88.     if(p->debug)pop_log(p,POP_DEBUG,"Forking for "%s"",MAIL_COMMAND);
  89. #endif
  90.     /*  Send the message */
  91.     switch (pid = fork()) {
  92.         case 0:
  93.     /*  Open the log file */
  94.     (void)closelog();
  95. #ifdef SYSLOG42
  96.     (void)openlog(p->myname,0);
  97. #else
  98.     (void)openlog(p->myname,LOG_PID,POP_FACILITY);
  99. #endif
  100.     pop_log(p, POP_DEBUG,
  101.     "Pop transmit from "%s" on "%s"", p->user, p->client);
  102.             (void)fclose (p->input);
  103.             (void)fclose (p->output);       
  104.             (void)close(0);
  105.             if (open(temp_xmit,O_RDONLY,0) < 0)
  106. (void)_exit(1);
  107.             (void)execl (MAIL_COMMAND,"send-mail","-t","-i","-oem",NULLCP);
  108.             (void)_exit(1);
  109.         case -1:
  110.             if (!p->debug) (void)unlink (temp_xmit);
  111.             return (pop_msg(p,POP_FAILURE, "Unable to execute "%s" (%d)",
  112. MAIL_COMMAND, errno));
  113.         default:
  114. #ifdef NeXT
  115.             while((id = wait(&stat)) >=0 && id != pid);
  116. #else
  117.             id = waitpid(pid, &stat, 0);
  118. #endif
  119.             if (!p->debug) (void)unlink (temp_xmit);
  120. #ifdef NeXT
  121.             if (!WIFEXITED (stat))
  122. #else
  123.             if ((!WIFEXITED (stat)) || (WEXITSTATUS (stat) != 0))
  124. #endif
  125.                 return (pop_msg(p,POP_FAILURE,"Unable to send message"));
  126.             return (pop_msg (p,POP_SUCCESS,"Message sent successfully"));
  127.     }
  128. }
  129. pop_xmit_clean(p)
  130. POP *p;
  131. {
  132.     fclose(tmp);
  133.     if (!p->debug) (void)unlink (temp_xmit);
  134. }