comparison 3rdparty/packages/uucpbb/src/procart.c @ 1772:5ba8e711a1a3

source added
author boisy
date Fri, 01 Apr 2005 22:04:25 +0000
parents
children
comparison
equal deleted inserted replaced
1771:7f2e75d5b62d 1772:5ba8e711a1a3
1 /* procart.c - Process a single article into one or more news groups.
2 Copyright (C) 1994 Brad Spencer
3
4 This file is part of the OS-9 UUCP package, UUCPbb.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20 The author of UUCPbb, Bob Billson, can be contacted at:
21 bob@kc2wz.bubble.org or uunet!kc2wz!bob or by snail mail:
22 21 Bates Way, Westfield, NJ 07090
23 */
24
25 #include "uucp.h"
26 #include "rnews.h"
27 #include "mbuf.h"
28
29 extern char *junk;
30 extern char *space;
31 struct mbuf *mwrite();
32 extern int debuglvl;
33
34 int free();
35
36 int procart (fd, initalbuf, initng, gh, origlength)
37 FILE *fd;
38 char *initalbuf, *initng;
39 struct mbuf *gh;
40 long origlength;
41 {
42 char lbuf[512];
43 char *newsgroups = NULL, *refline = NULL;
44 int gotgroup = FALSE, r;
45 struct mbuf *mh = NULL, *mp = NULL;
46 register struct mbuf *gg;
47
48 /* A inital newsgroup may be forced onto this article */
49 if (*initng != '\0')
50 newsgroups = initng;
51
52 mp = mwrite (mp, &mh, initalbuf, strlen (initalbuf) + 1);
53
54 while (feof (fd) == 0)
55 {
56 if (gotgroup == FALSE)
57 {
58 getline (fd, initalbuf);
59
60 if (debuglvl > 8)
61 lineis (lbuf, initalbuf);
62
63 mp = mwrite (mp, &mh, initalbuf, strlen (initalbuf) + 1);
64
65 if (*initng == '\0')
66 {
67 if (strncmp (mp->cbuf, "Newsgroups: ", 12) == 0)
68 {
69 newsgroups = &mp->cbuf[12];
70
71 if (debuglvl > 1)
72 {
73 sprintf (lbuf, "Newsgroup: %s", newsgroups);
74 log (lbuf);
75 }
76
77 if (refline != NULL)
78 gotgroup = TRUE;
79 }
80 }
81
82 /* Bob says that tabs need to be eaten from References: lines
83 */
84 if (strncmp (mp->cbuf, "References: ", 12) == 0)
85 {
86 refline = mp->cbuf;
87 fixref (refline);
88
89 if (debuglvl > 2)
90 {
91 sprintf (lbuf, "Reference line is: '%s'", refline);
92 log (lbuf);
93 }
94
95 if (newsgroups != NULL)
96 gotgroup = TRUE;
97 }
98
99 if (mp->cbuf[0] == '\0')
100 {
101 if (newsgroups == NULL)
102 {
103 if (debuglvl > 1)
104 log ("No newsgroup given, junking article");
105
106 newsgroups = junk;
107 }
108 gotgroup = TRUE;
109 }
110 }
111 else
112 {
113 if (gotgroup == TRUE)
114 {
115 openarts (gh, newsgroups);
116
117 if (origlength != -1)
118 if ((origlength - 1) > 0)
119 extendfile (gh, origlength, lbuf);
120
121 /* Write the inital few lines to the file(s) */
122 for (gg = gh; gg != NULL; gg = gg->mbuf_next)
123 if (((struct groups *)gg->cbuf)->artfd != NULL)
124 for (mp = mh; mp != NULL; mp = mp->mbuf_next)
125 fprintf (((struct groups *)gg->cbuf)->artfd,"%s\n", mp->cbuf);
126
127 gotgroup++;
128 }
129
130 if ((r = fread (initalbuf, 1, BIGBUF-1, fd)) < 0)
131 log ("procart: read error");
132
133 if (debuglvl > 8)
134 {
135 sprintf (lbuf, "read: %d", r);
136 log (lbuf);
137 }
138 crlf (initalbuf, r);
139
140 /* Write a just-read block */
141 for (gg = gh; gg != NULL; gg = gg->mbuf_next)
142 if (((struct groups *)gg->cbuf)->artfd != NULL)
143 fwrite (initalbuf, 1, r,((struct groups *)gg->cbuf)->artfd);
144 }
145 }
146
147 /* Close all the open files */
148 for (gg = gh; gg != NULL; gg = gg->mbuf_next)
149 if (((struct groups *)gg->cbuf)->artfd != NULL)
150 {
151 fclose (((struct groups *)gg->cbuf)->artfd);
152 ((struct groups *)gg->cbuf)->artfd = NULL;
153 }
154
155 /* free the mbuf list, use 'free' because the cbufs are simple */
156 if (mh != NULL)
157 mfree (mh, free);
158 }
159
160
161
162 /* This next bit is a attempt to lessen the disk fragmentation that seems to
163 occur when spooling news. It seeks to the maximum length that a article
164 may be and then writes a byte. It then rewinds. Hopefully, contiguous
165 blocks will be allocated */
166
167 int extendfile (gh, origlength, lbuf)
168 struct mbuf *gh;
169 long origlength;
170 char lbuf[];
171 {
172 register struct mbuf *gg;
173
174 for (gg = gh; gg != NULL; gg = gg->mbuf_next)
175 if (((struct groups *)gg->cbuf)->artfd != NULL)
176 {
177 if (lseek (fileno (((struct groups *)gg->cbuf)->artfd),
178 origlength-1, 0) == -1)
179 {
180 sprintf (lbuf, "Couldn't seek %ld %d",
181 origlength-1, errno);
182 log (lbuf);
183 }
184
185 write (fileno (((struct groups *)gg->cbuf)->artfd), space, 1);
186
187 if (lseek (fileno (((struct groups *)gg->cbuf)->artfd), 0L, 0)
188 == -1)
189 {
190 sprintf (lbuf, "Couldn't seek back %ld %d",
191 origlength, errno);
192 log (lbuf);
193 }
194 }
195 }
196
197
198
199 int lineis (lbuf, initalbuf)
200 char lbuf[], *initalbuf;
201 {
202 strncat (strcpy (lbuf, "LINE IS '"), initalbuf, 20);
203 log (lbuf);
204 }