|
|
1.1 root 1: #ident "@(#)is.c 1.3 'attmail mail(1) command'"
2: #ident "@(#)mailx:is.c 1.1"
3: #ident "@(#)is.c 2.6 'attmail mail(1) command'"
4: #include "rcv.h"
5: #include <pwd.h>
6:
7: static int isit();
8:
9: /*
10: * isheader(lp, ctf) - check if lp is header line and return type
11: * lp -> pointer to line
12: * ctfp -> continuation flag (should be FALSE the first time
13: * isheader() is called on a message. isheader() sets
14: * it for the remaining calls to that message)
15: * returns
16: * FALSE -> not header line
17: * H_* -> type of header line found.
18: */
19: int
20: isheader(lp, ctfp)
21: char *lp;
22: int *ctfp;
23: {
24: register char *p, *q;
25: register int i;
26:
27: p = lp;
28: while((*p) && (*p != '\n') && (isspace(*p))) {
29: p++;
30: }
31: if((*p == NULL) || (*p == '\n')) {
32: /* blank line */
33: return (FALSE);
34: }
35:
36: if ((*ctfp) && ((*lp == ' ') || (*lp == '\t'))) {
37: return(H_CONT);
38: }
39:
40: *ctfp = FALSE;
41: for (i = 1; i < H_CONT; i++) {
42: if (!isit(lp, i)) {
43: continue;
44: }
45: if ((i == H_FROM) || (i == H_FROM1)) {
46: /*
47: * Should NEVER get 'From ' or '>From ' line on stdin
48: * if invoked as mail (rather than rmail) since
49: * 'From ' and/or '>From ' lines are generated by
50: * program itself. Therefore, if it DOES match and
51: * ismail == TRUE, it must be part of the content.
52: */
53: if (sending && ismail) {
54: return (FALSE);
55: }
56: /*
57: * I'm sorry, but as far as I can tell, a "From " line should
58: * _never_ be "from " or "FROM ". Case matters in this case
59: * --- adb
60: */
61: if( i == H_FROM && strncmp(lp,"From",4) != 0) /* adb */
62: return(FALSE); /* adb */
63: }
64: *ctfp = TRUE;
65: return (i);
66: }
67: /*
68: * Check if name: value pair
69: */
70: if ((p = strpbrk(lp, ":")) != NULL ) {
71: for(q = lp; q < p; q++) {
72: if ( (!isalnum(*q)) && (*q != '-') && (*q != '>')) {
73: return(FALSE);
74: }
75: }
76: *ctfp = TRUE;
77: return(H_NAMEVALUE);
78: }
79: return(FALSE);
80: }
81:
82: /*
83: * isit(lp, type) -- case independent match of "name" portion of
84: * "name: value" pair
85: * lp -> pointer to line to check
86: * type -> type of header line to match
87: * returns
88: * TRUE -> lp matches header type (case independent)
89: * FALSE -> no match
90: */
91: static int
92: isit(lp, type)
93: register char *lp;
94: register int type;
95: {
96: register char *p;
97:
98: for (p = header[type].tag; *lp && *p; lp++, p++) {
99: if (toupper(*p) != toupper(*lp)) {
100: return(FALSE);
101: }
102: }
103: if (*p == NULL) {
104: return(TRUE);
105: }
106: return(FALSE);
107: }
108:
109: /*
110: * istext(line, size) - check for text characters
111: */
112: int
113: istext(lp, size)
114: char *lp;
115: long size;
116: {
117: register unsigned char *line = (unsigned char*)lp;
118: register unsigned char *ep;
119:
120: for (ep = line+size; --ep >= line; ) {
121: if( *ep > 0177) return(FALSE);
122: }
123: return(TRUE);
124: }
125:
126: /*
127: * linecount (line, size) - determine the number of lines in a printable
128: * file.
129: */
130: int
131: linecount(lp, size)
132: char *lp;
133: int size;
134: {
135: register unsigned char *line = (unsigned char*)lp;
136: register unsigned char *ch;
137: register c;
138: register int count;
139:
140: count = 0;
141: for (ch = line+size; --ch >= line;)
142: {
143: c = *ch;
144: if (c == '\n')
145: count++;
146: continue;
147: }
148: return (count);
149: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.