Find a port in the Taylor UUCP configuration files.
Copyright (C) 1992 Ian Lance Taylor
This file is part of the Taylor UUCP uuconf library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License
as published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
const char _uuconf_tport_rcsid
[] = "$Id: tport.c,v 1.1 1993/08/04 19:35:15 jtc Exp $";
static int ipport
P((pointer pglobal
, int argc
, char **argv
, pointer pvar
,
static int ipunknown
P((pointer pglobal
, int argc
, char **argv
,
pointer pvar
, pointer pinfo
));
/* Find a port in the Taylor UUCP configuration files by name, baud
rate, and special purpose function. */
uuconf_taylor_find_port (pglobal
, zname
, ibaud
, ihighbaud
, pifn
, pinfo
,
int (*pifn
) P((struct uuconf_port
*, pointer
));
struct uuconf_port
*qport
;
struct sglobal
*qglobal
= (struct sglobal
*) pglobal
;
for (pz
= qglobal
->qprocess
->pzportfiles
; *pz
!= NULL
; pz
++)
struct uuconf_cmdtab as
[2];
struct uuconf_port sdefault
;
iret
= UUCONF_FOPEN_FAILED
| UUCONF_ERROR_ERRNO
;
/* Gather the default information from the top of the file. We
do this by handling the "port" command ourselves and passing
every other command to _uuconf_iport_cmd via ipunknown. The
value of zport will be an malloc block. */
as
[0].uuconf_zcmd
= "port";
as
[0].uuconf_itype
= UUCONF_CMDTABTYPE_FN
| 2;
as
[0].uuconf_pvar
= (pointer
) &zport
;
as
[0].uuconf_pifn
= ipport
;
as
[1].uuconf_zcmd
= NULL
;
pblock
= uuconf_malloc_block ();
iret
= UUCONF_MALLOC_FAILED
| UUCONF_ERROR_ERRNO
;
_uuconf_uclear_port (&sdefault
);
sdefault
.uuconf_palloc
= pblock
;
iret
= uuconf_cmd_file (pglobal
, e
, as
, (pointer
) &sdefault
,
ipunknown
, UUCONF_CMDTABFLAG_BACKSLASH
,
if (iret
!= UUCONF_SUCCESS
)
/* Now skip until we find a port with a matching name. If the
zname argument is NULL, we will have to read every port. */
uuconf_cmdtabfn piunknown
;
if (zname
== NULL
|| strcmp (zname
, zport
) == 0)
qport
->uuconf_zname
= zport
;
ilineno
= qglobal
->ilineno
;
iret
= uuconf_cmd_file (pglobal
, e
, as
, (pointer
) qport
,
piunknown
, UUCONF_CMDTABFLAG_BACKSLASH
,
qglobal
->ilineno
+= ilineno
;
if (iret
!= UUCONF_SUCCESS
)
/* We may have just gathered information about a port. See
if it matches the name, the baud rate and the special
if (qport
->uuconf_ttype
== UUCONF_PORTTYPE_MODEM
)
long imbaud
, imhigh
, imlow
;
imbaud
= qport
->uuconf_u
.uuconf_smodem
.uuconf_ibaud
;
imhigh
= qport
->uuconf_u
.uuconf_smodem
.uuconf_ihighbaud
;
imlow
= qport
->uuconf_u
.uuconf_smodem
.uuconf_ilowbaud
;
if (imbaud
== 0 && imlow
== 0)
else if (ibaud
<= imbaud
&& imbaud
<= ihighbaud
)
else if (qport
->uuconf_ttype
== UUCONF_PORTTYPE_DIRECT
)
idbaud
= qport
->uuconf_u
.uuconf_sdirect
.uuconf_ibaud
;
if (idbaud
!= 0 && idbaud
!= ibaud
)
iret
= (*pifn
) (qport
, pinfo
);
if (iret
== UUCONF_NOT_FOUND
)
else if (iret
!= UUCONF_SUCCESS
)
if (uuconf_add_block (pblock
, zfree
) == 0)
iret
= UUCONF_MALLOC_FAILED
| UUCONF_ERROR_ERRNO
;
if (iret
!= UUCONF_NOT_FOUND
)
uuconf_free_block (pblock
);
if (iret
!= UUCONF_SUCCESS
&& pblock
!= NULL
)
uuconf_free_block (pblock
);
if (iret
!= UUCONF_SUCCESS
&& iret
!= UUCONF_NOT_FOUND
)
qglobal
->zfilename
= *pz
;
iret
|= UUCONF_ERROR_FILENAME
;
/* Handle a "port" command. This copies the string onto the heap and
returns the pointer in *pvar. It returns UUCONF_CMDTABRET_EXIT to
force uuconf_cmd_file to stop reading and return to the code above,
which will then check the port just read to see if it matches. */
ipport (pglobal
, argc
, argv
, pvar
, pinfo
)
struct sglobal
*qglobal
= (struct sglobal
*) pglobal
;
char **pz
= (char **) pvar
;
csize
= strlen (argv
[1]) + 1;
return (UUCONF_MALLOC_FAILED
| UUCONF_CMDTABRET_EXIT
);
memcpy ((pointer
) *pz
, (pointer
) argv
[1], csize
);
return UUCONF_CMDTABRET_EXIT
;
/* Handle an unknown command by passing it on to _uuconf_iport_cmd,
which will parse it into the port structure. */
ipunknown (pglobal
, argc
, argv
, pvar
, pinfo
)
struct sglobal
*qglobal
= (struct sglobal
*) pglobal
;
struct uuconf_port
*qport
= (struct uuconf_port
*) pinfo
;
return _uuconf_iport_cmd (qglobal
, argc
, argv
, qport
);