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