BSD 4_4_Lite1 release
[unix-history] / usr / src / contrib / mh-6.8.3a / mts / mh / netmail.c
CommitLineData
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
16static int files = 0;
17
18static char hex[] = "0123456789ABCDEF";
19
20static union {
21 char nbytes[NBYTES];
22
23 struct {
24 long clock;
25 short pid;
26 short id;
27 } stamp;
28} template;
29
30static char quefil[BUFSIZ];
31static char wrkfil[BUFSIZ];
32static FILE * fp;
33
34
35long time ();
36char *cdate (), *ctime ();
37
38/* \f */
39
40int nm_init (user, clock)
41register char *user;
42register 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
57int nm_wadr (mbox, host)
58register char *mbox,
59 *host;
60{
61 fprintf (fp, "/%s %s\n", host, mbox);
62
63 return OK;
64}
65
66
67int nm_waend () {
68 putc ('\n', fp);
69
70 return OK;
71}
72
73
74int nm_wtxt (buffer, cnt)
75register char *buffer;
76register int cnt;
77{
78 if (fwrite (buffer, sizeof *buffer, cnt, fp) != cnt)
79 return NOTOK;
80
81 return OK;
82}
83
84
85int 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
95static quefile (que, lnk)
96register 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
124static char *cdate (clock)
125register 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}