Commit | Line | Data |
---|---|---|
18820e95 C |
1 | /* netmail.c - queue mail for the network server */ |
2 | ||
3 | /* LINTLIBRARY */ | |
4 | ||
5 | #include "../h/strings.h" | |
6 | #include <stdio.h> | |
7 | #include "../zotnet/mts.h" | |
8 | ||
9 | ||
10 | #define NOTOK (-1) | |
11 | #define OK 0 | |
12 | ||
13 | #define NBYTES 8 | |
14 | ||
15 | ||
16 | static int files = 0; | |
17 | ||
18 | static char hex[] = "0123456789ABCDEF"; | |
19 | ||
20 | static union { | |
21 | char nbytes[NBYTES]; | |
22 | ||
23 | struct { | |
24 | long clock; | |
25 | short pid; | |
26 | short id; | |
27 | } stamp; | |
28 | } template; | |
29 | ||
30 | static char quefil[BUFSIZ]; | |
31 | static char wrkfil[BUFSIZ]; | |
32 | static FILE * fp; | |
33 | ||
34 | ||
35 | long time (); | |
36 | char *cdate (), *ctime (); | |
37 | ||
38 | /* \f */ | |
39 | ||
40 | int nm_init (user, clock) | |
41 | register char *user; | |
42 | register long *clock; | |
43 | { | |
44 | quefile (quefil, wrkfil); | |
45 | ||
46 | (void) unlink (wrkfil); | |
47 | if ((fp = fopen (wrkfil, "w")) == NULL) | |
48 | return NOTOK; | |
49 | (void) chmod (wrkfil, 0600); | |
50 | ||
51 | fprintf (fp, "%s %s\n", user, cdate (clock)); | |
52 | ||
53 | return OK; | |
54 | } | |
55 | ||
56 | ||
57 | int nm_wadr (mbox, host) | |
58 | register char *mbox, | |
59 | *host; | |
60 | { | |
61 | fprintf (fp, "/%s %s\n", host, mbox); | |
62 | ||
63 | return OK; | |
64 | } | |
65 | ||
66 | ||
67 | int nm_waend () { | |
68 | putc ('\n', fp); | |
69 | ||
70 | return OK; | |
71 | } | |
72 | ||
73 | ||
74 | int nm_wtxt (buffer, cnt) | |
75 | register char *buffer; | |
76 | register int cnt; | |
77 | { | |
78 | if (fwrite (buffer, sizeof *buffer, cnt, fp) != cnt) | |
79 | return NOTOK; | |
80 | ||
81 | return OK; | |
82 | } | |
83 | ||
84 | ||
85 | int nm_wtend () { | |
86 | (void) fclose (fp); | |
87 | if (link (wrkfil, quefil) == NOTOK || unlink (wrkfil) == NOTOK) | |
88 | return NOTOK; | |
89 | ||
90 | return OK; | |
91 | } | |
92 | ||
93 | /* \f */ | |
94 | ||
95 | static quefile (que, lnk) | |
96 | register char *que, | |
97 | *lnk; | |
98 | { | |
99 | register char *p, | |
100 | *q; | |
101 | char buffer[BUFSIZ]; | |
102 | ||
103 | template.stamp.pid = getpid (); | |
104 | template.stamp.id = files++; | |
105 | if (files >= 256) { | |
106 | files = 0; | |
107 | sleep (1); | |
108 | } | |
109 | (void) time (&template.stamp.clock); | |
110 | ||
111 | p = buffer; | |
112 | for (q = template.nbytes; q < &template.nbytes[NBYTES]; q++) { | |
113 | *p++ = hex[(*q >> 4) & 0xf]; | |
114 | *p++ = hex[(*q) & 0xf]; | |
115 | } | |
116 | *p = NULL; | |
117 | ||
118 | (void) sprintf (que, "%s/%s", Mailqdir, buffer); | |
119 | (void) sprintf (lnk, "%s/%s", TMailqdir, buffer); | |
120 | } | |
121 | ||
122 | /* \f */ | |
123 | ||
124 | static char *cdate (clock) | |
125 | register long *clock; | |
126 | { | |
127 | char *cp; | |
128 | ||
129 | cp = ctime (clock); | |
130 | cp[1] = cp[8]; | |
131 | cp[2] = cp[9]; | |
132 | cp[3] = '-'; | |
133 | cp[7] = '-'; | |
134 | cp[8] = cp[22]; | |
135 | cp[9] = cp[23]; | |
136 | cp[10] = '@'; | |
137 | cp[19] = NULL; | |
138 | ||
139 | return cp + 1; | |
140 | } |