#include "uucnfi.h"
#if USE_RCS_ID
const char _uuconf_callin_rcsid[] = "$Id: callin.c,v 1.14 2002/03/05 19:10:42 ian Rel $";
#endif
#include <errno.h>
static int ipcheck P((pointer pglobal, int argc, char **argv,
pointer pvar, pointer pinfo));
struct sinfo
{
int (*pcmpfn) P((int, pointer, const char *));
pointer pinfo;
boolean ffound;
boolean fmatched;
};
int
uuconf_callin (pglobal, pcmpfn, pinfo)
pointer pglobal;
int (*pcmpfn) P((int, pointer, const char *));
pointer pinfo;
{
struct sglobal *qglobal = (struct sglobal *) pglobal;
int iret;
char **pz;
struct uuconf_cmdtab as[1];
struct sinfo s;
char *zline;
size_t cline;
if (qglobal->qprocess->pzpwdfiles == NULL)
{
char ab[sizeof NEWCONFIGLIB + sizeof PASSWDFILE - 1];
memcpy ((pointer) ab, (pointer) NEWCONFIGLIB,
sizeof NEWCONFIGLIB - 1);
memcpy ((pointer) (ab + sizeof NEWCONFIGLIB - 1), (pointer) PASSWDFILE,
sizeof PASSWDFILE);
iret = _uuconf_iadd_string (qglobal, ab, TRUE, FALSE,
&qglobal->qprocess->pzpwdfiles,
qglobal->pblock);
if (iret != UUCONF_SUCCESS)
return iret;
}
as[0].uuconf_zcmd = NULL;
s.pcmpfn = pcmpfn;
s.pinfo = pinfo;
s.ffound = FALSE;
s.fmatched = FALSE;
zline = NULL;
cline = 0;
iret = UUCONF_SUCCESS;
for (pz = qglobal->qprocess->pzpwdfiles; *pz != NULL; pz++)
{
FILE *e;
e = fopen (*pz, "r");
if (e == NULL)
{
if (FNO_SUCH_FILE ())
continue;
qglobal->ierrno = errno;
iret = UUCONF_FOPEN_FAILED | UUCONF_ERROR_ERRNO;
break;
}
qglobal->ilineno = 0;
iret = UUCONF_SUCCESS;
while (getline (&zline, &cline, e) > 0)
{
char *z0, *z1;
++qglobal->ilineno;
z0 = strchr (zline, ':');
if (z0 != NULL)
{
*z0 = ' ';
z1 = strchr (z0, ':');
if (z1 != NULL)
{
if (z1 - z0 == 1)
continue;
*z1 = '\0';
if (strchr (z0 + 1, ' ') != NULL)
continue;
}
}
iret = uuconf_cmd_line (pglobal, zline, as, (pointer) &s,
ipcheck, 0, (pointer) NULL);
if ((iret & UUCONF_CMDTABRET_EXIT) != 0)
{
iret &=~ UUCONF_CMDTABRET_EXIT;
if (iret != UUCONF_SUCCESS)
iret |= UUCONF_ERROR_LINENO;
break;
}
iret = UUCONF_SUCCESS;
}
(void) fclose (e);
if (iret != UUCONF_SUCCESS || s.ffound)
break;
}
if (zline != NULL)
free ((pointer) zline);
if (iret != UUCONF_SUCCESS)
{
qglobal->zfilename = *pz;
iret |= UUCONF_ERROR_FILENAME;
}
else if (! s.ffound || ! s.fmatched)
iret = UUCONF_NOT_FOUND;
return iret;
}
static int
ipcheck (pglobal, argc, argv, pvar, pinfo)
pointer pglobal ATTRIBUTE_UNUSED;
int argc;
char **argv;
pointer pvar ATTRIBUTE_UNUSED;
pointer pinfo;
{
struct sinfo *q = (struct sinfo *) pinfo;
if (argc != 2)
return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
if (! (*q->pcmpfn) (0, q->pinfo, argv[0]))
return UUCONF_CMDTABRET_CONTINUE;
q->ffound = TRUE;
q->fmatched = (*q->pcmpfn) (1, q->pinfo, argv[1]) != 0;
return UUCONF_CMDTABRET_EXIT;
}