#include "uucp.h"
#if USE_RCS_ID
const char parse_rcsid[] = "$Id: parse.c,v 1.11 2002/03/05 19:10:42 ian Rel $";
#endif
#include "uudefs.h"
static void ulunquote_cmd P((struct scmd *qcmd));
boolean
fparse_cmd (zcmd, qcmd)
char *zcmd;
struct scmd *qcmd;
{
char *z, *zend;
z = strtok (zcmd, " \t\n");
if (z == NULL)
return FALSE;
qcmd->bcmd = *z;
if (qcmd->bcmd != 'S'
&& qcmd->bcmd != 'R'
&& qcmd->bcmd != 'X'
&& qcmd->bcmd != 'E'
&& qcmd->bcmd != 'H'
&& qcmd->bcmd != 'P')
return FALSE;
qcmd->bgrade = '\0';
qcmd->pseq = NULL;
qcmd->zfrom = NULL;
qcmd->zto = NULL;
qcmd->zuser = NULL;
qcmd->zoptions = NULL;
qcmd->ztemp = NULL;
qcmd->imode = 0666;
qcmd->znotify = NULL;
qcmd->cbytes = -1;
qcmd->zcmd = NULL;
qcmd->ipos = 0;
if (qcmd->bcmd == 'H')
{
if (z[1] != '\0')
{
if (z[1] == 'Y')
qcmd->bcmd = 'Y';
else if (z[1] == 'N')
qcmd->bcmd = 'N';
else
return FALSE;
}
return TRUE;
}
if (qcmd->bcmd == 'P')
return TRUE;
if (z[1] != '\0')
return FALSE;
z = strtok ((char *) NULL, " \t\n");
if (z == NULL)
return FALSE;
qcmd->zfrom = z;
z = strtok ((char *) NULL, " \t\n");
if (z == NULL)
return FALSE;
qcmd->zto = z;
z = strtok ((char *) NULL, " \t\n");
if (z == NULL)
return FALSE;
qcmd->zuser = z;
z = strtok ((char *) NULL, " \t\n");
if (z == NULL || *z != '-')
return FALSE;
qcmd->zoptions = z + 1;
if (qcmd->bcmd == 'X')
{
ulunquote_cmd (qcmd);
return TRUE;
}
if (qcmd->bcmd == 'R')
{
z = strtok ((char *) NULL, " \t\n");
if (z != NULL)
{
if (strcmp (z, "dummy") != 0)
{
qcmd->cbytes = strtol (z, &zend, 0);
if (*zend != '\0')
qcmd->cbytes = -1;
}
else
{
if (strtok ((char *) NULL, " \t\n") != NULL
&& strtok ((char *) NULL, " \t\n") != NULL
&& strtok ((char *) NULL, " \t\n") != NULL)
{
z = strtok ((char *) NULL, " \t\n");
if (z != NULL)
{
qcmd->ipos = strtol (z, &zend, 0);
if (*zend != '\0')
qcmd->ipos = 0;
}
}
}
}
ulunquote_cmd (qcmd);
return TRUE;
}
z = strtok ((char *) NULL, " \t\n");
if (z == NULL)
return FALSE;
qcmd->ztemp = z;
z = strtok ((char *) NULL, " \t\n");
if (z == NULL)
return FALSE;
qcmd->imode = (int) strtol (z, &zend, 0);
if (*zend != '\0')
return FALSE;
if (qcmd->imode == 666)
qcmd->imode = 0666;
else if (qcmd->imode == 777)
qcmd->imode = 0777;
z = strtok ((char *) NULL, " \t\n");
if (qcmd->bcmd == 'E' && z == NULL)
return FALSE;
qcmd->znotify = z;
if (z != NULL && strcmp (z, "dummy") == 0)
z = strtok ((char *) NULL, " \t\n");
if (z != NULL)
{
z = strtok ((char *) NULL, " \t\n");
if (z != NULL)
{
qcmd->cbytes = strtol (z, &zend, 0);
if (*zend != '\0')
qcmd->cbytes = -1;
}
else if (qcmd->bcmd == 'E')
return FALSE;
if (z != NULL)
{
z = strtok ((char *) NULL, "");
if (z != NULL)
z[strcspn (z, "\n")] = '\0';
if (qcmd->bcmd == 'E' && z == NULL)
return FALSE;
qcmd->zcmd = z;
}
}
ulunquote_cmd (qcmd);
return TRUE;
}
static void
ulunquote_cmd (qcmd)
struct scmd *qcmd;
{
if (qcmd->zoptions == NULL || strchr (qcmd->zoptions, 'q') == NULL)
return;
if (qcmd->zfrom != NULL)
(void) cescape ((char *) qcmd->zfrom);
if (qcmd->zto != NULL)
(void) cescape ((char *) qcmd->zto);
if (qcmd->zuser != NULL)
(void) cescape ((char *) qcmd->zuser);
if (qcmd->znotify != NULL)
(void) cescape ((char *) qcmd->znotify);
if (qcmd->zcmd != NULL)
(void) cescape ((char *) qcmd->zcmd);
}