rewrite.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:4k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include "global.h"
  5. #include "files.h"
  6. #include "mailbox.h"
  7. #include "smtp.h"
  8. #include "bm.h"
  9. char *Hdrs[] = {
  10. "Approved: ",
  11. "From: ",
  12. "To: ",
  13. "Date: ",
  14. "Message-Id: ",
  15. "Subject: ",
  16. "Received: ",
  17. "Sender: ",
  18. "Reply-To: ",
  19. "Status: ",
  20. "X-BBS-Msg-Type: ",
  21. "X-Forwarded-To: ",
  22. "Cc: ",
  23. "Return-Receipt-To: ",
  24. "Apparently-To: ",
  25. "Errors-To: ",
  26. "Organization: ",
  27. NULL
  28. };
  29. /* Read the rewrite file for lines where the first word is a regular
  30.  * expression and the second word are rewriting rules. The special
  31.  * character '$' followed by a digit denotes the string that matched
  32.  * a '*' character. The '*' characters are numbered from 1 to 9.
  33.  * Example: the line "*@*.* $2@$1.ampr.org" would rewrite the address
  34.  * "foo@bar.xxx" to "bar@foo.ampr.org".
  35.  * $H is replaced by our hostname, and $$ is an escaped $ character.
  36.  * If the third word on the line has an 'r' character in it, the function
  37.  * will recurse with the new address.
  38.  */
  39. char *
  40. rewrite_address(addr)
  41. char *addr;
  42. {
  43. char *argv[10], buf[MBXLINE], *cp, *cp2, *retstr;
  44. int cnt;
  45. FILE *fp;
  46. if ((fp = fopen(Rewritefile,READ_TEXT)) == NULL)
  47. return NULL;
  48. memset(argv,0,10*sizeof(char *));
  49. while(fgets(buf,MBXLINE,fp) != NULL) {
  50. if(*buf == '#') /* skip commented lines */
  51. continue;
  52. if((cp = strchr(buf,' ')) == NULL) /* get the first word */
  53. if((cp = strchr(buf,'t')) == NULL)
  54. continue;
  55. *cp = '';
  56. if((cp2 = strchr(buf,'t')) != NULL){
  57. *cp = ' ';
  58. cp = cp2;
  59. *cp = '';
  60. }
  61. if(!wildmat(addr,buf,argv))
  62. continue; /* no match */
  63. rip(++cp);
  64. cp2 = retstr = (char *) callocw(1,MBXLINE);
  65. while(*cp != '' && *cp != ' ' && *cp != 't')
  66. if(*cp == '$') {
  67. if(isdigit(*(++cp)))
  68. if(argv[*cp - '0'-1] != '')
  69. strcat(cp2,argv[*cp - '0'-1]);
  70. if(*cp == 'h' || *cp == 'H') /* Our hostname */
  71. strcat(cp2,Hostname);
  72. if(*cp == '$') /* Escaped $ character */
  73. strcat(cp2,"$");
  74. cp2 = retstr + strlen(retstr);
  75. cp++;
  76. }
  77. else
  78. *cp2++ = *cp++;
  79. for(cnt=0; argv[cnt] != NULL; ++cnt)
  80. free(argv[cnt]);
  81. fclose(fp);
  82. /* If there remains an 'r' character on the line, repeat
  83.  * everything by recursing.
  84.  */
  85. if(strchr(cp,'r') != NULL || strchr(cp,'R') != NULL) {
  86. if((cp2 = rewrite_address(retstr)) != NULL) {
  87. free(retstr);
  88. return cp2;
  89. }
  90. }
  91. return retstr;
  92. }
  93. fclose(fp);
  94. return NULL;
  95. }
  96. /* Parse a string in the "Text: <user@host>" or "Text: user@host (Text)"
  97.  * format for the address user@host.
  98.  */
  99. char *
  100. getaddress(string,cont)
  101. char *string;
  102. int cont; /* true if string is a continued header line */
  103. {
  104. char *cp, *ap = NULL;
  105. int par = 0;
  106. if((cp = getname(string)) != NULL) /* Look for <> style address */
  107.      return cp;
  108. cp = string;
  109. if(!cont)
  110.      if((cp = strchr(string,':')) == NULL) /* Skip the token */
  111.   return NULL;
  112.      else
  113.   ++cp;
  114. for(; *cp != ''; ++cp) {
  115.      if(par && *cp == ')') {
  116.   --par;
  117.   continue;
  118.      }
  119.      if(*cp == '(') /* Ignore text within parenthesis */
  120.   ++par;
  121.      if(par)
  122.   continue;
  123.      if(*cp == ' ' || *cp == 't' || *cp == 'n' || *cp == ',') {
  124.   if(ap != NULL)
  125.        break;
  126.   continue;
  127.      }
  128.      if(ap == NULL)
  129.   ap = cp;
  130. }
  131. *cp = '';
  132. return ap;
  133. }
  134. /* return the header type */
  135. int
  136. htype(s)
  137. char *s;
  138. {
  139. register char *p;
  140. register int i;
  141. p = s;
  142. /* check to see if there is a ':' before and white space */
  143. while (*p != '' && *p != ' ' && *p != ':')
  144. p++;
  145. if (*p != ':')
  146. return NOHEADER;
  147. for (i = 0; Hdrs[i] != NULL; i++) {
  148. if (strnicmp(Hdrs[i],s,strlen(Hdrs[i])) == 0)
  149. return i;
  150. }
  151. return UNKNOWN;
  152. }