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

网络编程

开发平台:

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 <string.h>
  13. #if HAVE_STRINGS_H
  14. #include <strings.h>
  15. #endif
  16. #ifdef __STDC__
  17. #include <stdlib.h>
  18. #include <stdarg.h>
  19. #else
  20. #include <varargs.h>
  21. #endif
  22. #include "popper.h"
  23. #define BUFSIZE 2048
  24. /* 
  25.  *  msg:    Send a formatted line to the POP client
  26.  */
  27. #ifdef __STDC__
  28. pop_msg(POP *p, int stat, const char *format,...)
  29. #else
  30. pop_msg(va_alist)
  31. va_dcl
  32. #endif
  33. {
  34. #ifndef __STDC__
  35.     POP             *   p;
  36.     int                 stat;              /*  POP status indicator */
  37.     char            *   format;            /*  Format string for the message */
  38. #endif
  39.     va_list             ap;
  40.     register char   *   mp;
  41. #ifdef PYRAMID
  42.     char     *   arg1, *arg2, *arg3, *arg4, *arg5, *arg6;
  43. #endif
  44.     char                message[BUFSIZE];
  45. #ifdef __STDC__
  46.     va_start(ap,format);
  47. #else
  48.     va_start(ap);
  49.     p = va_arg(ap, POP *);
  50.     stat = va_arg(ap, int);
  51.     format = va_arg(ap, char *);
  52. #endif
  53. #ifdef PYRAMID
  54. arg1 = va_arg(ap, char *);
  55. arg2 = va_arg(ap, char *);
  56. arg3 = va_arg(ap, char *);
  57. arg4 = va_arg(ap, char *);
  58. arg5 = va_arg(ap, char *);
  59. arg6 = va_arg(ap, char *);
  60. #endif
  61.     /*  Point to the message buffer */
  62.     mp = message;
  63.     /*  Format the POP status code at the beginning of the message */
  64.     if (stat == POP_SUCCESS)
  65.         (void)sprintf (mp,"%s ",POP_OK);
  66.     else
  67.         (void)sprintf (mp,"%s ",POP_ERR);
  68.     /*  Point past the POP status indicator in the message message */
  69.     mp += strlen(mp);
  70.     /*  Append the message (formatted, if necessary) */
  71.     if (format) {
  72. #ifdef HAVE_VPRINTF
  73.         vsprintf(mp,format,ap);
  74. #else
  75. # ifdef PYRAMID
  76. (void)sprintf(mp,format, arg1, arg2, arg3, arg4, arg5, arg6);
  77. # else
  78. (void)sprintf(mp,format,((int *)ap)[0],((int *)ap)[1],((int *)ap)[2],
  79.       ((int *)ap)[3],((int *)ap)[4]);
  80. # endif
  81. #endif
  82.     }
  83.     va_end(ap);
  84.     
  85.     /*  Log the message if debugging is turned on */
  86. #ifdef DEBUG
  87.     if (p->debug && stat == POP_SUCCESS)
  88.         pop_log(p,POP_DEBUG,"%.1023s",message);
  89. #endif
  90.     /*  Log the message if a failure occurred */
  91.     if (stat != POP_SUCCESS) 
  92. pop_log(p,POP_PRIORITY,
  93.                (isdigit (p->client[0]) ? "%s@[%s]: %s" : "%s@%s: %s"),
  94.                (p->user ? p->user : "(null)"), p->client, message);
  95.     /*  Append the <CR><LF> */
  96.     (void)strcat(message, "rn");
  97.         
  98.     /*  Send the message to the client */
  99.     (void)fputs(message,p->output);
  100.     (void)fflush(p->output);
  101.     return(stat);
  102. }