comparison 3rdparty/packages/uucpbb/src/openarts.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 /* openarts.c - Open a number of articles, if possible.
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 int debuglvl;
30 char *fixgroupname();
31
32
33 int openarts (g, gname)
34 struct mbuf *g;
35 char *gname;
36 {
37 char lbuf[512], gpath[200];
38 char *p, *ngroups, *np, *ncp;
39 struct mbuf *gp;
40 int havegroup = FALSE;
41
42 /* Allocate some space for the group name stuff */
43 ngroups = (char *)malloc (strlen (gname) + 2);
44
45 if (ngroups == NULL)
46 fatal ("openarts(): can't malloc copy of newsgroup name");
47
48 sprintf (ngroups, "%s\n", gname);
49 np = ngroups;
50
51 /* Loop until we run out of given articles */
52 while (*np != '\0' && *np != '\l' && *np != '\n')
53 {
54 /* Search for the terminator or separator character */
55 for (ncp = np;
56 *ncp != ',' && *ncp != '\0' && *ncp != '\l' && *ncp != '\n';
57 ncp++);
58 {
59 *ncp = '\0';
60 }
61
62 /* Loop through the groups that are at this particular site, see if
63 there is a match */
64
65 for (gp = g; gp != NULL; gp = gp->mbuf_next)
66 {
67 if (debuglvl > 4)
68 {
69 sprintf (lbuf, "Checking group '%s' and '%s'", np,
70 ((struct groups *)gp->cbuf)->name);
71 log (lbuf);
72 }
73
74 /* Ok, this group matched */
75 if (strcmp(((struct groups *)gp->cbuf)->name, np) == 0)
76 {
77 char *gname;
78
79 gname = NULL;
80 havegroup = TRUE;
81
82 if (chdir (newsdir) == ERROR)
83 {
84 sprintf (lbuf, "Can't chdir to '%s'", newsdir);
85 log (lbuf);
86 return (ABORT);
87 }
88
89 /* Make the directory path for this news group, if it
90 doesn't exist */
91
92 gname = fixgroupname (np);
93 makepath (gname);
94
95 if (gname != NULL)
96 {
97 free (gname);
98 gname = NULL;
99 }
100
101 /* Form this particular article. We should already be in
102 the correct newsgroup's directory. */
103
104 ((struct groups *)gp->cbuf)->max++;
105 sprintf (gpath, "a%d", ((struct groups *)gp->cbuf)->max);
106
107 if (debuglvl > 3)
108 {
109 sprintf (lbuf, "Trying: '%s' in '%s'", gpath,
110 ((struct groups *)gp->cbuf)->name);
111 log (lbuf);
112 }
113
114 /* Try to open the article, this should truncate any files
115 that are the same name */
116
117 if ((((struct groups *)gp->cbuf)->artfd
118 = fopen (gpath, "w")) == NULL)
119 {
120 sprintf (lbuf, "Couldn't open '%s', because %d",
121 gpath, errno);
122 log (lbuf);
123 }
124 else
125 {
126 np = ncp + 1;
127 break;
128 }
129 }
130 }
131 np = ncp + 1;
132 }
133
134 /* Ok, this article doesn't go to any of the groups at this site */
135 if (!havegroup)
136 {
137 if (debuglvl > 1)
138 {
139 log ("Article doesn't go to any news groups in active file.");
140 log ("Junking it.");
141 }
142
143 for (gp = g; gp != NULL; gp = gp->mbuf_next)
144 {
145 if (strncmp (((struct groups *)gp->cbuf)->name, "junk" ,4) == 0)
146 {
147 np = ((struct groups *)gp->cbuf)->name;
148 if (chdir (newsdir) == ERROR)
149 {
150 sprintf (lbuf, "Can't chdir to '%s'", newsdir);
151 log (lbuf);
152 return (ABORT);
153 }
154 makepath (np);
155 ((struct groups *)gp->cbuf)->max++;
156 sprintf (gpath, "Z%d", ((struct groups *)gp->cbuf)->max);
157
158 for (p = gpath; *p != '\0'; p++)
159 if (*p == '.')
160 *p='/';
161
162 if (debuglvl > 3)
163 {
164 sprintf (lbuf, "Trying: '%s' in '%s'",
165 gpath, ((struct groups *)gp->cbuf)->name);
166 log(lbuf);
167 }
168
169 if ((((struct groups *)gp->cbuf)->artfd
170 = fopen (gpath, "w")) == NULL)
171 {
172 sprintf (lbuf, "Couldn't open '%s', because %d",
173 gpath, errno);
174 log (lbuf);
175 }
176 break;
177 }
178 }
179
180 /* This really indicates that there is a problem in the universe.
181 Every site should have a 'junk' group */
182
183 if (gp == NULL)
184 if (debuglvl > 1)
185 log ("No junk group.....");
186 }
187 free (ngroups);
188 }