1 /* util.c
2 A couple of UUCP utility functions.
3
4 Copyright (C) 1991, 1992, 1993, 2002 Ian Lance Taylor
5
6 This file is part of the Taylor UUCP package.
7
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2 of the
11 License, or (at your option) any later version.
12
13 This program 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 General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; 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.
23 */
24
25 #include "uucp.h"
26
27 #if USE_RCS_ID
28 const char util_rcsid[] = "$FreeBSD$";
29 #endif
30
31 #include <ctype.h>
32
33 #include "uudefs.h"
34 #include "uuconf.h"
35 #include "system.h"
36
37 /* Get information for an unknown system. This will leave the name
38 allocated on the heap. We could fix this by breaking the
39 abstraction and adding the name to qsys->palloc. It makes sure the
40 name is not too long, but takes no other useful action. */
41
42 boolean
funknown_system(puuconf,zsystem,qsys)43 funknown_system (puuconf, zsystem, qsys)
44 pointer puuconf;
45 const char *zsystem;
46 struct uuconf_system *qsys;
47 {
48 char *z;
49 int iuuconf;
50
51 if (strlen (zsystem) <= cSysdep_max_name_len)
52 z = zbufcpy (zsystem);
53 else
54 {
55 char **pznames, **pz;
56 boolean ffound;
57
58 z = zbufalc (cSysdep_max_name_len + 1);
59 memcpy (z, zsystem, cSysdep_max_name_len);
60 z[cSysdep_max_name_len] = '\0';
61
62 iuuconf = uuconf_system_names (puuconf, &pznames, TRUE);
63 if (iuuconf != UUCONF_SUCCESS)
64 ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
65
66 ffound = FALSE;
67 for (pz = pznames; *pz != NULL; pz++)
68 {
69 if (strcmp (*pz, z) == 0)
70 ffound = TRUE;
71 xfree ((pointer) *pz);
72 }
73 xfree ((pointer) pznames);
74
75 if (ffound)
76 {
77 ubuffree (z);
78 return FALSE;
79 }
80 }
81
82 iuuconf = uuconf_system_unknown (puuconf, qsys);
83 if (iuuconf == UUCONF_NOT_FOUND)
84 {
85 ubuffree (z);
86 return FALSE;
87 }
88 else if (iuuconf != UUCONF_SUCCESS)
89 ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
90
91 for (; qsys != NULL; qsys = qsys->uuconf_qalternate)
92 qsys->uuconf_zname = z;
93
94 return TRUE;
95 }
96
97 /* Remove all occurrences of the local system name followed by an
98 exclamation point from the front of a string, returning the new
99 string. This is used by uucp and uux. */
100
101 char *
zremove_local_sys(qlocalsys,z)102 zremove_local_sys (qlocalsys, z)
103 struct uuconf_system *qlocalsys;
104 char *z;
105 {
106 size_t clen;
107 char *zexclam;
108
109 clen = strlen (qlocalsys->uuconf_zname);
110 zexclam = strchr (z, '!');
111 while (zexclam != NULL)
112 {
113 if (z == zexclam
114 || ((size_t) (zexclam - z) == clen
115 && strncmp (z, qlocalsys->uuconf_zname, clen) == 0))
116 ;
117 else if (qlocalsys->uuconf_pzalias == NULL)
118 break;
119 else
120 {
121 char **pzal;
122
123 for (pzal = qlocalsys->uuconf_pzalias; *pzal != NULL; pzal++)
124 if (strlen (*pzal) == (size_t) (zexclam - z)
125 && strncmp (z, *pzal, (size_t) (zexclam - z)) == 0)
126 break;
127 if (*pzal == NULL)
128 break;
129 }
130 z = zexclam + 1;
131 zexclam = strchr (z, '!');
132 }
133
134 return z;
135 }
136
137 /* See whether a file is in a directory list, and make sure the user
138 has appropriate access. */
139
140 boolean
fin_directory_list(zfile,pzdirs,zpubdir,fcheck,freadable,zuser)141 fin_directory_list (zfile, pzdirs, zpubdir, fcheck, freadable, zuser)
142 const char *zfile;
143 char **pzdirs;
144 const char *zpubdir;
145 boolean fcheck;
146 boolean freadable;
147 const char *zuser;
148 {
149 boolean fmatch;
150 char **pz;
151
152 fmatch = FALSE;
153
154 for (pz = pzdirs; *pz != NULL; pz++)
155 {
156 char *zuse;
157
158 if (pz[0][0] == '!')
159 {
160 zuse = zsysdep_local_file (*pz + 1, zpubdir, (boolean *) NULL);
161 if (zuse == NULL)
162 return FALSE;
163
164 if (fsysdep_in_directory (zfile, zuse, FALSE,
165 FALSE, (const char *) NULL))
166 fmatch = FALSE;
167 }
168 else
169 {
170 zuse = zsysdep_local_file (*pz, zpubdir, (boolean *) NULL);
171 if (zuse == NULL)
172 return FALSE;
173
174 if (fsysdep_in_directory (zfile, zuse, fcheck,
175 freadable, zuser))
176 fmatch = TRUE;
177 }
178
179 ubuffree (zuse);
180 }
181
182 return fmatch;
183 }
184