]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/mts/mh/netmail.c
Changes to anno.man.
[nmh] / docs / historical / mh-6.8.5 / mts / mh / netmail.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 }