176 lines
4.6 KiB
C
176 lines
4.6 KiB
C
/* paramc.c
|
||
Handle protocol-parameter commands.
|
||
|
||
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.
|
||
*/
|
||
|
||
#include "uucnfi.h"
|
||
|
||
#if USE_RCS_ID
|
||
const char _uuconf_paramc_rcsid[] = "$Id: paramc.c,v 1.1 1993/08/04 19:34:51 jtc Exp $";
|
||
#endif
|
||
|
||
#include <errno.h>
|
||
|
||
/* Handle protocol-parameter commands by inserting them into an array
|
||
of structures. The return value may include UUCONF_CMDTABRET_KEEP
|
||
and UUCONF_CMDTABRET_EXIT, if appropriate. */
|
||
|
||
int
|
||
_uuconf_iadd_proto_param (qglobal, argc, argv, pqparam, pblock)
|
||
struct sglobal *qglobal;
|
||
int argc;
|
||
char **argv;
|
||
struct uuconf_proto_param **pqparam;
|
||
pointer pblock;
|
||
{
|
||
struct uuconf_proto_param *q;
|
||
size_t c;
|
||
struct uuconf_proto_param_entry *qentry;
|
||
|
||
if (argc < 2)
|
||
return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
|
||
|
||
/* The first argument is the protocol character. */
|
||
if (argv[0][1] != '\0')
|
||
return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
|
||
|
||
if (*pqparam == NULL)
|
||
{
|
||
*pqparam = ((struct uuconf_proto_param *)
|
||
uuconf_malloc (pblock,
|
||
2 * sizeof (struct uuconf_proto_param)));
|
||
if (*pqparam == NULL)
|
||
{
|
||
qglobal->ierrno = errno;
|
||
return (UUCONF_MALLOC_FAILED
|
||
| UUCONF_ERROR_ERRNO
|
||
| UUCONF_CMDTABRET_EXIT);
|
||
}
|
||
(*pqparam)[1].uuconf_bproto = '\0';
|
||
q = *pqparam;
|
||
q->uuconf_bproto = argv[0][0];
|
||
q->uuconf_qentries = NULL;
|
||
}
|
||
else
|
||
{
|
||
c = 0;
|
||
for (q = *pqparam; q->uuconf_bproto != '\0'; q++)
|
||
{
|
||
if (q->uuconf_bproto == argv[0][0])
|
||
break;
|
||
++c;
|
||
}
|
||
|
||
if (q->uuconf_bproto == '\0')
|
||
{
|
||
struct uuconf_proto_param *qnew;
|
||
|
||
qnew = ((struct uuconf_proto_param *)
|
||
uuconf_malloc (pblock,
|
||
((c + 2)
|
||
* sizeof (struct uuconf_proto_param))));
|
||
if (qnew == NULL)
|
||
{
|
||
qglobal->ierrno = errno;
|
||
return (UUCONF_MALLOC_FAILED
|
||
| UUCONF_ERROR_ERRNO
|
||
| UUCONF_CMDTABRET_EXIT);
|
||
}
|
||
|
||
memcpy ((pointer) qnew, (pointer) *pqparam,
|
||
c * sizeof (struct uuconf_proto_param));
|
||
qnew[c + 1].uuconf_bproto = '\0';
|
||
|
||
uuconf_free (pblock, *pqparam);
|
||
*pqparam = qnew;
|
||
|
||
q = qnew + c;
|
||
q->uuconf_bproto = argv[0][0];
|
||
q->uuconf_qentries = NULL;
|
||
}
|
||
}
|
||
|
||
if (q->uuconf_qentries == NULL)
|
||
{
|
||
qentry = ((struct uuconf_proto_param_entry *)
|
||
uuconf_malloc (pblock,
|
||
2 * sizeof (struct uuconf_proto_param_entry)));
|
||
if (qentry == NULL)
|
||
{
|
||
qglobal->ierrno = errno;
|
||
return (UUCONF_MALLOC_FAILED
|
||
| UUCONF_ERROR_ERRNO
|
||
| UUCONF_CMDTABRET_EXIT);
|
||
}
|
||
|
||
qentry[1].uuconf_cargs = 0;
|
||
q->uuconf_qentries = qentry;
|
||
}
|
||
else
|
||
{
|
||
struct uuconf_proto_param_entry *qnewent;
|
||
|
||
c = 0;
|
||
for (qentry = q->uuconf_qentries; qentry->uuconf_cargs != 0; qentry++)
|
||
++c;
|
||
|
||
qnewent = ((struct uuconf_proto_param_entry *)
|
||
uuconf_malloc (pblock,
|
||
((c + 2) *
|
||
sizeof (struct uuconf_proto_param_entry))));
|
||
if (qnewent == NULL)
|
||
{
|
||
qglobal->ierrno = errno;
|
||
return (UUCONF_MALLOC_FAILED
|
||
| UUCONF_ERROR_ERRNO
|
||
| UUCONF_CMDTABRET_EXIT);
|
||
}
|
||
|
||
memcpy ((pointer) qnewent, (pointer) q->uuconf_qentries,
|
||
c * sizeof (struct uuconf_proto_param_entry));
|
||
qnewent[c + 1].uuconf_cargs = 0;
|
||
|
||
uuconf_free (pblock, q->uuconf_qentries);
|
||
q->uuconf_qentries = qnewent;
|
||
|
||
qentry = qnewent + c;
|
||
}
|
||
|
||
qentry->uuconf_cargs = argc - 1;
|
||
qentry->uuconf_pzargs = (char **) uuconf_malloc (pblock,
|
||
((argc - 1)
|
||
* sizeof (char *)));
|
||
if (qentry->uuconf_pzargs == NULL)
|
||
{
|
||
qglobal->ierrno = errno;
|
||
qentry->uuconf_cargs = 0;
|
||
return (UUCONF_MALLOC_FAILED
|
||
| UUCONF_ERROR_ERRNO
|
||
| UUCONF_CMDTABRET_EXIT);
|
||
}
|
||
memcpy ((pointer) qentry->uuconf_pzargs, (pointer) (argv + 1),
|
||
(argc - 1) * sizeof (char *));
|
||
|
||
return UUCONF_CMDTABRET_KEEP;
|
||
}
|