]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - gnu/libexec/uucp/libuuconf/rdlocs.c
This commit was generated by cvs2svn to compensate for changes in r53796,
[FreeBSD/FreeBSD.git] / gnu / libexec / uucp / libuuconf / rdlocs.c
1 /* rdlocs.c
2    Get the locations of systems in the Taylor UUCP configuration files.
3
4    Copyright (C) 1992 Ian Lance Taylor
5
6    This file is part of the Taylor UUCP uuconf library.
7
8    This library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Library General Public License
10    as published by the Free Software Foundation; either version 2 of
11    the License, or (at your option) any later version.
12
13    This library is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Library General Public License for more details.
17
18    You should have received a copy of the GNU Library General Public
19    License along with this library; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21
22    The author of the program may be contacted at ian@airs.com or
23    c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
24    */
25
26 #include "uucnfi.h"
27
28 #if USE_RCS_ID
29 const char _uuconf_rdlocs_rcsid[] = "$FreeBSD$";
30 #endif
31
32 #include <errno.h>
33 \f
34 static int itsystem P((pointer pglobal, int argc, char **argv,
35                        pointer pvar, pointer pinfo));
36 static int itcalled_login P((pointer pglobal, int argc, char **argv,
37                              pointer pvar, pointer pinfo));
38 static int itmyname P((pointer pglobal, int argc, char **argv,
39                        pointer pvar, pointer pinfo));
40 \f
41 /* This code scans through the Taylor UUCP system files in order to
42    locate each system and to gather the login restrictions (since this
43    information is held in additional arguments to the "called-login"
44    command, it can appear anywhere in the systems files).  It also
45    records whether any "myname" appears, as an optimization for
46    uuconf_taylor_localname.
47
48    This table is used to dispatch the appropriate commands.  Most
49    commands are simply ignored.  Note that this is a uuconf_cmdtab,
50    not a cmdtab_offset.  */
51
52 static const struct uuconf_cmdtab asTcmds[] =
53 {
54   { "system", UUCONF_CMDTABTYPE_FN | 2, NULL, itsystem },
55   { "alias", UUCONF_CMDTABTYPE_FN | 2, (pointer) asTcmds, itsystem },
56   { "called-login", UUCONF_CMDTABTYPE_FN | 0, NULL, itcalled_login },
57   { "myname", UUCONF_CMDTABTYPE_FN | 2, NULL, itmyname },
58   { NULL, 0, NULL, NULL }
59 };
60
61 /* This structure is used to pass information into the command table
62    functions.  */
63
64 struct sinfo
65 {
66   /* The sys file name.  */
67   const char *zname;
68   /* The open sys file.  */
69   FILE *e;
70   /* The list of locations we are building.  */
71   struct stsysloc *qlocs;
72   /* The list of validation restrictions we are building.  */
73   struct svalidate *qvals;
74 };
75 \f
76 /* Look through the sys files to find the location and names of all
77    the systems.  Since we're scanning the sys files, we also record
78    the validation information specified by the additional arguments to
79    the called-login command.  We don't use uuconf_cmd_file to avoid
80    the overhead of breaking the line up into arguments if not
81    necessary.  */
82
83 int
84 _uuconf_iread_locations (qglobal)
85      struct sglobal *qglobal;
86 {
87   char *zline;
88   size_t cline;
89   struct sinfo si;
90   int iret;
91   char **pz;
92
93   if (qglobal->qprocess->fread_syslocs)
94     return UUCONF_SUCCESS;
95
96   zline = NULL;
97   cline = 0;
98
99   si.qlocs = NULL;
100   si.qvals = NULL;
101
102   iret = UUCONF_SUCCESS;
103
104   for (pz = qglobal->qprocess->pzsysfiles; *pz != NULL; pz++)
105     {
106       FILE *e;
107       int cchars;
108
109       qglobal->ilineno = 0;
110
111       e = fopen (*pz, "r");
112       if (e == NULL)
113         {
114           if (FNO_SUCH_FILE ())
115             continue;
116           qglobal->ierrno = errno;
117           iret = UUCONF_FOPEN_FAILED | UUCONF_ERROR_ERRNO;
118           break;
119         }
120
121 #ifdef CLOSE_ON_EXEC
122       CLOSE_ON_EXEC (e);
123 #endif
124
125       si.zname = *pz;
126       si.e = e;
127
128       while ((cchars = _uuconf_getline (qglobal, &zline, &cline, e)) > 0)
129         {
130           char *zcmd;
131
132           ++qglobal->ilineno;
133
134           zcmd = zline + strspn (zline, " \t");
135           if (strncasecmp (zcmd, "system", sizeof "system" - 1) == 0
136               || strncasecmp (zcmd, "alias", sizeof "alias" - 1) == 0
137               || strncasecmp (zcmd, "called-login",
138                               sizeof "called-login" - 1) == 0
139               || strncasecmp (zcmd, "myname", sizeof "myname" - 1) == 0)
140             {
141               iret = uuconf_cmd_line ((pointer) qglobal, zline, asTcmds,
142                                       (pointer) &si, (uuconf_cmdtabfn) NULL,
143                                       0, qglobal->pblock);
144               if ((iret & UUCONF_CMDTABRET_KEEP) != 0)
145                 {
146                   iret &=~ UUCONF_CMDTABRET_KEEP;
147                   zline = NULL;
148                   cline = 0;
149                 }
150               if (iret != UUCONF_SUCCESS)
151                 {
152                   iret &=~ UUCONF_CMDTABRET_EXIT;
153                   break;
154                 }
155             }
156         }
157
158       if (iret != UUCONF_SUCCESS)
159         break;
160     }
161
162   if (zline != NULL)
163     free ((pointer) zline);
164
165   if (iret != UUCONF_SUCCESS)
166     {
167       qglobal->zfilename = *pz;
168       iret |= UUCONF_ERROR_FILENAME | UUCONF_ERROR_LINENO;
169       if (UUCONF_ERROR_VALUE (iret) != UUCONF_MALLOC_FAILED)
170         qglobal->qprocess->fread_syslocs = TRUE;
171     }
172   else
173     {
174       qglobal->qprocess->qsyslocs = si.qlocs;
175       qglobal->qprocess->qvalidate = si.qvals;
176       qglobal->qprocess->fread_syslocs = TRUE;
177     }   
178
179   return iret;
180 }
181 \f
182 /* Handle a "system" or "alias" command by recording the file and
183    location.  If pvar is not NULL, this is an "alias" command.  */
184
185 /*ARGSUSED*/
186 static int
187 itsystem (pglobal, argc, argv, pvar, pinfo)
188      pointer pglobal;
189      int argc;
190      char **argv;
191      pointer pvar;
192      pointer pinfo;
193 {
194   struct sglobal *qglobal = (struct sglobal *) pglobal;
195   struct sinfo *qinfo = (struct sinfo *) pinfo;
196   struct stsysloc *q;
197   size_t csize;
198
199   q = (struct stsysloc *) uuconf_malloc (qglobal->pblock,
200                                          sizeof (struct stsysloc));
201   if (q == NULL)
202     {
203       qglobal->ierrno = errno;
204       return (UUCONF_MALLOC_FAILED
205               | UUCONF_ERROR_ERRNO
206               | UUCONF_CMDTABRET_EXIT);
207     }
208
209   csize = strlen (argv[1]) + 1;
210   q->zname = uuconf_malloc (qglobal->pblock, csize);
211   if (q->zname == NULL)
212     {
213       qglobal->ierrno = errno;
214       return (UUCONF_MALLOC_FAILED
215               | UUCONF_ERROR_ERRNO
216               | UUCONF_CMDTABRET_EXIT);
217     }
218
219   q->qnext = qinfo->qlocs;
220   memcpy ((pointer) q->zname, (pointer) argv[1], csize);
221   q->falias = pvar != NULL;
222   q->zfile = qinfo->zname;
223   q->e = qinfo->e;
224   q->iloc = ftell (qinfo->e);
225   q->ilineno = qglobal->ilineno;
226
227   qinfo->qlocs = q;
228
229   return UUCONF_CMDTABRET_CONTINUE;
230 }
231
232 /* Handle the "called-login" command.  This just records any extra
233    arguments, so that uuconf_validate can check them later if
234    necessary.  */
235
236 /*ARGSUSED*/
237 static int
238 itcalled_login (pglobal, argc, argv, pvar, pinfo)
239      pointer pglobal;
240      int argc;
241      char **argv;
242      pointer pvar;
243      pointer pinfo;
244 {
245   struct sglobal *qglobal = (struct sglobal *) pglobal;
246   struct sinfo *qinfo = (struct sinfo *) pinfo;
247   register struct svalidate *qval;
248   int i;
249
250   if (argc <= 2)
251     return UUCONF_CMDTABRET_CONTINUE;
252
253   for (qval = qinfo->qvals; qval != NULL; qval = qval->qnext)
254     if (strcmp (argv[1], qval->zlogname) == 0)
255       break;
256
257   if (qval == NULL)
258     {
259       qval = (struct svalidate *) uuconf_malloc (qglobal->pblock,
260                                                  sizeof (struct svalidate));
261       if (qval == NULL)
262         {
263           qglobal->ierrno = errno;
264           return (UUCONF_MALLOC_FAILED
265                   | UUCONF_ERROR_ERRNO
266                   | UUCONF_CMDTABRET_EXIT);
267         }
268
269       qval->qnext = qinfo->qvals;
270       qval->zlogname = argv[1];
271       qval->pzmachines = NULL;
272
273       qinfo->qvals = qval;
274     }
275
276   for (i = 2; i < argc; i++)
277     {
278       int iret;
279
280       iret = _uuconf_iadd_string (qglobal, argv[i], FALSE, TRUE,
281                                   &qval->pzmachines, qglobal->pblock);
282       if (iret != UUCONF_SUCCESS)
283         return iret | UUCONF_CMDTABRET_EXIT;
284     }
285
286   return UUCONF_CMDTABRET_KEEP;
287 }
288
289 /* Handle the "myname" command by simply recording that it appears.
290    This information is used by uuconf_taylor_localname.  */
291
292 /*ARGSUSED*/
293 static int
294 itmyname (pglobal, argc, argv, pvar, pinfo)
295      pointer pglobal;
296      int argc;
297      char **argv;
298      pointer pvar;
299      pointer pinfo;
300 {
301   struct sglobal *qglobal = (struct sglobal *) pglobal;
302
303   qglobal->qprocess->fuses_myname = TRUE;
304   return UUCONF_CMDTABRET_CONTINUE;
305 }