From: Ian Beckwith Date: Sat, 28 Jan 2012 22:52:42 +0000 (+0000) Subject: 030_fix-if-else: pop patch X-Git-Url: http://erislabs.net/gitweb/?p=ckermit.git;a=commitdiff_plain;h=078fa1ca577352acdb52f8e990c0e370a8841641 030_fix-if-else: pop patch --- diff --git a/.pc/030_fix-if-else.patch/.timestamp b/.pc/030_fix-if-else.patch/.timestamp deleted file mode 100644 index e69de29..0000000 diff --git a/.pc/030_fix-if-else.patch/ckuus6.c b/.pc/030_fix-if-else.patch/ckuus6.c deleted file mode 100644 index 5dcd828..0000000 --- a/.pc/030_fix-if-else.patch/ckuus6.c +++ /dev/null @@ -1,10878 +0,0 @@ -#include "ckcsym.h" -#ifndef NOICP - -/* C K U U S 6 -- "User Interface" for Unix Kermit (Part 6) */ - -/* - Authors: - Frank da Cruz , - The Kermit Project, Columbia University, New York City - Jeffrey E Altman - Secure Endpoints Inc., New York City - - Copyright (C) 1985, 2004, - Trustees of Columbia University in the City of New York. - All rights reserved. See the C-Kermit COPYING.TXT file or the - copyright text in the ckcmai.c module for disclaimer and permissions. -*/ - -/* Includes */ - -#include "ckcdeb.h" -#include "ckcasc.h" -#include "ckcker.h" -#include "ckuusr.h" -#include "ckcxla.h" -#include "ckcnet.h" /* Network symbols */ -#include - -#ifdef VMS -#ifndef TCPSOCKET -#include -#endif /* TCPSOCKET */ -#endif /* VMS */ - -#ifdef datageneral -#define fgets(stringbuf,max,fd) dg_fgets(stringbuf,max,fd) -#endif /* datageneral */ - -#ifdef QNX6 -#define readblock kreadblock -#endif /* QNX6 */ - -/* External Kermit Variables, see ckmain.c for description. */ - -extern xx_strp xxstring; - -extern int local, xitsta, binary, parity, escape, flow, cmd_rows, turn, - turnch, duplex, ckxech, seslog, dfloc, cnflg, tlevel, pflag, msgflg, mdmtyp, - zincnt, quiet, repars, techo, network, nzxopts, what, filepeek, recursive; - -extern int xaskmore, tt_rows, tt_cols, cmd_cols, g_matchdot, diractive, - xcmdsrc, nscanfile, reliable, nolinks; - -#ifdef VMSORUNIX -extern int zgfs_dir, zgfs_link; -#endif /* VMSORUNIX */ - -#ifdef CK_IFRO - extern int remonly; -#endif /* CK_IFRO */ - -#ifdef OS2 -extern int StartedFromDialer ; -extern int vmode; -extern int k95stdout; -#ifndef NT -#define INCL_NOPM -#define INCL_VIO /* Needed for ckocon.h */ -#include -#undef COMMENT -#else -#define APIRET ULONG -#include -#include -#include "ckntap.h" -#endif /* NT */ -#include "ckocon.h" -#endif /* OS2 */ - -extern long vernum, speed; -extern char *versio, *protv, *ckxv, *ckzv, *fnsv, *connv, *dftty, *cmdv; -extern char *dialv, *loginv, *for_def[], *whil_def[], *xif_def[], *sw_def[]; -extern char *foz_def[]; -extern char *ckxsys, *ckzsys; -#ifndef OS2 -extern char *DIRCMD; -#ifndef UNIX -extern char *DELCMD; -#endif /* UNIX */ -#endif /* OS2 */ -extern char ttname[], filnam[]; -extern CHAR sstate, feol; -extern char *zinptr; - -#ifdef UNIX -extern char ** mtchs; /* zxpand() file list */ -#endif /* UNIX */ - -#ifndef NOXFER -extern int oopts, omode, oname, opath; /* O-Packet options */ - -extern int stdinf, sndsrc, size, rpsiz, urpsiz, fncnv, fnrpath, displa, - stdouf, isguest, pktlog, nfils, keep, maxrps, fblksiz, frecl, frecfm, - atcapr, atdiso, spsizf, spsiz, spsizr, spmax, wslotr, prefixing, - fncact, fnspath, nprotos, g_proto, g_urpsiz, g_spsizf, - g_spsiz, g_spsizr, g_spmax, g_wslotr, g_prefixing, g_fncact, g_fncnv, - g_fnspath, g_fnrpath, xfrxla, g_xfrxla; - -extern char *cmarg, *cmarg2; - -#ifndef NOMSEND /* Multiple SEND */ -extern char *msfiles[]; -#endif /* NOMSEND */ -extern char fspec[]; /* Most recent filespec */ -extern int fspeclen; - -#ifdef CK_TMPDIR -extern int f_tmpdir; /* Directory changed temporarily */ -extern char savdir[]; /* For saving current directory */ -#endif /* CK_TMPDIR */ - -extern struct keytab protos[]; /* File transfer protocols */ -extern struct ck_p ptab[NPROTOS]; -#endif /* NOXFER */ - -#ifdef DCMDBUF /* Declarations from cmd package */ -extern char *cmdbuf, *atmbuf; /* Command buffers */ -#else -extern char cmdbuf[], atmbuf[]; /* Command buffers */ -#endif /* DCMDBUF */ - -extern int nopush; - -#ifndef NOSPL -int askflag = 0; /* ASK-class command active */ -extern char **a_ptr[]; -extern int a_dim[]; -extern char **m_xarg[]; -extern int n_xarg[]; -extern struct mtab *mactab; -extern int nmac; -extern long ck_alarm; -extern char alrm_date[], alrm_time[]; -extern int x_ifnum; -#endif /* NOSPL */ - -extern int inserver; /* I am IKSD */ -extern int backgrd; /* Kermit executing in background */ -extern char psave[]; /* For saving & restoring prompt */ -extern char *tp; /* Temporary buffer */ - -int readblock = 4096; /* READ buffer size */ -CHAR * readbuf = NULL; /* Pointer to read buffer */ -int readsize = 0; /* Number of chars actually read */ -int getcmd = 0; /* GET-class command was given */ - -extern int zchkod, zchkid; - -struct keytab deltab[] = { /* DELETE Command Options */ - { "/all", DEL_ALL, CM_INV }, - { "/after", DEL_AFT, CM_ARG }, - { "/ask", DEL_ASK, 0 }, - { "/before", DEL_BEF, CM_ARG }, - { "/directories", DEL_DIR, 0 }, - { "/dotfiles", DEL_DOT, 0 }, - { "/except", DEL_EXC, CM_ARG }, - { "/heading", DEL_HDG, 0 }, - { "/l", DEL_LIS, CM_INV|CM_ABR }, - { "/larger-than", DEL_LAR, CM_ARG }, - { "/list", DEL_LIS, 0 }, - { "/log", DEL_LIS, CM_INV }, - { "/noask", DEL_NAS, 0 }, - { "/nodotfiles", DEL_NOD, 0 }, - { "/noheading", DEL_NOH, 0 }, - { "/nol", DEL_NOL, CM_INV|CM_ABR }, - { "/nolist", DEL_NOL, 0 }, - { "/nolog", DEL_NOL, CM_INV }, - { "/nopage", DEL_NOP, 0 }, - { "/not-after", DEL_NAF, CM_ARG }, - { "/not-before", DEL_NBF, CM_ARG }, - { "/not-since", DEL_NAF, CM_INV|CM_ARG }, - { "/page", DEL_PAG, 0 }, - { "/quiet", DEL_QUI, CM_INV }, - { "/recursive", DEL_REC, 0 }, - { "/simulate", DEL_SIM, 0 }, - { "/since", DEL_AFT, CM_ARG|CM_INV }, - { "/smaller-than", DEL_SMA, CM_ARG }, - { "/summary", DEL_SUM, 0 }, - { "/tree", DEL_ALL, 0 }, - { "/type", DEL_TYP, CM_ARG }, - { "/verbose", DEL_VRB, CM_INV } -}; -int ndeltab = sizeof(deltab)/sizeof(struct keytab); - -/* /QUIET-/VERBOSE (/LIST-/NOLIST) (/LOG-/NOLOG) table */ - -struct keytab qvswtab[] = { - { "/l", DEL_LIS, CM_INV|CM_ABR }, - { "/list", DEL_LIS, 0 }, - { "/log", DEL_LIS, CM_INV }, - { "/nol", DEL_NOL, CM_INV|CM_ABR }, - { "/nolist", DEL_NOL, 0 }, - { "/nolog", DEL_NOL, CM_INV }, - { "/quiet", DEL_QUI, CM_INV }, - { "/verbose", DEL_VRB, CM_INV } -}; -int nqvswtab = sizeof(qvswtab)/sizeof(struct keytab); - -struct keytab copytab[] = { - { "/append", 998, 0 }, -#ifndef NOSPL - { "/fromb64", 997, 0 }, -#endif /* NOSPL */ - { "/l", DEL_LIS, CM_INV|CM_ABR }, - { "/list", DEL_LIS, 0 }, - { "/log", DEL_LIS, CM_INV }, - { "/nol", DEL_NOL, CM_INV|CM_ABR }, - { "/nolist", DEL_NOL, 0 }, - { "/nolog", DEL_NOL, CM_INV }, - { "/quiet", DEL_QUI, CM_INV }, - { "/swap-bytes", 999, 0 }, -#ifndef NOSPL - { "/tob64", 996, 0 }, -#endif /* NOSPL */ - { "/verbose", DEL_VRB, CM_INV } -}; -int ncopytab = sizeof(copytab)/sizeof(struct keytab); - -#ifndef NOXFER -static struct keytab gettab[] = { /* GET options */ - { "/as-name", SND_ASN, CM_ARG }, - { "/binary", SND_BIN, 0 }, -#ifdef CALIBRATE - { "/calibrate", SND_CAL, CM_INV }, -#endif /* CALIBRATE */ -#ifdef PIPESEND - { "/command", SND_CMD, CM_PSH }, -#endif /* PIPESEND */ - { "/delete", SND_DEL, 0 }, - { "/except", SND_EXC, CM_ARG }, - { "/filenames", SND_NAM, CM_ARG }, -#ifdef PIPESEND - { "/filter", SND_FLT, CM_ARG|CM_PSH }, -#endif /* PIPESEND */ -#ifdef VMS - { "/image", SND_IMG, 0 }, - { "/labeled", SND_LBL, 0 }, -#else - { "/image", SND_BIN, CM_INV }, -#endif /* VMS */ -#ifdef CK_TMPDIR - { "/move-to", SND_MOV, CM_ARG }, -#endif /* CK_TMPDIR */ - { "/pathnames", SND_PTH, CM_ARG }, - { "/pipes", SND_PIP, CM_ARG|CM_PSH }, - { "/quiet", SND_SHH, 0 }, -#ifdef CK_RESEND - { "/recover", SND_RES, 0 }, -#endif /* CK_RESEND */ - { "/recursive", SND_REC, 0 }, - { "/rename-to", SND_REN, CM_ARG }, -#ifdef COMMENT - { "/smaller-than", SND_SMA, CM_ARG }, -#endif /* COMMENT */ - { "/subdirectories", SND_REC, CM_INV }, - { "/text", SND_TXT, 0 }, - { "/transparent", SND_XPA, 0 } -}; -#define NGETTAB sizeof(gettab)/sizeof(struct keytab) -static int ngettab = NGETTAB; - -static struct keytab rcvtab[] = { /* RECEIVE options */ - { "/as-name", SND_ASN, CM_ARG }, - { "/binary", SND_BIN, 0 }, -#ifdef CALIBRATE - { "/calibrate", SND_CAL, CM_INV }, -#endif /* CALIBRATE */ -#ifdef PIPESEND - { "/command", SND_CMD, CM_PSH }, -#endif /* PIPESEND */ - { "/except", SND_EXC, CM_ARG }, - { "/filenames", SND_NAM, CM_ARG }, -#ifdef PIPESEND - { "/filter", SND_FLT, CM_ARG|CM_PSH }, -#endif /* PIPESEND */ -#ifdef VMS - { "/image", SND_IMG, 0 }, - { "/labeled", SND_LBL, 0 }, -#else - { "/image", SND_BIN, CM_INV }, -#endif /* VMS */ -#ifdef CK_TMPDIR - { "/move-to", SND_MOV, CM_ARG }, -#endif /* CK_TMPDIR */ - { "/pathnames", SND_PTH, CM_ARG }, - { "/pipes", SND_PIP, CM_ARG|CM_PSH }, -#ifdef CK_XYZ - { "/protocol", SND_PRO, CM_ARG }, -#else - { "/protocol", SND_PRO, CM_ARG|CM_INV }, -#endif /* CK_XYZ */ - { "/quiet", SND_SHH, 0 }, - { "/recursive", SND_REC, 0 }, - { "/rename-to", SND_REN, CM_ARG }, - { "/text", SND_TXT, 0 }, - { "/transparent", SND_XPA, 0 } -}; -#define NRCVTAB sizeof(rcvtab)/sizeof(struct keytab) -static int nrcvtab = NRCVTAB; -#endif /* NOXFER */ - -/* WAIT table */ - -#define WAIT_FIL 997 -#define WAIT_MDM 998 - -struct keytab waittab[] = { - { "cd", BM_DCD, CM_INV }, /* (Carrier Detect) */ - { "cts", BM_CTS, CM_INV }, /* (Clear To Send) */ - { "dsr", BM_DSR, CM_INV }, /* (Data Set Ready) */ - { "file", WAIT_FIL, 0 }, /* New category selector keywords */ - { "modem-signals", WAIT_MDM, 0 }, /* ... */ - { "ri", BM_RNG, CM_INV } /* (Ring Indicator) */ -}; -int nwaittab = (sizeof(waittab) / sizeof(struct keytab)); - -/* Modem signal table */ - -struct keytab mstab[] = { - { "cd", BM_DCD, 0 }, /* Carrier Detect */ - { "cts", BM_CTS, 0 }, /* Clear To Send */ - { "dsr", BM_DSR, 0 }, /* Data Set Ready */ - { "ri", BM_RNG, 0 } /* Ring Indicator */ -}; -int nms = (sizeof(mstab) / sizeof(struct keytab)); - -#define WF_MOD 1 -#define WF_DEL 2 -#define WF_CRE 3 - -struct keytab wfswi[] = { /* WAIT FILE switches */ - { "creation", WF_CRE, 0 }, /* Wait for file to be created */ - { "deletion", WF_DEL, 0 }, /* Wait for file to be deleted */ - { "modification", WF_MOD, 0 } /* Wait for file to be modified */ -}; -int nwfswi = (sizeof(wfswi) / sizeof(struct keytab)); - -#ifndef NOSPL -struct keytab asgtab[] = { /* Assignment operators for "." */ - { "::=", 2, 0 }, /* ASSIGN and EVALUATE */ - { ":=", 1, 0 }, /* ASSIGN */ - { "=", 0, 0 } /* DEFINE */ -}; -int nasgtab = (sizeof(asgtab) / sizeof(struct keytab)); - -struct keytab opntab[] = { -#ifndef NOPUSH - { "!read", OPN_PI_R, CM_INV }, - { "!write", OPN_PI_W, CM_INV }, -#endif /* NOPUSH */ - { "append", OPN_FI_A, 0 }, - { "host", OPN_NET, 0 }, -#ifdef OS2 - { "line", OPN_SER, CM_INV }, - { "port", OPN_SER, 0 }, -#else - { "line", OPN_SER, 0 }, - { "port", OPN_SER, CM_INV }, -#endif /* OS2 */ - { "read", OPN_FI_R, 0 }, - { "write", OPN_FI_W, 0 } -}; -int nopn = (sizeof(opntab) / sizeof(struct keytab)); - -/* IF conditions */ - -#define XXIFCO 0 /* IF COUNT */ -#define XXIFER 1 /* IF ERRORLEVEL */ -#define XXIFEX 2 /* IF EXIST */ -#define XXIFFA 3 /* IF FAILURE */ -#define XXIFSU 4 /* IF SUCCESS */ -#define XXIFNO 5 /* IF NOT */ -#define XXIFDE 6 /* IF DEFINED */ -#define XXIFEQ 7 /* IF EQUAL (strings) */ -#define XXIFAE 8 /* IF = (numbers) */ -#define XXIFLT 9 /* IF < (numbers) */ -#define XXIFGT 10 /* IF > (numbers) */ -#define XXIFLL 11 /* IF Lexically Less Than (strings) */ -#define XXIFLG 12 /* IF Lexically Greater Than (strings) */ -#define XXIFEO 13 /* IF EOF (READ file) */ -#define XXIFBG 14 /* IF BACKGROUND */ -#define XXIFNU 15 /* IF NUMERIC */ -#define XXIFFG 16 /* IF FOREGROUND */ -#define XXIFDI 17 /* IF DIRECTORY */ -#define XXIFNE 18 /* IF NEWER */ -#define XXIFRO 19 /* IF REMOTE-ONLY */ -#define XXIFAL 20 /* IF ALARM */ -#define XXIFSD 21 /* IF STARTED-FROM-DIALER */ -#define XXIFTR 22 /* IF TRUE */ -#define XXIFNT 23 /* IF FALSE */ -#define XXIFTM 24 /* IF TERMINAL-MACRO */ -#define XXIFEM 25 /* IF EMULATION */ -#define XXIFOP 26 /* IF OPEN */ -#define XXIFLE 27 /* IF <= */ -#define XXIFGE 28 /* IF >= */ -#define XXIFIP 29 /* IF INPATH */ -#define XXIFTA 30 /* IF TAPI */ -#define XXIFMA 31 /* IF MATCH */ -#define XXIFFL 32 /* IF FLAG */ -#define XXIFAB 33 /* IF ABSOLUTE */ -#define XXIFAV 34 /* IF AVAILABLE */ -#define XXIFAT 35 /* IF ASKTIMEOUT */ -#define XXIFRD 36 /* IF READABLE */ -#define XXIFWR 37 /* IF WRITEABLE */ -#define XXIFAN 38 /* IF ... AND ... */ -#define XXIFOR 39 /* IF ... OR ... */ -#define XXIFLP 40 /* IF left parenthesis */ -#define XXIFRP 41 /* IF right parenthesis */ -#define XXIFNQ 42 /* IF != (== "NOT =") */ -#define XXIFQU 43 /* IF QUIET */ -#define XXIFCK 44 /* IF C-KERMIT */ -#define XXIFK9 45 /* IF K-95 */ -#define XXIFMS 46 /* IF MS-KERMIT */ -#define XXIFWI 47 /* IF WILD */ -#define XXIFLO 48 /* IF LOCAL */ -#define XXIFCM 49 /* IF COMMAND */ -#define XXIFFP 50 /* IF FLOAT */ -#define XXIFIK 51 /* IF IKS */ -#define XXIFKB 52 /* IF KBHIT */ -#define XXIFKG 53 /* IF KERBANG */ -#define XXIFVE 54 /* IF VERSION */ -#define XXIFDC 55 /* IF DECLARED */ -#define XXIFGU 56 /* IF GUI */ - -struct keytab iftab[] = { /* IF commands */ - { "!", XXIFNO, 0 }, - { "!=", XXIFNQ, 0 }, - { "&&", XXIFAN, 0 }, - { "(", XXIFLP, 0 }, - { ")", XXIFRP, 0 }, - { "<", XXIFLT, 0 }, - { "<=", XXIFLE, 0 }, - { "=", XXIFAE, 0 }, - { "==", XXIFAE, CM_INV }, - { ">", XXIFGT, 0 }, - { ">=", XXIFGE, 0 }, - { "absolute", XXIFAB, 0 }, - { "alarm", XXIFAL, 0 }, - { "and", XXIFAN, 0 }, - { "asktimeout", XXIFAT, 0 }, - { "available", XXIFAV, 0 }, - { "background", XXIFBG, 0 }, - { "c-kermit", XXIFCK, 0 }, - { "command", XXIFCM, 0 }, - { "count", XXIFCO, 0 }, - { "dcl", XXIFDC, CM_INV }, - { "declared", XXIFDC, 0 }, - { "defined", XXIFDE, 0 }, -#ifdef CK_TMPDIR - { "directory", XXIFDI, 0 }, -#endif /* CK_TMPDIR */ - { "emulation", XXIFEM, 0 }, -#ifdef COMMENT - { "eof", XXIFEO, 0 }, -#endif /* COMMENT */ - { "equal", XXIFEQ, 0 }, - { "error", XXIFFA, CM_INV }, - { "exist", XXIFEX, 0 }, - { "failure", XXIFFA, 0 }, - { "false", XXIFNT, 0 }, - { "flag", XXIFFL, 0 }, -#ifdef CKFLOAT - { "float", XXIFFP, 0 }, -#endif /* CKFLOAT */ - { "foreground", XXIFFG, 0 }, -#ifdef OS2 - { "gui", XXIFGU, 0 }, -#else - { "gui", XXIFGU, CM_INV }, -#endif /* OS2 */ -#ifdef IKSD - { "iksd", XXIFIK, 0 }, -#else - { "iksd", XXIFIK, CM_INV }, -#endif /* IKSD */ - { "integer", XXIFNU, CM_INV }, - { "k-95", XXIFK9, 0 }, - { "kbhit", XXIFKB, 0 }, -#ifdef UNIX - { "kerbang", XXIFKG, 0 }, -#else - { "kerbang", XXIFKG, CM_INV }, -#endif /* UNIX */ - { "lgt", XXIFLG, 0 }, - { "llt", XXIFLL, 0 }, - { "local", XXIFLO, 0 }, - { "match", XXIFMA, 0 }, - { "ms-kermit", XXIFMS, CM_INV }, -#ifdef ZFCDAT - { "newer", XXIFNE, 0 }, -#endif /* ZFCDAT */ - { "not", XXIFNO, 0 }, - { "numeric", XXIFNU, 0 }, - { "ok", XXIFSU, CM_INV }, - { "open", XXIFOP, 0 }, - { "or", XXIFOR, 0 }, - { "quiet", XXIFQU, 0 }, - { "readable", XXIFRD, 0 }, - { "remote-only",XXIFRO, 0 }, - { "started-from-dialer",XXIFSD, CM_INV }, - { "success", XXIFSU, 0 }, - { "tapi", XXIFTA, 0 }, -#ifdef OS2 - { "terminal-macro", XXIFTM, 0 }, -#else - { "terminal-macro", XXIFTM, CM_INV }, -#endif /* OS2 */ - { "true", XXIFTR, 0 }, - { "version", XXIFVE, 0 }, - { "wild", XXIFWI, 0 }, - { "writeable", XXIFWR, 0 }, - { "||", XXIFOR, 0 }, - { "", 0, 0 } -}; -int nif = (sizeof(iftab) / sizeof(struct keytab)) - 1; - -struct keytab iotab[] = { /* Keywords for IF OPEN */ - { "!read-file", ZRFILE, CM_INV }, - { "!write-file", ZWFILE, CM_INV }, - { "append-file", ZWFILE, CM_INV }, - { "connection", 8888, 0 }, -#ifdef CKLOGDIAL - { "cx-log", 7777, 0 }, -#endif /* CKLOGDIAL */ - { "debug-log", ZDFILE, 0 }, - { "error", 9999, 0 }, - { "packet-log", ZPFILE, 0 }, - { "read-file", ZRFILE, 0 }, - { "screen", ZSTDIO, 0 }, - { "session-log", ZSFILE, 0 }, - { "transaction-log", ZTFILE, 0 }, - { "write-file", ZWFILE, 0 } -}; -int niot = (sizeof(iotab) / sizeof(struct keytab)); -#endif /* NOSPL */ - -/* Variables and prototypes */ - -#ifdef NETCONN -extern int nnetdir; /* How many network directories */ -#endif /* NETCONN */ -#ifdef CK_SECURITY -_PROTOTYP(int ck_krb4_is_installed,(void)); -_PROTOTYP(int ck_krb5_is_installed,(void)); -_PROTOTYP(int ck_ntlm_is_installed,(void)); -_PROTOTYP(int ck_srp_is_installed,(void)); -_PROTOTYP(int ck_ssleay_is_installed,(void)); -_PROTOTYP(int ck_ssh_is_installed,(void)); -_PROTOTYP(int ck_crypt_is_installed,(void)); -#else -#define ck_krb4_is_installed() (0) -#define ck_krb5_is_installed() (0) -#define ck_ntlm_is_installed() (0) -#define ck_srp_is_installed() (0) -#define ck_ssleay_is_installed() (0) -#define ck_ssh_is_installed() (0) -#define ck_crypt_is_installed() (0) -#endif /* CK_SECURITY */ - -#define AV_KRB4 1 -#define AV_KRB5 2 -#define AV_NTLM 3 -#define AV_SRP 4 -#define AV_SSL 5 -#define AV_CRYPTO 6 -#define AV_SSH 7 - -struct keytab availtab[] = { /* Available authentication types */ - { "crypto", AV_CRYPTO, CM_INV }, /* and encryption */ - { "encryption", AV_CRYPTO, 0 }, - { "k4", AV_KRB4, CM_INV }, - { "k5", AV_KRB5, CM_INV }, - { "kerberos4", AV_KRB4, 0 }, - { "kerberos5", AV_KRB5, 0 }, - { "krb4", AV_KRB4, CM_INV }, - { "krb5", AV_KRB5, CM_INV }, - { "ntlm", AV_NTLM, 0 }, - { "srp", AV_SRP, 0 }, - { "ssh", AV_SSH, 0 }, - { "ssl", AV_SSL, 0 }, - { "tls", AV_SSL, 0 }, - { "", 0, 0 } -}; -int availtabn = sizeof(availtab)/sizeof(struct keytab)-1; - -#ifndef NODIAL -_PROTOTYP(static int ddcvt, (char *, FILE *, int) ); -_PROTOTYP(static int dncvt, (int, int, int, int) ); -_PROTOTYP(char * getdname, (void) ); - -static int partial = 0; /* For partial dial */ -static char *dscopy = NULL; -int dialtype = -1; - -char *dialnum = (char *)0; /* Remember DIAL number for REDIAL */ -int dirline = 0; /* Dial directory line number */ -extern char * dialdir[]; /* Dial directory file names */ -extern int dialdpy; /* DIAL DISPLAY on/off */ -extern int ndialdir; /* How many dial directories */ -extern int ntollfree; /* Toll-free call info */ -extern int ndialpxx; /* List of PBX exchanges */ -extern char *dialtfc[]; -char * matchpxx = NULL; /* PBX exchange that matched */ -extern int nlocalac; /* Local area-code list */ -extern char * diallcac[]; -extern int tttapi; -#ifdef CK_TAPI -extern int tapiconv; /* TAPI Conversions */ -extern int tapipass; /* TAPI Passthrough */ -#endif /* CK_TAPI */ -extern int dialatmo; -extern char * dialnpr, * dialsfx; -extern char * dialixp, * dialixs, * dialmac; -extern char * dialldp, * diallds, * dialtfp; -extern char * dialpxi, * dialpxo, * diallac; -extern char * diallcp, * diallcs, * diallcc; -extern char * dialpxx[]; - -extern int dialcnf; /* DIAL CONFIRMATION */ -int dialfld = 0; /* DIAL FORCE-LONG-DISTANCE */ -int dialsrt = 1; /* DIAL SORT ON */ -int dialrstr = 6; /* DIAL RESTRICTION */ -int dialtest = 0; /* DIAL TEST */ -int dialcount = 0; /* \v(dialcount) */ - -extern int dialsta; /* Dial status */ -int dialrtr = -1, /* Dial retries */ - dialint = 10; /* Dial retry interval */ -extern long dialcapas; /* Modem capabilities */ -extern int dialcvt; /* DIAL CONVERT-DIRECTORY */ -#endif /* NODIAL */ - -#ifndef NOSPL -#define IFCONDLEN 256 -int ifc, /* IF case */ - not = 0, /* Flag for IF NOT */ - ifargs = 0; /* Count of IF condition words */ -char ifcond[IFCONDLEN]; /* IF condition text */ -char *ifcp; /* Pointer to IF condition text */ -#ifdef DCMDBUF -extern int - *ifcmd, *count, *iftest, *intime, - *inpcas, *takerr, *merror, *xquiet; -#else -extern int ifcmd[]; /* Last command was IF */ -extern int iftest[]; /* Last IF was true */ -extern int count[]; /* For IF COUNT, one for each cmdlvl */ -extern int intime[]; /* Ditto for other stackables... */ -extern int inpcas[]; -extern int takerr[]; -extern int merror[]; -extern int xquiet[]; -#endif /* DCMDBUF */ -#else -extern int takerr[]; -#endif /* NOSPL */ - -#ifdef DCMDBUF -extern char *line; /* Character buffer for anything */ -extern char *tmpbuf; -#else -extern char line[], tmpbuf[]; -#endif /* DCMDBUF */ -extern char *lp; /* Pointer to line buffer */ - -int cwdf = 0; /* CWD has been done */ - -/* Flags for ENABLE/DISABLE */ -extern int en_cwd, en_cpy, en_del, en_dir, en_fin, - en_get, en_hos, en_ren, en_sen, en_set, en_spa, en_typ, en_who, en_bye, - en_asg, en_que, en_ret, en_mai, en_pri, en_mkd, en_rmd, en_xit, en_ena; - -extern FILE *tfile[]; /* File pointers for TAKE command */ -extern char *tfnam[]; /* Names of TAKE files */ -extern int tfline[]; /* TAKE-file line number */ - -extern int success; /* Command success/failure flag */ -extern int cmdlvl; /* Current position in command stack */ - -#ifndef NOSPL -extern int maclvl; /* Macro to execute */ -extern char *macx[]; /* Index of current macro */ -extern char *mrval[]; /* Macro return value */ -extern char *macp[]; /* Pointer to macro */ -extern int macargc[]; /* ARGC from macro invocation */ - -#ifdef COMMENT -extern char *m_line[]; -#endif /* COMMENT */ - -extern char *m_arg[MACLEVEL][NARGS]; /* Stack of macro arguments */ -extern char *g_var[]; /* Global variables %a, %b, etc */ - -#ifdef DCMDBUF -extern struct cmdptr *cmdstk; /* The command stack itself */ -#else -extern struct cmdptr cmdstk[]; /* The command stack itself */ -#endif /* DCMDBUF */ -#endif /* NOSPL */ - -#define xsystem(s) zsyscmd(s) - -static int x, y, z = 0; -static char *s, *p; - -#ifdef OS2 -_PROTOTYP( int os2settitle, (char *, int) ); -#endif /* OS2 */ - -extern struct keytab yesno[], onoff[], fntab[]; -extern int nyesno, nfntab; - -#ifndef NOSPL - -/* Do the ASK, ASKQ, GETOK, and READ commands */ - -int asktimedout = 0; - -#define ASK_PUP 1 -#define ASK_TMO 2 -#define ASK_GUI 3 -#define ASK_QUI 4 -#define ASK_DEF 5 - -static struct keytab asktab[] = { - { "/default", ASK_DEF, CM_ARG }, - { "/gui", ASK_GUI, -#ifdef KUI - 0 -#else /* KUI */ - CM_INV -#endif /* KUI */ - }, - { "/popup", ASK_PUP, -#ifdef OS2 - 0 -#else /* OS2 */ - CM_INV -#endif /* OS2 */ - }, - { "/quiet", ASK_QUI, 0 }, - { "/timeout", ASK_TMO, CM_ARG }, - { "", 0, 0 } -}; -static int nasktab = sizeof(asktab)/sizeof(struct keytab)-1; - -int -doask(cx) int cx; { - extern int cmflgs, asktimer, timelimit; -#ifdef CK_RECALL - extern int on_recall; -#endif /* CK_RECALL */ - int popupflg = 0; - int guiflg = 0; - int nomsg = 0; - int mytimer = 0; -#ifdef CK_APC - extern int apcactive, apcstatus; -#endif /* CK_APC */ - - char dfbuf[1024]; /* Buffer for default answer */ - char * dfanswer = NULL; /* Pointer to it */ - - char vnambuf[VNAML+1]; /* Buffer for variable names */ - char *vnp = NULL; /* Pointer to same */ - - dfbuf[0] = NUL; - vnambuf[0] = NUL; - -#ifdef CK_APC - if ( apcactive != APC_INACTIVE && (apcstatus & APC_NOINP) ) { - return(success = 0); - } -#endif /* CK_APC */ - - mytimer = asktimer; /* Inherit global ASK timer */ - - if (cx == XXASK || cx == XXASKQ) { - struct FDB sw, fl; - int getval; - char c; - if (cx == XXASKQ) /* Don't log ASKQ response */ - debok = 0; - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "Variable name or switch", - "", /* default */ - "", /* addtl string data */ - nasktab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - asktab, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* Anything that doesn't match */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - NULL, - NULL, - NULL - ); - while (1) { /* Parse 0 or more switches */ - x = cmfdb(&sw); /* Parse something */ - if (x < 0) - return(x); - if (cmresult.fcode != _CMKEY) /* Break out if not a switch */ - break; - c = cmgbrk(); - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - switch (cmresult.nresult) { - case ASK_QUI: - nomsg = 1; - break; - case ASK_PUP: - popupflg = 1; - break; - case ASK_GUI: - guiflg = 1; - break; - case ASK_TMO: { - if ((y = cmnum("seconds","1",10,&x,xxstring)) < 0) - return(y); - if (x < 0) - x = 0; - mytimer = x; - break; - } - case ASK_DEF: { - if ((y = cmfld("Text to supply if reply is empty", - "",&s,xxstring)) < 0) - return(y); - ckstrncpy(dfbuf,s,1024); - dfanswer = dfbuf; - break; - } - default: return(-2); - } - } - /* Have variable name, make copy. */ - ckstrncpy(vnambuf,cmresult.sresult,VNAML); - vnp = vnambuf; - if (vnambuf[0] == CMDQ && - (vnambuf[1] == '%' || vnambuf[1] == '&')) - vnp++; - y = 0; - if (*vnp == '%' || *vnp == '&') { - if ((y = parsevar(vnp,&x,&z)) < 0) - return(y); - } - } else if (cx != XXGOK && cx != XXRDBL) { /* Get variable name */ - if ((y = cmfld("Variable name","",&s,NULL)) < 0) { - if (y == -3) { - printf("?Variable name required\n"); - return(-9); - } else return(y); - } - ckstrncpy(vnambuf,s,VNAML); /* Make a copy. */ - vnp = vnambuf; - if (vnambuf[0] == CMDQ && - (vnambuf[1] == '%' || vnambuf[1] == '&')) - vnp++; - y = 0; - if (*vnp == '%' || *vnp == '&') { - if ((y = parsevar(vnp,&x,&z)) < 0) - return(y); - } - } - if (cx == XXREA || cx == XXRDBL) { /* READ or READBLOCK command */ - if ((y = cmcfm()) < 0) /* Get confirmation */ - return(y); - if (chkfn(ZRFILE) < 1) { /* File open? */ - printf("?Read file not open\n"); - return(success = 0); - } - if (!(s = (char *)readbuf)) { /* Where to read into. */ - printf("?Oops, no READ buffer!\n"); - return(success = 0); - } - y = zsinl(ZRFILE, s, readblock); /* Read a line. */ - debug(F111,"read zsinl",s,y); - if (y < 0) { /* On EOF or other error, */ - zclose(ZRFILE); /* close the file, */ - delmac(vnp,0); /* delete the variable, */ - return(success = 0); /* and return failure. */ - } else { /* Read was OK. */ - readsize = (int) strlen(s); - success = (addmac(vnp,s) < 0 ? 0 : 1); /* Define variable */ - debug(F111,"read addmac",vnp,success); - return(success); /* Return success. */ - } - } - - /* ASK, ASKQ, GETOK, or GETC */ - - if (cx == XXGOK) { /* GETOK can take switches */ - struct FDB sw, fl; - int getval; - char c; - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "Variable name or question prompt", - "", /* default */ - "", /* addtl string data */ - nasktab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - asktab, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* Anything that doesn't match */ - _CMTXT, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - NULL, - NULL, - NULL - ); - while (1) { /* Parse 0 or more switches */ - x = cmfdb(&sw); /* Parse something */ - if (x < 0) - return(x); - if (cmresult.fcode != _CMKEY) /* Break out if not a switch */ - break; - c = cmgbrk(); - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - switch (cmresult.nresult) { - case ASK_PUP: - popupflg = 1; - break; - case ASK_GUI: - guiflg = 1; - break; - case ASK_TMO: { - if ((y = cmnum("seconds","1",10,&x,xxstring)) < 0) - return(y); - if (x < 0) - x = 0; - mytimer = x; - break; - } - case ASK_DEF: { - if ((y = cmfld("Text to supply if reply is empty", - "",&s,xxstring)) < 0) - return(y); - ckstrncpy(dfbuf,s,1024); - dfanswer = dfbuf; - break; - } - case ASK_QUI: - nomsg = 1; - break; - default: return(-2); - } - } - p = cmresult.sresult; - } else - if ((y = cmtxt( -"Prompt,\n\ - enclose in { braces } or \" quotes \" to preserve leading and trailing\n\ - spaces, precede question mark with backslash (\\).", - "",&p,xxstring)) < 0) - return(y); - - if (!p) p = ""; -#ifndef NOLOCAL -#ifdef OS2 - if (popupflg) { /* Popup requested */ - int len = -1; - ckstrncpy(tmpbuf,brstrip(p),TMPBUFSIZ); - p = tmpbuf; - if (cx == XXASK || cx == XXASKQ) { - if (cx == XXASK) - len = popup_readtext(vmode,NULL,p,line,LINBUFSIZ,mytimer); - else - len = popup_readpass(vmode,NULL,p,line,LINBUFSIZ,mytimer); - asktimedout = ( len < 0 && mytimer ); - } else if (cx == XXGOK) { - printf("?Sorry, GETOK /POPUP not implemented yet\n"); - timelimit = 0; - return(-9); - } - if (len >= 0) { - y = addmac(vnp,(char *)line); /* Add it to the macro table. */ - } else if ( asktimedout && dfanswer ) { - y = addmac(vnp,dfanswer); /* Add it to the macro table. */ - asktimedout = 0; - len = 0; - } - timelimit = 0; - return(success = ((len >= 0) && (y >= 0)) && !asktimedout); - } -#ifdef KUI - if (guiflg) { /* GUI requested */ - int rc, n; - char * s1; - s1 = tmpbuf; - n = TMPBUFSIZ-1; - zzstring(brstrip(p),&s1,&n); - p = tmpbuf; - if (cx == XXASK || cx == XXASKQ) { - rc = gui_txt_dialog(NULL,p,(cx == XXASK), - line,LINBUFSIZ,dfanswer,mytimer); - asktimedout = (rc == -1 && mytimer); - if (rc == 1) { - y = addmac(vnp,(char *)line); /* Add it to the macro table. */ - } else if ( asktimedout && dfanswer ) { - y = addmac(vnp,dfanswer); /* Add default to macro table. */ - asktimedout = 0; - rc = 1; - } - timelimit = 0; - return(success = (rc == 1 && (y >= 0)) && !asktimedout); - } else if (cx == XXGOK) { - int x; - x = lookup(yesno,dfanswer,nyesno,NULL); - if (x != 1) x = 2; - rc = uq_ok(NULL, p, 3, NULL, x); - return(success = (rc == 1)); - } - } -#endif /* KUI */ -#endif /* OS2 */ -#endif /* NOLOCAL */ - - concb((char)escape); /* Enter CBREAK mode */ - cmsavp(psave,PROMPTL); /* Save old prompt */ - cmsetp(brstrip(p)); /* Make new prompt */ -reprompt: - if (cx == XXASKQ) { /* For ASKQ, */ - cmini(0); /* no-echo mode. */ - } else { /* For others, regular echoing. */ - cmini(ckxech); - } - askflag = 1; - x = -1; /* This means to reparse. */ - cmflgs = 0; - if (pflag) - prompt(xxstring); /* Issue prompt. */ - - asktimedout = 0; /* Handle timed responses. */ - timelimit = mytimer; -reparse: - cmres(); - if (cx == XXGOK) { /* GETOK */ -#ifdef CK_RECALL - on_recall = 0; -#endif /* CK_RECALL */ - askflag = 0; - /* GETOK uses keyword table */ - x = cmkey(yesno,nyesno,"",dfanswer,xxstring); - if (x < 0) { /* Parse error */ - if (x == -10) { - char * ds; - ds = dfanswer ? dfanswer : "No"; - if (!nomsg) - printf("?Timed out, assuming \"%s\"",ds); - printf("\n"); - asktimedout = 1; - x = lookup(yesno,ds,nyesno,NULL); - if (x != 1) x = 0; - goto gokdone; - } else if (x == -3) { /* No answer? */ - printf("Please respond Yes or No\n"); /* Make them answer */ - cmini(ckxech); - goto reprompt; - } else if (x == -1) { - goto reparse; - } else - goto reprompt; - } - if (cmcfm() < 0) /* Get confirmation */ - goto reparse; - gokdone: - askflag = 0; - cmsetp(psave); /* Restore prompt */ -#ifdef VMS - if (cmdlvl > 0) /* In VMS and not at top level, */ - conres(); /* restore console again. */ -#endif /* VMS */ - timelimit = 0; - return(x); /* Return success or failure */ - } else if (cx == XXGETC /* GETC */ -#ifdef OS2 - || cx == XXGETK /* or GETKEYCODE */ -#endif /* OS2 */ - ) { /* GETC */ - char tmp[16]; - conbin((char)escape); /* Put keyboard in raw mode */ -#ifndef NOSETKEY -#ifdef OS2 - if (cx == XXGETK) { /* GETKEYCODE */ - extern int os2gks; - int t; - t = os2gks; /* Turn off kverb recognition */ - os2gks = 0; - x = congks(timelimit); /* Read a key event, blocking */ - os2gks = t; /* Put back kverb recognition */ - } else /* GETC */ -#endif /* OS2 */ -#endif /* NOSETKEY */ - { - debug(F101,"GETC conchk","",conchk()); - x = coninc(timelimit); /* Just read one character */ - debug(F101,"GETC coninc","",x); - } - concb((char)escape); /* Put keyboard back in cbreak mode */ - if (x > -1) { - if (xcmdsrc == 0) - printf("\r\n"); -#ifdef OS2 - if (cx == XXGETK) { /* GETKEYCODE */ - sprintf(tmp,"%d",x); /* SAFE */ - } else { -#endif /* OS2 */ - tmp[0] = (char) (x & 0xff); - tmp[1] = NUL; -#ifdef OS2 - } -#endif /* OS2 */ - y = addmac(vnp,tmp); /* Add it to the macro table. */ - debug(F111,"getc/getk addmac",vnp,y); - } else y = -1; - cmsetp(psave); /* Restore old prompt. */ - if (x < -1) { - asktimedout = 1; - if (!quiet && !nomsg) - printf("?Timed out"); - printf("\n"); - } - timelimit = 0; - return(success = ((y < 0 ? 0 : 1) && (asktimedout == 0))); - } else { /* ASK or ASKQ */ -#ifdef CK_RECALL - on_recall = 0; -#endif /* CK_RECALL */ - y = cmdgquo(); /* Get current quoting */ - cmdsquo(0); /* Turn off quoting */ - while (x == -1) { /* Prompt till they answer */ - x = cmtxt("Please respond.",dfanswer,&s,NULL); - debug(F111,"ASK cmtxt",s,x); - cmres(); - } - cmdsquo(y); /* Restore previous quoting */ - if (cx == XXASKQ) /* ASKQ must echo CRLF here */ - printf("\r\n"); - if (x == -10 && dfanswer) { /* Don't fail on timeout if */ - s = dfanswer; /* a default was specified */ - asktimedout = 0; /* and don't fail */ - x = 0; - } - if (x < 0) { /* If cmtxt parse error, */ - cmsetp(psave); /* restore original prompt */ -#ifdef VMS - if (cmdlvl > 0) /* In VMS and not at top level, */ - conres(); /* restore console again. */ -#endif /* VMS */ - if (x == -10) { /* Timed out with no response */ - if (!nomsg) - printf("?Timed out"); - printf("\n"); - asktimedout = 1; - if (dfanswer) /* Supply default answer if any */ - s = dfanswer; - success = x = 0; /* (was "x = -9;") */ - } - timelimit = 0; - return(x); /* and return cmtxt's error code. */ - } - if (!s || *s == NUL) { /* If user typed a bare CR, */ - cmsetp(psave); /* Restore old prompt, */ - delmac(vnp,0); /* delete variable if it exists, */ -#ifdef VMS - if (cmdlvl > 0) /* In VMS and not at top level, */ - conres(); /* restore console again. */ -#endif /* VMS */ - timelimit = 0; - return(success = 1); /* and return. */ - } - y = addmac(vnp,s); /* Add it to the macro table. */ - debug(F111,"ask addmac",vnp,y); - cmsetp(psave); /* Restore old prompt. */ -#ifdef VMS - if (cmdlvl > 0) /* In VMS and not at top level, */ - conres(); /* restore console again. */ -#endif /* VMS */ - timelimit = 0; - return(success = (y < 0 ? 0 : 1) && (asktimedout == 0)); - } -} -#endif /* NOSPL */ - -#ifndef NOSPL -int -doincr(cx) int cx; { /* INCREMENT, DECREMENT */ - char vnambuf[VNAML+1]; /* Buffer for variable names */ - int eval = 0; - eval = (cx == XX_DECR || cx == XX_INCR); - - if ((y = cmfld("Variable name","",&s, eval ? xxstring : NULL)) < 0) { - if (y == -3) { - printf("?Variable name required\n"); - return(-9); - } else return(y); - } - ckstrncpy(vnambuf,s,VNAML); - if ((y = cmnum("by amount","1",10,&x,xxstring)) < 0) - return(y); - if ((y = cmcfm()) < 0) - return(y); - - z = (cx == XX_INCR || cx == XXINC) ? 1 : 0; /* Increment or decrement? */ - - if (incvar(vnambuf,x,z) < 0) { - printf("?Variable %s not defined or not numeric\n",vnambuf); - return(success = 0); - } - return(success = 1); -} - -/* Used by doundef() */ -static int -xxundef(s,verbose,simulate) char * s; int verbose, simulate; { - int rc = 0; - if (!s) return(0); - if (*s == CMDQ && *(s+1) == '%') { - char c = *(s+2), * p = NULL; - if (c >= '0' && c <= '9') { - if (maclvl < 0) - p = g_var[c]; - else - p = m_arg[maclvl][c - '0']; - } else { - if (isupper(c)) c += ('a'-'A'); - if (c >= 'a' && c <= 'z') - p = g_var[c]; - } - if (!p) return(-1); - } - if (verbose) - printf(" %s ",s); - if (simulate) { - printf("(SELECTED)\n"); - } else if ((x = delmac(s,1)) > -1) { /* Full name required */ - rc = 1; - if (verbose) printf("(OK)\n"); - } else if (verbose) - printf("(FAILED)\n"); - return(rc); -} - -/* Do the (_)DEFINE, (_)ASSIGN, and UNDEFINE commands */ - -#define UND_MAT 1 -#define UND_VRB 2 -#define UND_EXC 3 -#define UND_SIM 3 - -static struct keytab undefswi[] = { - { "/list", UND_VRB, 0 }, -#ifdef COMMENT - { "/except", UND_EXC, CM_ARG }, -#endif /* COMMENT */ - { "/matching", UND_MAT, 0 }, - { "/simulate", UND_SIM, 0 }, - { "/verbose", UND_VRB, CM_INV } -}; -static int nundefswi = sizeof(undefswi) / sizeof(struct keytab); - -#define UNDEFMAX 64 -static char ** undeflist = NULL; -int -doundef(cx) int cx; { /* UNDEF, _UNDEF */ - int i, j, n, rc = 0, arraymsg = 0; - int domatch = 0, verbose = 0, errors = 0, simulate = 0, flag = 0; - char *vnp, vnbuf[4]; -#ifdef COMMENT - char *except = NULL; -#endif /* COMMENT */ - struct FDB sw, fl; - int getval; - char c; - - if (!undeflist) { /* Allocate list if necessary */ - undeflist = (char **)malloc(UNDEFMAX * sizeof(char *)); - if (!undeflist) { - printf("?Memory allocation failure\n"); - return(-9); - } - for (i = 0; i < UNDEFMAX; i++) - undeflist[i] = NULL; - } - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "Variable name or switch", - "", /* default */ - "", /* addtl string data */ - nundefswi, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - undefswi, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* Anything that doesn't match */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - (cx == XXUNDEF) ? NULL : xxstring, - NULL, - NULL - ); - while (1) { /* Parse 0 or more switches */ - x = cmfdb(&sw); /* Parse something */ - if (x < 0) - return(x); - if (cmresult.fcode != _CMKEY) /* Break out if not a switch */ - break; - c = cmgbrk(); - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - switch (cmresult.nresult) { - case UND_MAT: domatch = 1; break; - case UND_SIM: simulate = 1; /* fall thru on purpose */ - case UND_VRB: verbose = 1; break; - -#ifdef COMMENT - case UND_EXC: - if (!getval) break; - if ((x = cmfld("Pattern","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Pattern required\n"); - x = -9; - } - goto xgetx; - } - makestr(&except,cmresult.sresult); - break; -#endif /* COMMENT */ - - default: - return(-2); - } - } - n = 0; - makestr(&(undeflist[n++]),cmresult.sresult); - for (i = 1; i < UNDEFMAX; i++) { - x = cmfld("Macro or variable name","",&s, - ((cx == XXUNDEF) ? NULL : xxstring) - ); - if (x == -3) { - if ((y = cmcfm()) < 0) - return(y); - break; - } else if (y < 0) { - return(y); - } - makestr(&(undeflist[n++]),s); - } - /* Now we have a list of n variables or patterns to undefine */ - - for (i = 0; i < n; i++) { - flag = 0; - if (!(vnp = undeflist[i])) - continue; - if (vnp[0] == CMDQ && (vnp[1] == '%' || vnp[1] == '&')) { - flag++; - vnp++; - } - if (!domatch) { /* Pattern match not requested */ - if (flag) { - if ((y = parsevar(vnp,&x,&z)) < 0) { - vnp--; - if (verbose) printf(" %s...error\n",vnp); - continue; - } - vnp--; - } - x = xxundef(vnp,verbose,simulate); - if (x > -1) { - if (!x && !simulate) errors++; - rc += x; - } - continue; - } - /* Pattern match requested */ - - if (!flag) { /* It's a macro */ - for (j = 0; j < nmac; j++) { - if (ckmatch(vnp,mactab[j].kwd,0,1)) { - x = xxundef(mactab[j].kwd,verbose,simulate); - if (x > -1) { - rc += x; - if (!x) errors++; - } - if (!simulate) - j--; /* Because mactab shifted up */ - } - } - } else if (vnp[0] == '%') { /* It's a \%x variable */ - vnbuf[0] = CMDQ; - vnbuf[1] = '%'; - vnbuf[3] = NUL; - for (j = '0'; j <= 'z'; j++) { /* 0..9 a..z */ - vnbuf[2] = j; - if (ckmatch(vnp,&vnbuf[1],0,1)) { - x = xxundef(vnbuf,verbose,simulate); - if (x > -1) { - if (!x) errors++; - rc += x; - } - } - if (j == '9') j = (int)'a' - 1; /* 9 -> a */ - } - } else if (vnp[0] == '&') { - if (!arraymsg && !quiet) { - printf("?UNDEFINE /MATCH can't be used with arrays.\n"); - printf("(Type HELP ARRAY to see other methods.)\n"); - } - arraymsg++; - errors++; - } - } - if (verbose) - printf("undefined: %d, errors: %d\n",rc,errors); - - for (i = 0; i < UNDEFMAX; i++) { /* Check them all */ - if (undeflist[i]) { /* in case we were interrupted */ - free(undeflist[i]); /* previously... */ - undeflist[i] = NULL; - } - } - return(success = (errors == 0) ? 1 : 0); -} - -int -dodef(cx) int cx; { - extern int xxdot; - extern char ppvnambuf[]; - int doeval = 0; - char vnambuf[VNAML+1]; /* Buffer for variable names */ - char *vnp; /* Pointer to same */ - int k, mydot; - mydot = xxdot; /* Copy */ - xxdot = 0; /* and reset */ -/* - In case we got here from a command that begins like ".\%a", cmkey() has - already evaluated \%a, but we don't want that, so we retrieve the variable - name from a special pre-evaluation buffer in the command module, and we - undo the "unget word" that would be done because of the token, because if - the variable was defined, it will unget its value rather than its name. -*/ - s = NULL; - - if (mydot && ppvnambuf[0] == '.' && ppvnambuf[1]) { - s = ppvnambuf+1; - unungw(); - } - if (!s) { - if (cx == XXDFX || cx == XXASX) - /* Evaluate variable name */ - y = cmfld("Macro or variable name","",&s,xxstring); - else - /* Don't evaluate the variable name */ - y = cmfld("Macro or variable name","",&s,NULL); - if (y < 0) { - if (y == -3) { - printf("?Variable name required\n"); - return(-9); - } else return(y); - } - } - k = strlen(s); - if (k > VNAML) { - printf("?Name too long: \"%s\"\n",s); - return(-9); - } - ckstrncpy(vnambuf,s,VNAML); - vnambuf[VNAML] = NUL; - vnp = vnambuf; - if (vnambuf[0] == CMDQ && (vnambuf[1] == '%' || vnambuf[1] == '&')) vnp++; - if (*vnp == '%' || *vnp == '&') { - if ((y = parsevar(vnp,&x,&z)) < 0) return(y); -#ifdef COMMENT - if (cx == XXUNDEF) { /* Undefine */ - if ((y = cmtxt("Text to be ignored","",&s,NULL)) < 0) return(y); - delmac(vnp,0); - return(success = 1); - } -#endif /* COMMENT */ - debug(F101,"dodef parsevar x","",x); - if (mydot) { - if ((doeval = cmkey(asgtab,nasgtab,"operator","=",NULL)) < 0) - return(doeval); - if (doeval > 0) /* Type of assignment */ - cx = XXASS; - } - if (y == 1) { /* Simple variable */ - if ((y = cmtxt("Definition of variable","",&s,NULL)) < 0) - return(y); - s = brstrip(s); - debug(F110,"xxdef var name",vnp,0); - debug(F110,"xxdef var def",s,0); - } else if (y == 2) { /* Array element */ - if ((y = arraynam(vnp,&x,&z)) < 0) return(y); - if (x == 96) { - printf("?Argument vector array is read-only\n"); - return(-9); - } - if (chkarray(x,z) < 0) return(-2); - if ((y = cmtxt("Definition of array element","",&s,NULL)) < 0) - return(y); - debug(F110,"xxdef array ref",vnp,0); - debug(F110,"xxdef array def",s,0); - } - } else { /* Macro */ -#ifdef COMMENT - if (cx == XXUNDEF) { /* Undefine */ - if ((y = cmtxt("Text to be ignored","",&s,NULL)) < 0) return(y); - delmac(vnp,0); - return(success = 1); - } -#endif /* COMMENT */ - if (mydot) { - if ((doeval = cmkey(asgtab,nasgtab,"operator","=",NULL)) < 0) - return(doeval); - if (doeval > 0) - cx = XXASS; - } - if ((y = cmtxt("Definition of macro","",&s,NULL)) < 0) return(y); -#ifdef DEBUG - if (deblog) { - debug(F110,"xxdef macro name",vnp,0); - debug(F010,"xxdef macro def",s,0); - } -#endif /* DEBUG */ - s = brstrip(s); - } - if (*s == NUL) { /* No arg given, undefine */ - delmac(vnp,1); /* silently... */ - return(success = 1); /* even if it doesn't exist... */ - } - /* Defining a new macro or variable */ - - if (cx == XXASS || cx == XXASX) { /* ASSIGN rather than DEFINE? */ - int t; - t = LINBUFSIZ-1; - lp = line; /* If so, expand its value now */ - zzstring(s,&lp,&t); - s = line; - } - if (doeval == 2) { /* Arithmetic evaluation wanted too? */ - ckstrncpy(line,evala(s),LINBUFSIZ); - line[LINBUFSIZ] = NUL; - } - /* debug(F111,"calling addmac",s,(int)strlen(s)); */ - - y = addmac(vnp,s); /* Add it to the appropriate table. */ - if (y < 0) { - printf("?%s failed\n",(cx == XXASS || cx == XXASX) ? - "ASSIGN" : "DEFINE"); - return(success = 0); - } else if (cx == XXASX || cx == XXDFX) /* For _ASG or _DEF, */ - return(1); /* don't change success variable */ - else - return(success = 1); -} -#endif /* NOSPL */ - - -#ifndef NODIAL -/* - L U D I A L -- Lookup up dialing directory entry. - - Call with string to look up and file descriptor of open dialing directory - file. On success, returns number of matches found, with numbers stored - in an array accessible via getdnum(). -*/ -static char *dn_p[MAXDNUMS + 1]; /* Dial Number pointers */ -static char *dn_p2[MAXDNUMS + 1]; /* Converted dial number pointers */ -static int dn_x[MAXDNUMS + 1]; /* Type of call */ -static int dncount = 0; -char * d_name = NULL; /* Dial name pointer */ - -char * /* Get dial directory entry name */ -getdname() { - return(d_name ? d_name : ""); -} - -char * -getdnum(n) int n; { /* Get dial number n from directory */ - if (n < 0 || n > dncount || n > MAXDNUMS) - return(""); - else - return(dn_p[n]); -} - -char * /* Check area code for spurious leading digit */ -chk_ac(i,buf) int i; char buf[]; { - char *p; - if (!buf) - return(""); - p = (char *) buf; /* Country we are calling: */ - if (i == 44 || /* UK */ - i == 49 || /* Germany */ - i == 39 || /* Italy */ - i == 31 || /* Netherlands */ - i == 351 || /* Portugal */ - i == 55 || /* Brazil */ - i == 972 || /* Israel */ - i == 41 || /* Switzerland */ - i == 43 || /* Austria */ - i == 42 || /* Czech Republic */ - i == 36 || /* Hungary */ - i == 30 || /* Greece */ - i == 352 || /* Luxembourg */ - i == 48 || /* Poland */ - i == 27 || /* South Africa */ - i == 33 || /* France (as of 1997) */ - i == 358 /* Finland (ditto) */ - ) { - if (buf[0] == '0') - p++; - } - return(p); -} - -/* Call Is Long Distance -- Expand this to cover 10-digit local dialing etc */ -/* - src = area code of caller - dest = area code of callee - Returns: - 0 if call is local - 1 if call is long distance - 2 if call is local but area code must be dialed anyway -*/ -static int -callisld(src, dest) char * src, * dest; { - int i; - if (dialfld) /* Force long distance? */ - return(1); - if (!strcmp(src,dest)) { /* Area codes are the same */ - for (i = 0; i < nlocalac; i++) /* Is AC in the lc-area-codes list? */ - if (!strcmp(src,diallcac[i])) - return(2); /* Yes so must be dialed */ - return(0); /* No so don't dial it. */ - } - for (i = 0; i < nlocalac; i++) /* ACs not the same so look in list */ - if (!strcmp(dest,diallcac[i])) /* Match */ - return(2); /* So local call with area code */ - return(1); /* Not local so long-distance */ -} - -char pdsfx[64] = { NUL, NUL }; - -#ifndef NOSPL -static char * -xdial(s) char *s; { /* Run dial string thru macro */ - int x, m; - if (!dialmac) /* Dial macro name given? */ - return(NULL); - if ((x = mxlook(mactab,dialmac,nmac)) < 0) /* Is the macro defined? */ - return(NULL); - m = maclvl; - x = dodo(x,s,0); /* Set up the macro */ - if (x > 0) { - while (maclvl > m) /* Execute the parser */ - parser(1); - return(mrval[maclvl+1]); /* Return the result */ - } - return(NULL); -} -#endif /* NOSPL */ - -static int -dncvt(k,cx, prefix, suffix) - int k, cx, prefix, suffix; { /* Dial Number Convert */ - int i, j, n, what; /* cx is top-level command index */ - char *ss; /* prefix - add prefixes? */ - char *p, *p2, *pxo; /* suffix - add suffixes? */ - char *lac; - char *npr; - char *sfx; - /* char *psfx; */ - char ccbuf[128]; - int cc; - char acbuf[24]; - char *acptr; - char outbuf[256]; -/* - First pass for strict (punctuation-based) interpretation. - If it fails, we try the looser (length-based) one. -*/ - dialtype = -1; - what = 0; /* Type of call */ - s = dn_p[k]; /* Number to be converted. */ - debug(F111,"dncvt",s,k); - if (dn_p2[k]) { - free(dn_p2[k]); - dn_p2[k] = NULL; - } - if (!s) { - printf("Error - No phone number to convert\n"); - return(-1); - } - if ((int)strlen(s) > 200) { - ckstrncpy(outbuf,s,40); - printf("?Too long: \"%s...\"\n",outbuf); - return(-1); - } - npr = (prefix && dialnpr) ? dialnpr : ""; - sfx = (suffix && dialsfx) ? dialsfx : ""; - /* if (partial) psfx = dialsfx ? dialsfx : ""; */ - pxo = (prefix && dialpxo) ? dialpxo : ""; - lac = diallac ? diallac : ""; /* Local area code */ - - outbuf[0] = NUL; /* Initialize conversion buffer */ - ss = s; /* Remember original string */ - - if (*s != '+') { /* Literal number */ - dn_x[k] = DN_UNK; /* Sort key is "unknown". */ - ckmakmsg(outbuf,256, /* Sandwich it between */ - pxo,npr,s,sfx /* DIAL PREFIX and SUFFIX */ - ); -#ifdef CK_TAPI - if (tttapi && /* TAPI does its own conversions */ - !tapipass && /* if not in passthru mode */ - tapiconv == CK_AUTO || /* and TAPI conversions are AUTO */ - tapiconv == CK_ON /* OR if TAPI conversions are ON */ - ) { - char * p = NULL; - dialtype = -2; - if (!cktapiConvertPhoneNumber(dn_p[k], &p)) - return(-1); - makestr(&dn_p2[k], p); - if (p) free(p); - return(0); - } else -#endif /* CK_TAPI */ - makestr(&dn_p2[k], outbuf); /* Not TAPI */ - dialtype = what; - return(0); /* Done. */ - } - i = 0; /* Portable number */ - s++; /* Tiptoe past the plus sign */ - ccbuf[0] = NUL; /* Do country code first */ - - if (!diallcc) { /* Do we know our own? */ - if (cx != XXLOOK) - printf("Error - prior SET DIAL COUNTRY-CODE command required\n"); - return(-1); - } - - /* Parse the number */ - - while (1) { /* Get the country code */ - while (*s == HT || *s == SP) - s++; - if (!s) /* Not in standard format */ - break; - if (*s == '(') { /* Beginning of area code */ - s++; /* Skip past parenthesis */ - ccbuf[i] = NUL; /* End of country code */ - if (!s) { /* Check for end of string */ - printf("Error - phone number ends prematurely: \"%s\"\n",ss); - return(-1); - } - break; - } else { /* Collect country code */ - if (isdigit(*s)) - ccbuf[i++] = *s; /* copy this character */ - s++; - if (!*s || i > 127) /* watch out for memory leak */ - break; - } - } - cc = atoi(ccbuf); /* Numeric version of country code */ - - i = 0; /* Now get area code */ - acbuf[0] = NUL; /* Initialize area-code buffer */ - acptr = acbuf; /* and pointer. */ - while (1) { - while (*s == HT || *s == SP) /* Ignore whitespace */ - s++; - if (!s) /* String finished */ - break; - if (*s == ')') { /* End of area code */ - s++; /* Skip past parenthesis */ - acbuf[i] = NUL; /* Terminate area-code buffer */ - break; - } else { /* Part of area code */ - if (isdigit(*s)) /* If it's a digit, */ - acbuf[i++] = *s; /* copy this character */ - s++; /* Point to next */ - if (!*s || i > 23) /* Watch out for overflow */ - break; - } - } - -/* - Here we strip any leading 0 for countries that we know have - 0 as a long-distance prefix and do not have any area codes that - start with 0 (formerly also ditto for "9" in Finland...) -*/ - i = atoi(ccbuf); - acptr = chk_ac(i,acbuf); - - while (*s == HT || *s == SP) /* Skip whitespace */ - s++; - -/* printf("S=[%s], ACPTR=[%s]\n",s,acptr); */ - - if (*s && *acptr) { /* Area code was delimited */ - - while (*s == '-' || *s == '.') /* Skip past gratuitious punctuation */ - s++; - if (!*s) s--; /* But not to end of string */ - - if (strcmp(diallcc,ccbuf)) { /* Out of country? */ - if (!dialixp) { /* Need intl-prefix */ - if (cx != XXLOOK) - printf("Error - No international dialing prefix defined\n"); - return(-1); - } - what = dn_x[k] = DN_INTL; - p = (prefix && dialixp) ? dialixp : ""; /* Intl-prefix */ - p2 = (suffix && dialixs) ? dialixs : ""; /* Intl-suffix */ - - /* Form the final phone number */ -#ifdef COMMENT - sprintf(pdsfx,"%s%s",p2,sfx); /* UNSAFE */ - sprintf(outbuf, - "%s%s%s%s%s%s%s%s", - pxo,npr,p,ccbuf,acptr,s,p2,sfx - ); -#else - ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL); - ckmakxmsg(outbuf,256,pxo,npr,p,ccbuf,acptr,s,p2,sfx, - NULL,NULL,NULL,NULL); -#endif /* COMMENT */ - - } else if ((x = callisld(lac,acptr)) >= 1) { /* In-country LD */ - if (!diallac && cx != XXLOOK) { /* Don't know my own area code */ - if (cc == 1) - printf("WARNING - Prior SET DIAL AREA-CODE needed\n"); - } - if (x == 2) { /* Local call with area code */ - what = dn_x[k] = DN_LOCAL; /* Local-call */ - p = (prefix && diallcp) ? diallcp : ""; /* local-prefix */ - p2 = (suffix && diallcs) ? diallcs : ""; /* local-suffix */ - } else { - what = dn_x[k] = DN_LONG; /* Long-distance */ - for (i = 0; i < ntollfree; i++) { /* But toll-free too? */ - if (!strcmp(acptr,dialtfc[i])) { - what = dn_x[k] = DN_FREE; - break; - } - } - if (what == DN_FREE) { /* Toll-free call */ - p = (prefix && dialtfp) ? dialtfp : - ((prefix && dialldp) ? dialldp : ""); - p2 = ""; /* no suffix */ - } else { /* normal long distance */ - p = (prefix && dialldp) ? dialldp : ""; /* ld-prefix */ - p2 = (suffix && diallds) ? diallds : ""; /* ld-suffix */ - } - } - /* Form the number to be dialed */ -#ifdef COMMENT - sprintf(outbuf,"%s%s%s%s%s%s%s", - pxo,npr,p,acptr,s,p2,sfx - ); - sprintf(pdsfx,"%s%s",p2,sfx); -#else - ckmakxmsg(outbuf,256, - pxo,npr,p,acptr,s,p2,sfx, - NULL,NULL,NULL,NULL,NULL); - ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL); -#endif /* COMMENT */ - } else { /* Same country, same area code */ - what = dn_x[k] = DN_LOCAL; /* So it's a local call. */ - if (!prefix || !(dialpxo || ndialpxx)) { /* Not dialing from PBX */ - p = (prefix && diallcp) ? diallcp : ""; /* local-prefix */ - p2 = (suffix && diallcs) ? diallcs : ""; /* local-suffix */ -#ifdef COMMENT - if (x == 2) - sprintf(outbuf,"%s%s%s%s%s%s",npr,p,acptr,s,p2,sfx); - else - sprintf(outbuf,"%s%s%s%s%s",npr,p,s,p2,sfx); - sprintf(pdsfx,"%s%s",p2,sfx); -#else - if (x == 2) - ckmakxmsg(outbuf,256, - npr,p,acptr,s,p2,sfx, - NULL,NULL,NULL,NULL,NULL,NULL); - else - ckmakxmsg(outbuf,256, - npr,p,s,p2,sfx, - NULL,NULL,NULL,NULL,NULL,NULL,NULL); - ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL); -#endif /* COMMENT */ - - } else { /* Dialing from a PBX and not TAPI */ - if (ndialpxx) { /* Is it internal? */ -#ifdef COMMENT - i = (int) strlen(dialpxx); - j = (int) strlen(s); - x = -1; - if (j > i) - x = ckstrcmp(dialpxx,s,i,0); -#else - int kx; - x = -1; - j = (int) strlen(s); - for (kx = 0; kx < ndialpxx; kx++) { - i = (int) strlen(dialpxx[kx]); - if (j > i) - if (!(x = ckstrcmp(dialpxx[kx],s,i,0))) - break; - } -#endif /* COMMENT */ - if (!x) { - char * icp, buf[32]; - makestr(&matchpxx,dialpxx[kx]); - debug(F111,"dncvt matchpxx",matchpxx,kx); - what = dn_x[kx] = DN_INTERN; /* Internal call. */ - s += i; - /* Internal-call prefix */ - icp = dialpxi; -#ifndef NOSPL - if (icp) { - if (*icp == '\\') { - char c, *bp; - int n; - c = *(icp+1); - if (isupper(c)) c = tolower(c); - if (c == 'v' || c == 'f') { - n = 32; - bp = buf; - zzstring(icp,&bp,&n); - icp = buf; - } - } - } -#endif /* NOSPL */ - p = (prefix && icp) ? icp : ""; -#ifdef COMMENT - sprintf(outbuf,"%s%s%s%s",npr,p,s,sfx); -#else - ckmakmsg(outbuf,256,npr,p,s,sfx); -#endif /* COMMENT */ - } else { /* External local call */ - /* local-prefix */ - p = (prefix && diallcp) ? diallcp : ""; - /* local-suffix */ - p2 = (prefix && diallcs) ? diallcs : ""; -#ifdef COMMENT - if (x == 2) - sprintf(outbuf,"%s%s%s%s%s%s%s", - dialpxo ? dialpxo : "", - npr,p,acptr,s,p2,sfx); - else - sprintf(outbuf, - "%s%s%s%s%s%s", - dialpxo ? dialpxo : "", - npr,p,s,p2,sfx - ); -#else - if (x == 2) - ckmakxmsg(outbuf, 256, - dialpxo ? dialpxo : "", - npr,p,acptr,s,p2,sfx, - NULL,NULL,NULL,NULL,NULL); - else - ckmakxmsg(outbuf, 256, - dialpxo ? dialpxo : "", - npr,p,s,p2,sfx, - NULL,NULL,NULL,NULL,NULL,NULL); -#endif /* COMMENT */ - } - } - } - } - - } else { /* Area code was not delimited */ - - char xbuf[256]; /* Comparison based only on length */ - char ybuf[256]; - int x, j; - - s = ss; - - for (i = 0; i < 255; i++) { - if (!*s) break; - while (!isdigit(*s)) { /* Pay attention only to digits */ - s++; - if (!*s) break; - } - xbuf[i] = *s++; - } - xbuf[i] = NUL; - - x = 1; /* Assume LD */ - n = 0; - if (!dialfld) { /* If LD not forced */ - for (j = 0; j < nlocalac; j++) { /* check local AC list? */ - ckmakmsg(ybuf,256,diallcc,diallcac[j],NULL,NULL); - n = (int) strlen(ybuf); - if (n > 0 && !ckstrcmp(xbuf,ybuf,n,0)) { - x = 2; - break; - } - } - if (x == 1) { /* Or exact match with local CC+AC? */ - ckmakmsg(ybuf,256,diallcc,lac,NULL,NULL); - n = (int) strlen(ybuf); - if (n > 0 && !ckstrcmp(xbuf,ybuf,n,0)) - x = 0; - } - } - if (x == 0 || x == 2) { /* Local call */ - int xx,kx; /* Begin 1 Dec 2001... */ - /* Account for PBX internal calls */ - if (ndialpxx) { - xx = -1; - j = (int) strlen(ybuf); - for (kx = 0; kx < ndialpxx; kx++) { - i = (int) strlen(dialpxx[kx]); - if (j >= i) - if (!(xx = ckstrcmp(dialpxx[kx],&xbuf[j],i,0))) - break; - } - } - if (!xx) { - char * icp, buf[32]; - makestr(&matchpxx,dialpxx[kx]); - debug(F111,"dncvt matchpxx",matchpxx,kx); - what = dn_x[kx] = DN_INTERN; /* Internal call. */ - s = xbuf + j + i; - icp = dialpxi; /* Internal-call prefix */ -#ifndef NOSPL - if (icp) { - if (*icp == '\\') { - char c, *bp; - int n; - c = *(icp+1); - if (isupper(c)) c = tolower(c); - if (c == 'v' || c == 'f') { - n = 32; - bp = buf; - zzstring(icp,&bp,&n); - icp = buf; - } - } - } -#endif /* NOSPL */ - p = (prefix && icp) ? icp : ""; - ckmakmsg(outbuf,256,npr,p,s,sfx); - /* End 1 Dec 2001... */ - - } else { /* Not PBX internal */ - - dn_x[k] = DN_LOCAL; - p = (prefix && diallcp) ? diallcp : ""; - p2 = (suffix && diallcs) ? diallcs : ""; - s = (char *) (xbuf + ((x == 0) ? n : (int)strlen(diallcc))); - ckmakxmsg(outbuf,256, - pxo,npr,p,s,p2,sfx, - NULL,NULL,NULL,NULL,NULL,NULL); - ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL); - } - } else { /* Not local */ - n = ckstrncpy(ybuf,diallcc,256); - if (n > 0 && !ckstrcmp(xbuf,ybuf,n,0)) { /* Long distance */ - dn_x[k] = DN_LONG; - p = (prefix && dialldp) ? dialldp : ""; - p2 = (suffix && diallds) ? diallds : ""; - s = xbuf + n; - while (*s == '-' || *s == '.') - s++; -#ifdef COMMENT - sprintf(outbuf,"%s%s%s%s%s%s",pxo,npr,p,s,p2,sfx); - sprintf(pdsfx,"%s%s",p2,sfx); -#else - ckmakxmsg(outbuf,256, - pxo,npr,p,s,p2,sfx, - NULL,NULL,NULL,NULL,NULL,NULL); - ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL); -#endif /* COMMENT */ - } else { - dn_x[k] = DN_INTL; /* International */ - if (!dialixp) { - if (cx != XXLOOK) { - printf( - "Error - No international dialing prefix defined\n" - ); - return(-1); - } - } - p = (prefix && dialixp) ? dialixp : ""; - p2 = (suffix && dialixs) ? dialixs : ""; -#ifdef COMMENT - sprintf(outbuf,"%s%s%s%s%s%s",pxo,npr,p,xbuf,p2,sfx); - sprintf(pdsfx,"%s%s",p2,sfx); -#else - ckmakxmsg(outbuf,256, - pxo,npr,p,xbuf,p2,sfx, - NULL,NULL,NULL,NULL,NULL,NULL); - ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL); -#endif /* COMMENT */ - } - } - } -#ifdef CK_TAPI - if (tttapi && /* TAPI performs the conversions */ - !tapipass && - tapiconv == CK_AUTO || - tapiconv == CK_ON - ) { - p = NULL; - dialtype = -2; - if (!cktapiConvertPhoneNumber(dn_p[k],&p)) - return(-1); - makestr(&dn_p2[k], p); - if (p) free(p); - return(0); - } else { -#endif /* CK_TAPI */ - makestr(&dn_p2[k], outbuf); -#ifdef CK_TAPI - } -#endif /* CK_TAPI */ - dialtype = what; - return(0); -} - -static int -ddcvt(s, f, n) char * s; FILE * f; int n; { /* Dial Directory Convert */ - char linebuf[1024], *s2; /* Buffers and pointers */ -#ifdef VMS - char * temp = NULL; -#endif /* VMS */ - char *info[8]; /* Pointers to words from entry */ - FILE * f2 = NULL; - int x, rc; - rc = -1; - - debug(F110,"ddcvt file",s,0); - - if (!s || !f) /* No filename or file */ - return(-1); - if (!*s) - - fclose(f); - znewn(s,&s2); /* s2 = address of static buffer */ - debug(F110,"ddcvt newname",s2,0); - -#ifdef VMS - /* In VMS, znewn() returns the same file name with a new version number */ - makestr(&temp,s); /* Swap - otherwise the new */ - s = s2; /* version has the older version */ - s2 = temp; /* number... */ - debug(F110,"ddcvt after swap s",s,0); - debug(F110,"ddcvt after swap s2",s2,0); - makestr(&(dialdir[n]),s); /* New file gets new version number */ - debug(F110,"ddcvt after makestr s2",s2,0); - debug(F111,"ddcvt dialdir[n]",dialdir[n],n); -#else - if (zrename(s,s2) < 0) { /* Not VMS - rename old file */ - perror(s2); /* to new (wierd) name. */ - goto ddexit; - } -#endif /* VMS */ - debug(F110,"ddcvt s2 (old)",s2,0); - if ((f = fopen(s2,"r")) == NULL) { /* Reopen old file with wierd name */ - debug(F110,"ddcvt s2 open error",ck_errstr(),0); - dirline = 0; /* (or in VMS, old version) */ - perror(s2); - goto ddexit; - } - debug(F110,"ddcvt fopen(s2) OK",s2,0); - - debug(F110,"ddcvt s (new)",s,0); - if ((f2 = fopen(s,"w")) == NULL) { /* Create new file with old name */ - debug(F110,"ddcvt s open error",ck_errstr(),0); - perror(s); /* (or in VMS, new version) */ - goto ddexit; - } - debug(F110,"ddcvt fopen(s) OK",s,0); - - printf("\nSaving old directory as %s.\nConverting %s...",s2,s); - fprintf(f2,"; %s - Kermit dialing directory\n", s); - fprintf(f2,"%-16s %-20s ; %5s %-6s ; %s\n", - "; Name","Number","Speed","Parity","Comment" - ); - - while (1) { - linebuf[0] = NUL; /* Read a line */ - if (fgets(linebuf,1023,f) == NULL) - break; - debug(F110,"ddcvt linebuf",linebuf,0); - if (!linebuf[0]) { /* Empty line */ - fprintf(f2,"\n"); - continue; - } - x = (int) strlen(linebuf); /* Strip line terminator, */ - while (x-- > 0) { /* if any. */ - if (linebuf[x] <= SP) - linebuf[x] = NUL; - else - break; - } - xwords(linebuf,5,info,1); /* Parse it the old way */ - for (x = 1; x < 6; x++) - if (!info[x]) info[x] = ""; - fprintf(f2,"%-16s %-20s ; %5s %-6s %s\n", - info[1],info[2],info[3],info[4],info[5] - ); - } - printf(" OK\n\n"); - rc = 0; /* Success */ - ddexit: - if (f) fclose(f); - if (f2) fclose(f2); -#ifdef VMS - if (temp) free(temp); -#endif /* VMS */ - return(rc); -} - -int /* s = name to look up */ -#ifdef CK_ANSIC /* cx = index of command */ -ludial(char *s, int cx) /* (DIAL, LOOKUP, etc) */ -#else -ludial(s, cx) char *s; int cx; -#endif /* CK_ANSIC */ -/* ludial */ { - - int dd, n1, n2, n3, i, j, t; /* Workers */ - int olddir, newdir, oldentry, newentry; - int pass = 0; - int oldflg = 0; - int ambiguous = 0; /* Flag for lookup was ambiguous */ - char *info[7]; /* Pointers to words from entry */ - char *pp; /* Pointer to element of array */ - FILE * f; - char *line; /* File input buffer */ - -/* #define LUDEBUG */ - -#ifdef LUDEBUG -int zz = 1; -#endif /* LUDEBUG */ - - if (!s || ndialdir < 1) /* Validate arguments */ - return(-1); - - if ((n1 = (int) strlen(s)) < 1) /* Length of string to look up */ - return(-1); - - if (!(line = malloc(1024))) /* Allocate input buffer */ - return(-1); - -#ifdef LUDEBUG -if (zz) printf("LUDIAL 1 s[%s], n1=%d\n",s,n1); -#endif /* LUDEBUG */ - - pass = 0; - lu_again: - f = NULL; /* Dial directory file descriptor */ - t = dncount = 0; /* Dial-number match count */ - dd = 0; /* Directory counter */ - olddir = 0; - newdir = 0; -/* - We need to recognize both old- and new-style directories. - But we can't allow old-style and new-style entries in the same - directory because there is no way to tell for sure the difference between - an old-style entry like this: - - foo 5551212 9600 - - and a new-style literal entry like this: - - foo 555 9600 - - I.e. is the "9600" a speed, or part of the phone number? -*/ - while (1) { /* We make one pass */ - if (!f) { /* Directory not open */ - if (dd >= ndialdir) /* No directories left? */ - break; /* Done. */ - debug(F111,"ludial dialdir[dd]",dialdir[dd],dd); - if ((f = fopen(dialdir[dd],"r")) == NULL) { /* Open it */ - perror(dialdir[dd]); /* Can't, print message saying why */ - if (line) { - free(line); - line = NULL; - } - dd++; /* Go on to next one, if any... */ - continue; - } - dirline = 0; /* Directory file line number */ - if (dialdpy && !pass) - printf("Opening: %s...\n",dialdir[dd]); - dd++; - if (!oldflg) olddir = 0; - newdir = 0; - } - oldentry = 0; - newentry = 0; - line[0] = NUL; - if (getnct(line,1023,f,1) < 0) { /* Read a line */ - if (f) { /* f can be clobbered! */ - fclose(f); /* Close the file */ - f = NULL; /* Indicate next one needs opening */ - oldflg = 0; - } - continue; - } - if (!line[0]) /* Empty line */ - continue; -#ifdef LUDEBUG -if (zz) printf("LUDIAL 2 s[%s]\n",s); -#endif /* LUDEBUG */ - - /* Make a copy and parse it the old way */ - /* A copy is needed because xwords() pokes NULs into the string */ - - if ((pp = malloc((int)strlen(line) + 1))) { - strcpy(pp,line); /* safe */ - xwords(pp,5,info,0); /* Parse it the old way */ - -#ifdef LUDEBUG -if (zz) printf("LUDIAL 3 s[%s]\n",s); -#endif /* LUDEBUG */ - - if (!info[1]) - continue; - if (*info[1] == ';') { /* If full-line comment, */ - newdir = 1; /* (only new directories have them) */ - continue; /* keep reading. */ - } - if (!info[2]) - continue; - if (*info[2] == '+') - newentry = 1; - if (info[4]) { - if ((*info[4] == '=') || - !ckstrcmp(info[4],"none", 4,0) || - !ckstrcmp(info[4],"even", 4,0) || - !ckstrcmp(info[4],"space",5,0) || - !ckstrcmp(info[4],"mark", 4,0) || - !ckstrcmp(info[4],"odd", 3,0) - ) - oldentry = 1; - } - } - if (pp) { - free(pp); - pp = NULL; - } - - /* Check consistency */ - - if ((oldentry || olddir) && (newentry || newdir)) { - printf( -"\nERROR: You seem to have old- and new-format entries mixed in your\n"); - printf( -"dialing directory. You'll have to edit it by hand to convert it to the\n"); -#ifndef NOHELP - printf("new format. Type HELP DIAL for further information.\n\n"); -#else - printf("new format.\n\n"); -#endif /* NOHELP */ - if (line) { - free(line); - line = NULL; - } - return(-1); - } - if (!olddir && oldentry) { - int convert = 0; - olddir = 1; - if (dialcvt == 2) { /* 2 == ASK */ - sprintf(tmpbuf, -"WARNING: Old-style dialing directory detected:\n%s", line); - convert = uq_ok(tmpbuf, - "Shall I convert it for you? ",3,NULL,0); - } else - convert = dialcvt; - if (convert) { - debug(F111,"ludial calling ddcvt",dialdir[dd-1],dd); - if (ddcvt(dialdir[dd-1],f,dd-1) < 0) { - debug(F111,"ludial ddcvt failed",dialdir[dd-1],dd); - oldflg = 1; - printf( -" Sorry, can't convert."); - printf( -" Will ignore speed and parity fields, continuing...\n\n"); - } else { - olddir = newdir = 0; - debug(F111,"ludial ddcvt ok",dialdir[dd-1],dd); - } - dd--; - f = NULL; - continue; - } else { - if (dialcvt == 2) - printf( -" OK, will ignore speed and parity fields, continuing...\n\n"); - olddir = 1; - } - } - -#ifdef LUDEBUG -if (zz) printf("LUDIAL XX s[%s], n1=%d\n",s,n1); -#endif /* LUDEBUG */ - - /* Now parse again for real */ - - if (oldentry) /* Parse it the old way */ - xwords(line,5,info,0); - else /* Parse it the new way */ - xwords(line,2,info,1); - -#ifdef LUDEBUG -if (zz) printf("LUDIAL YY s[%s], n1=%d\n",s,n1); -if (zz) printf("%s [%s]\n",info[1],info[2]); -#endif /* LUDEBUG */ - - if (info[1]) { /* First word is entry name */ - if ((n3 = (int) strlen(info[1])) < 1) /* Its length */ - continue; /* If no first word, keep reading. */ - if (n3 < n1) /* Search name is longer */ - continue; /* Can't possibly match */ - if (ambiguous && n3 != n1) - continue; - -#ifdef LUDEBUG -if (zz) printf("MATCHING: [%s] [%s], n1=%d\n",s,info[1],n1); -#endif /* LUDEBUG */ - - if (ckstrcmp(s,info[1],n1,0)) /* Caseless string comparison */ - continue; - -#ifdef LUDEBUG -if (zz) printf("MATCH OK: [%s] [%s], n1=%d\n",s,info[1],n1); -#endif /* LUDEBUG */ - - if (!info[2]) /* No phone number given */ - continue; - if ((n2 = (int) strlen(info[2])) < 1) /* Length of phone number */ - continue; /* Ignore empty phone numbers */ - - /* Got one */ - - if (!(pp = (char *)malloc(n2 + 1))) { /* Allocate storage for it */ - printf("?internal error - ludial malloc 1\n"); - if (line) { - free(line); - line = NULL; - } - dncount = 0; - return(-1); - } - strcpy(pp,info[2]); /* safe */ - - if (dncount > MAXDNUMS) { - printf("Warning: %d matches found, %d max\n", - dncount, - MAXDNUMS - ); - dncount = MAXDNUMS; - break; - } - dn_p[dncount++] = pp; /* Add pointer to array. */ - if (dncount == 1) { /* First one... */ - if (d_name) free(d_name); - if (!(d_name = (char *)malloc(n3 + 1))) { /* Save its name */ - printf("?internal error - ludial malloc 2\n"); - if (line) { - free(line); - line = NULL; - } - dncount = 0; - return(-1); - } - t = n3; /* And its length */ - strcpy(d_name,info[1]); /* safe */ - } else { /* Second or subsequent one */ - -#ifdef LUDEBUG - if (zz) - printf("d_name=[%s],info[1]=%s,t=[%d]\n",d_name,info[1],t); -#endif /* LUDEBUG */ - - if ((int) strlen(info[1]) == t) /* Lengths compare */ - if (!ckstrcmp(d_name,info[1],t,0)) /* Caseless compare OK */ - continue; - - /* Name given by user matches entries with different names */ - - if (ambiguous) /* Been here before */ - break; - - ambiguous = 1; /* Now an exact match is required */ - for (j = 0; j < dncount; j++) { /* Clean out previous list */ - if (dn_p[j]) { - free(dn_p[j]); - dn_p[j] = NULL; - } - } - pass++; /* Second pass... */ - goto lu_again; /* Do it all over again. */ - } - } - } - if (line) free(line); - if (dncount == 0 && ambiguous) { - printf(" Lookup: \"%s\" - ambiguous%s\n", - s, - cx == XXLOOK ? "" : " - dialing skipped" - ); - return(-2); - } - return(dncount); -} - -char * -pncvt(s) char *s; { /* Phone number conversion */ - char *p = NULL; /* (just a wrapper for dncvt() */ - char *q = NULL; - static char pnbuf[128]; - makestr(&p,dn_p[0]); /* Save these in case they are */ - makestr(&q,dn_p2[0]); /* being used */ - makestr(&dn_p[0],s); /* Copy the argument string to here */ - dncvt(0,XXLOOK,1,1); /* Convert it */ - if (!dn_p2[0]) /* Put result where can return it */ - pnbuf[0] = NUL; - else - ckstrncpy(pnbuf,dn_p2[0],127); - makestr(&dn_p[0],p); /* Restore these */ - makestr(&dn_p2[0],q); - makestr(&p,NULL); /* Free these */ - makestr(&q,NULL); - return((char *)pnbuf); -} - -int -dodial(cx) int cx; { /* DIAL or REDIAL */ - int i = 0, x = 0; /* Workers */ - int sparity = -1; /* For saving global parity value */ - int previous = 0; - int len = 0; - int literal = 0; - int flowsave; - int lufound = 0; /* Did any lookup succeed? */ - int prefix = 1; - int postfix = 1; - int wasalpha = 0; - int xredial = 0; - int braces = 0; - - char *p = NULL, *s3 = NULL, * sav = NULL; - int j = 0, t = 0, n = 0; - int xretries, xlcc; - - debug(F101,"dodial cx","",cx); - debug(F111,"dodial diallcc",diallcc,diallcc); - - xretries = dialrtr; /* If retries not set, */ - if (diallcc) { /* choose default based on */ - xlcc = atoi(diallcc); /* local country code. */ - if (xretries < 0) { - switch (xlcc) { - case 1: xretries = 10; break; /* No restrictions in NANP */ - /* Add other country codes here */ - /* that are known to have no restrictions on redialing. */ - default: xretries = 1; - } - } - } - if (cx == XXPDIA) { /* Shortcut... */ - cx = XXDIAL; - partial = 1; - debug(F100,"PDIAL sets partial=1","",0); - postfix = 0; /* Do not add postfix */ - } else { - partial = 0; - debug(F100,"DIAL sets partial=0","",0); - } - previous = dialsta; /* Status of previous call, if any */ - if (previous == DIA_PART) { - prefix = 0; /* do not add prefix */ - } - s = NULL; /* Initialize user's dial string */ - if (cx == XXRED) { /* REDIAL or... */ - if ((y = cmcfm()) < 0) - return(y); - } else if (cx == XXANSW) { /* ANSWER or ... */ - if ((y = cmnum("timeout (seconds)","0",10,&x,xxstring)) < 0) - return(y); - dialatmo = x; - if ((y = cmcfm()) < 0) - return(y); - } else { /* DIAL or LOOKUP */ - if (ndialdir > 0) - s3 = "Number to dial or entry from dial directory"; - else - s3 = "Number to dial"; - if ((x = cmtxt(s3, dialnum ? dialnum : "",&s,xxstring)) < 0) - return(x); - if (s) { - len = (int) strlen(s); - ckstrncpy(tmpbuf,s,TMPBUFSIZ); /* Save literal copy */ -#ifdef COMMENT - if (len > 1) { /* Strip outer braces if given */ - if (*s == '{') { - if (s[len-1] == '}') { - s[len-1] = NUL; - s++; - len -= 2; - } - } - } -#else - s = brstrip(s); /* Strip outer braces or quotes */ -#endif /* COMMENT */ - } - } - - if (cx != XXLOOK) { /* Not LOOKUP */ -#ifdef IKSD - if (inserver) { - printf("Sorry, dialing is disabled.\r\n"); - return(success = 0); - } -#endif /* IKSD */ -#ifdef CK_TAPI - if (tttapi && !tapipass) { - ; /* Skip the modem test if TAPI */ - } else -#endif /* CK_TAPI */ - if (mdmtyp < 1 && !dialtest) { - if (network -#ifdef TN_COMPORT - && !istncomport() -#endif /* TN_COMPORT */ - ) - printf("Please SET HOST first, and then SET MODEM TYPE\n"); - else - printf("Sorry, you must SET MODEM TYPE first\n"); - dialsta = DIA_NOMO; - return(success = 0); - } - if (!local && !dialtest) { - printf("Sorry, you must SET %s or SET HOST first\n", -#ifdef OS2 - "PORT" -#else - "LINE" -#endif /* OS2 */ - ); - dialsta = DIA_NOLI; - return(success = 0); - } - if ((!network -#ifdef TN_COMPORT - || istncomport() -#endif /* TN_COMPORT */ - ) && !dialtest && -#ifdef CK_TAPI - !tttapi && -#endif /* CK_TAPI */ - (speed < 0L) -#ifdef UNIX - && (strcmp(ttname,"/dev/null")) -#else -#ifdef OSK - && (strcmp(ttname,"/nil")) -#endif /* OSK */ -#endif /* UNIX */ - ) { - printf("\nSorry, you must SET SPEED first\n"); - dialsta = DIA_NOSP; - return(success = 0); - } - } - if (cx != XXANSW) { - for (j = 0; j < MAXDNUMS; j++) { /* Initialize dial-number list */ - if (!dialnum) { /* First time dialing */ - dn_p[j] = NULL; /* initialize all pointers. */ - dn_p2[j] = NULL; - } else if (dn_p[j]) { /* Not the first time, */ - free(dn_p[j]); /* free previous, if any, */ - dn_p[j] = NULL; /* then set to NULL. */ - if (dn_p2[j]) - free(dn_p2[j]); - dn_p2[j] = NULL; - } else break; /* Already NULL */ - } - if (len == 0) - s = NULL; - if (!s) - s = dialnum; - if (!s) { - if (cx == XXLOOK) - printf("?Lookup what?\n"); - else - printf("%s\n", (cx == XXRED) ? - "?No DIAL command given yet" : - "?You must specify a number to dial" - ); - return(-9); - } - - /* Now we have the "raw" dial or lookup string and s is not NULL */ - - makestr(&dscopy,s); /* Put it in a safe place */ - s = dscopy; - n = 0; - - debug(F111,"dodial",s,ndialdir); - - wasalpha = 0; - if (isalpha(*s)) { - wasalpha = 1; - if (ndialdir > 0) { /* Do we have a dialing directory? */ - n = ludial(s,cx); /* Look up what the user typed */ - if (n == 0) - printf(" Lookup: \"%s\" - not found%s\n", - s, - cx == XXLOOK ? "" : " - dialing as given\n" - ); - } - debug(F101,"dodial",s,n); - if (n < 0 && cx != XXLOOK) { /* Error out if they wanted to dial */ - if (n == -1) /* -2 means ludial already gave msg */ - printf(" Lookup: fatal error - dialing skipped\n"); - dialsta = DIA_DIR; - return(-9); - } - if (n > 0) /* A successful lookup */ - lufound = 1; - } else if (*s == '=') { /* If number starts with = sign */ - s++; /* strip it */ - literal = 1; /* remember this */ - while (*s == SP) s++; /* and then also any leading spaces */ - } else if (tmpbuf[0] == '{' && tmpbuf[1] == '{') { - makelist(tmpbuf,dn_p,MAXDNUMS); - makestr(&dscopy,tmpbuf); - s = tmpbuf; - for (n = 0; n < MAXDNUMS; n++) /* (have to count how many) */ - if (!dn_p[n]) break; - braces = 1; - } - if (cx == XXLOOK && !wasalpha && !braces) { - /* We've been told to lookup a number or a quoted name */ - char *p; - n = 0; - p = literal ? s : pncvt(dscopy); - if (!p) p = ""; - if (*p) { - printf("%s => %s\n", dscopy, p); - return(success = 1); - } else { - printf("?Bad phone number\n"); - return(success = 0); - } - } - /* Save DIAL or successful LOOKUP string for future DIAL or REDIAL */ - /* But don't save pieces of partial dial ... */ - - debug(F101,"DIAL save dialnum partial","",partial); - debug(F101,"DIAL save dialnum previous","",previous); - if ((cx == XXDIAL && partial == 0 && previous != DIA_PART) || - (cx == XXLOOK && n > 0)) { - makestr(&dialnum,dscopy); - if (!quiet && dscopy && !dialnum) - printf("WARNING - memory allocation failure: redial number\n"); - } - if (n > 0) { - if (!quiet && !backgrd && !braces /* && dialdpy */ ) { - if (!strcmp(d_name,s)) - printf(" Lookup: \"%s\" - exact match\n",s); - else - printf(" Lookup: \"%s\" - uniquely matches \"%s\"\n", - s, - d_name - ); - } - if ((cx == XXLOOK) || - ((n > 1) && !quiet && !backgrd /* && dialdpy */ )) { - printf(" %d telephone number%sfound for \"%s\"%s\n", - n, - (n == 1) ? " " : "s ", - s, - (n > 0) ? ":" : "." - ); - s3 = getdname(); - } - for (i = 0; i < n; i++) { /* Convert */ - dn_x[i] = -1; - if (dncvt(i,cx,prefix,postfix) < 0) { - if (cx != XXLOOK) { - dialsta = DIA_DIR; - return(-9); - } - } - } - if (dialsrt && n > 1) { /* Sort into optimal order */ - for (i = 0; i < n-1; i++) { - for (j = i+1; j < n; j++) { - if (dn_x[j] < dn_x[i]) { - t = dn_x[j]; - dn_x[j] = dn_x[i]; - dn_x[i] = t; - p = dn_p[j]; - dn_p[j] = dn_p[i]; - dn_p[i] = p; - p = dn_p2[j]; - dn_p2[j] = dn_p2[i]; - dn_p2[i] = p; - } - } - } - } - if ((cx == XXLOOK) || - ((n > 1) && !quiet && !backgrd /* && dialdpy */ )) { - int nn = n; -#ifndef NOSPL - char * p; -#endif /* NOSPL */ - if (cx != XXLOOK) - if (n > 12) nn = 12; - for (i = 0; i < nn; i++) { - printf("%3d. %-12s %-20s => %-20s (%d)\n",i+1, - s3, dn_p[i], - dn_p2[i] ? dn_p2[i] : "(processing failed)", - dn_x[i] - ); - } - if (cx != XXLOOK && n != nn) - printf("And %d more...\n", n - nn); - } - } else if (n == 0) { /* Not found in directory */ - makestr(&(dn_p[0]),literal ? s : dscopy); - makestr(&d_name,literal ? s : dscopy); - dncount = 1; - n = 1; - if (dncvt(0,cx,prefix,postfix) < 0) { /* In case they typed a */ - dialsta = DIA_DIR; /* portable-format number ... */ - return(-9); - } - } - -#ifndef NONET -#ifdef NETCONN - /* It's not good that the networks directory depends on NOT-NODIAL.. */ - if (cx == XXLOOK && dscopy) { /* Networks here too... */ - extern char *nh_p[], *nh_p2[], *n_name; - extern char *nh_px[4][MAXDNUMS+1]; - n = -1; - if (nnetdir > 0) { /* Do we have a network directory? */ - dirline = 0; - n = lunet(dscopy); /* Look up what the user typed */ - } - if (n > -1) { - int k; - if (n > 0) /* A successful lookup */ - lufound = 1; - if (cx == XXLOOK && n == 0) - printf(" Lookup: \"%s\" - not found\n",dscopy); - else - printf("%s %d network entr%s found for \"%s\"%s\n", - cx == XXLOOK ? " Lookup:" : "", - n, - (n == 1) ? "y" : "ies", - dscopy, - (n > 0) ? ":" : "." - ); - - for (i = 0; i < n; i++) { - - printf("%3d. %-12s => %-9s %s", - i+1,n_name,nh_p2[i],nh_p[i]); - for (k = 0; k < 4; k++) { - if (nh_px[k][i]) { - printf(" %s",nh_px[k][i]); - } else - break; - } - printf("\n"); - } - } - } -#endif /* NETCONN */ -#endif /* NONET */ - if (cx == XXLOOK) - return(success = lufound); - } /* cx != XXANSW */ - -#ifdef VMS - conres(); /* So Ctrl-C/Y will work */ -#endif /* VMS */ -/* - Some modems do not react well to parity. Also, if we are dialing through a - TCP/IP TELNET modem server, parity can be fatally misinterpreted as TELNET - negotiations. - - This should work even if the user interrupts the DIAL command, because the - DIAL module has its own interrupt handler. BUT... if, for some reason, a - dialing device actually *requires* parity (e.g. CCITT V.25bis says that even - parity should be used), this might prevent successful dialing. For that - reason, we don't do this for V.25bis modems. -*/ - sparity = parity; /* Save current parity */ - if ((dialcapas & CKD_V25) == 0) /* If not V.25bis... */ - parity = 0; /* Set parity to NONE */ - - flowsave = flow; -/* - These modems use some kind of screwy flow control while in command mode, - and do not present CTS as they should. So if RTS/CTS is set (or even if - it isn't) disable flow control during dialing. -*/ -#ifndef MINIDIAL - if (mdmtyp == n_ATT1910 || mdmtyp == n_ATT1900) { - flow = FLO_NONE; /* This is not enough */ -#ifdef CK_TTSETFLOW - ttsetflow(FLO_NONE); /* Really turn it off */ -#endif /* CK_TTSETFLOW */ - } -#endif /* MINIDIAL */ - if (!network -#ifdef TN_COMPORT - || istncomport() -#endif /* TN_COMPORT */ - ) { - int x; - if ((x = ttgmdm()) > -1) { - if (!x && msgflg) { - printf( -"WARNING - No modem signals detected. Is your modem turned on? If not,\n\ -use Ctrl-C to interrupt dialing, turn on your modem, then %s.\n", - cx == XXANSW ? - "ANSWER again" : - "REDIAL" - ); - } - if (flow == FLO_RTSC) { - if (!(x & BM_CTS)) { - if (msgflg) - printf( -"WARNING - SET FLOW RTS/CTS is in effect but modem's CTS signal is off.\n\ -Disabling flow control temporarily %s...\n", - cx == XXANSW ? - "while waiting for call" : - "during dialing" - ); - flow = FLO_NONE; - } - } - } - } - if (cx == XXANSW) { /* ANSWER */ - success = ckdial("",0,0,1,0); - goto dialfin; - } - -/* Edit 192 adds the ability to dial repeatedly. */ - - i = 0; - dialcount = 0; - do { - if (i > 0) printf("\nDial attempt %d of %d...\n", i+1, xretries); - dialcount = i+1; - success = 0; - /* And the ability to dial alternate numbers. */ - /* Loop to dial each in a list of numbers for the same name... */ - for (j = 0; j < n && !success; j++) { /* until one answers. */ - s = dn_p2[j]; /* Next number in list */ - if (dn_x[j] >= dialrstr) { /* Dial restriction */ - printf("Restricted: %s, skipping...\n",dn_p[j]); - continue; - } - xredial = (i == 0 && j == 0) ? 0 : 1; - if (!s) s = dn_p[j]; - -#ifndef NOSPL - sav = s; - p = xdial(s); /* Apply DIAL macro now */ - if (p) s = p; -#endif /* NOSPL */ - - /* Dial confirmation */ - /* NOTE: the uq_xxx() calls allow for a GUI dialog */ - - if (i == 0 && dialcnf) { - char msgbuf[128]; - ckmakmsg(msgbuf,128,"Dialing ",s,NULL,NULL); - x = uq_ok(msgbuf,"Is this number correct? ",3,NULL,0); - if (!x) { - -#ifndef COMMENT - x = uq_txt( /* Allow GUI dialog */ -#ifdef OS2 -" Please enter the correct number,\r\n or press Enter to skip.", -#else -" Please enter the correct number,\r\n or press Return to skip.", -#endif /* OS2 */ - "Corrected phone number: ", - 1, - NULL, - atmbuf, - ATMBL, - s, - DEFAULT_UQ_TIMEOUT - ); - if (x && atmbuf[0]) { /* They gave a new one */ - s = atmbuf; - makestr(&(dn_p2[j]), s); - } - -#else /* COMMENT */ - -#ifdef CK_RECALL - extern int on_recall; -#endif /* CK_RECALL */ - cmsavp(psave,PROMPTL); - cmsetp( -#ifdef OS2 -" Please enter the correct number,\r\n or press Enter to skip: " -#else -" Please enter the correct number,\r\n or press Return to skip: " -#endif /* OS2 */ - ); - cmini(ckxech); - x = -1; - if (pflag) prompt(NULL); -#ifdef CK_RECALL - on_recall = 0; -#endif /* CK_RECALL */ - y = cmdgquo(); - cmdsquo(0); - while (x < 0) { - x = cmtxt("Corrected phone number","",&s,NULL); - cmres(); - } - if ((int) strlen(s) < 1) { - cmsetp(psave); - continue; - } - makestr(&(dn_p2[j]), s); - cmdsquo(y); - cmsetp(psave); -#endif /* COMMENT */ - } - } - if (dialtest) { /* Just testing */ - if (i + j == 0) - printf("\nTESTING...\n"); - if (dialmac) - printf(" Number: \"%s\" => \"%s\"\n",sav,s); - else - printf(" Number: \"%s\"\n",s); - dialsta = DIA_BUSY; - success = 0; - } else { - what |= W_DIALING; - success = ckdial(s,i,j,partial ? 3 : 0, xredial); /* Dial it */ - what &= ~(W_DIALING); - if (!success) { - if (dialsta < 8 || /* Break out if unrecoverable error */ - dialsta == DIA_INTR || - dialsta == DIA_ERR || - previous == DIA_PART - ) - break; - } - } - } - if (success) /* Succeeded, leave the outer loop */ - break; - if (dialsta < 8 || /* Break out if unrecoverable error */ - dialsta == DIA_INTR || /* Interrupted */ - dialsta == DIA_NODT || /* No dialtone */ - dialsta == DIA_NOAC || /* Access forbidden */ - dialsta == DIA_BLCK || /* Blacklisted */ - dialsta == DIA_DIR || /* Dialing directory error */ - dialsta == DIA_ERR || /* Modem command error */ - previous == DIA_PART) - break; - if (++i >= xretries) /* Break out if too many tries */ - break; - if (!backgrd && !quiet) { - if (dialint > 5) - printf( -"\nWill redial in %d second%s- press any key to redial immediately.\n", - dialint, - dialint == 1 ? " " : "s " - ); - printf("Ctrl-C to cancel...\n"); - } - x = dialint; /* Redial interval */ - while (x-- > 0) { - if ((y = conchk()) > 0) { /* Did they type something? */ - while (y--) coninc(0); /* Yes, absorb it */ - break; /* And wake up */ - } - sleep(1); /* No interrupt, sleep a sec */ - } - } while (!success); - - dialfin: - - if (cx != XXLOOK) { - if (!success) - bleep((short) BP_FAIL); - else if (!quiet) - bleep((short) BP_NOTE); -#ifdef OS2 - setint(); /* Fix OS/2 interrupts */ -#endif /* OS2 */ - if (sparity > -1) - parity = sparity; /* Restore parity if we saved it */ - flow = flowsave; -#ifdef OS2 - ttres(); /* Restore DIAL device */ -#endif /* OS2 */ -#ifdef VMS - concb((char)escape); /* Restore console */ -#endif /* VMS */ -#ifdef OS2 - { /* Set session title */ - char * p, name[72]; /* in window list. */ - char * q; - if (cx == XXANSW) { - q = "Incoming call"; - } else { - if (d_name) - q = d_name; - else if (dialnum) - q = dialnum; - else if (ttname[0]) - q = ttname; - else q = ""; - } - p = name; - if (success) { - strncpy(name,q,48); - while (*p) { /* Uppercase it for emphasis. */ - if (islower(*p)) - *p = toupper(*p); - p++; - } - } else - name[0] = NUL ; - os2settitle((char *) name, TRUE); - } -#endif /* OS2 */ - } - if (cx != XXLOOK) { - if (success) { - if (reliable == SET_AUTO) { /* It's not a reliable connection. */ - reliable = SET_OFF; - debug(F101,"dodial reliable","",reliable); - } - } else { -#ifndef NOHINTS - extern int hints; - if (hints && !quiet && dialsta != 9) { /* 9 == User interrupted */ - extern int dialmhu, dialhng, dialdpy; - extern char * dialmsg[]; - printf("\n*************************\n"); - printf("DIAL-class command failed.\n"); - printf("Modem type: %s\n", gmdmtyp()); - printf("Device: %s\n", ttname); - printf("Speed: %ld\n", speed); - printf("Dial status: %d",dialsta); - if (dialsta < 35 && dialmsg[dialsta]) - printf(" [%s]",dialmsg[dialsta]); - printf("\n"); - if (dialsta == DIA_TIMO || - dialsta == DIA_NRDY || - (dialsta > 13 && dialsta != DIA_BUSY && dialsta != DIA_NOAN) - ) { - switch (dialsta) { - case DIA_TIMO: - printf( -" . SET DIAL TIMEOUT to a greater value and try again.\n" - ); - break; - case DIA_NRSP: - case DIA_NRDY: - case DIA_NOIN: - printf( -" . Is the modem turned on?\n" - ); - printf( -" . Are you using the right communication port?\n" - ); - break; - case DIA_NODT: - printf( -" . Is the modem connected to the telephone line?\n" - ); - } - if (mdmtyp == n_GENERIC) { - printf( -" . Please choose a specific modem type with SET MODEM TYPE and try again.\n" - ); - printf( -" SET MODEM TYPE ? to see the list of known modem types.\n" - ); - } else { - printf( -" . Are you sure you have chosen the appropriate modem type?\n" - ); - } - if (speed > 19200L) { - printf( -" . Maybe the interface speed (%ld) is too fast:\n", speed - ); - printf( -" SET SPEED to a lower speed and try again.\n" - ); - printf( -" SET SPEED ? to see the list of valid speeds.\n" - ); - } - if (dialhng) { - if (dialmhu) - printf( -" . SET MODEM HANGUP-METHOD RS232 and try again.\n" - ); - else - printf( -" . SET MODEM HANGUP-METHOD MODEM-COMMAND and try again.\n" - ); - printf( -" . If that doesn't work, try again with SET DIAL HANGUP OFF.\n" - ); - } else { - printf( -" . Give a HANGUP or SET DIAL HANGUP ON command and try again.\n" - ); - } - if (!dialdpy) - printf( -" . Use SET DIAL DISPLAY ON to watch the dialog between Kermit and modem.\n" - ); - } -#ifndef NOSHOW - printf( -" . SHOW COMMUNICATIONS, SHOW MODEM, SHOW DIAL to see current settings.\n" - ); -#endif /* NOSHOW */ - -#ifndef NOHELP - printf( -" . HELP SET MODEM, HELP SET DIAL, and HELP DIAL for more information.\n" - ); -#endif /* NOHELP */ - printf("(Use SET HINTS OFF to suppress future hints.)\n"); - printf("*************************\n\n"); - } -#endif /* NOHINTS */ - } - } - return(success); -} -#endif /* NODIAL */ - -/* D O T Y P E -- Type (display) a file with various options... */ - -#ifdef BIGBUFOK -#define TYPBUFL 16384 -#else -#define TYPBUFL 256 -#endif /* BIGBUFOK */ - -int typ_lines = 0; /* \v(ty_ln) */ -int typ_mtchs = 0; /* \v(ty_lm) */ -static int typ_int = 0; /* Flag if TYPE interrupted */ - -#ifdef UNICODE -extern int fcharset, fileorder, byteorder, ucsorder; -#define TYPXBUFL TYPBUFL+TYPBUFL+TYPBUFL+4 -static char * mp = NULL; -static char * mbuf = NULL; -static long xn = 0L; - -static int -#ifdef CK_ANSIC -storechar(char c) -#else -storechar(c) char c; -#endif /* CK_ANSIC */ -{ - if (!mp) return(-1); - if (++xn > TYPXBUFL) - return(-1); - debug(F111,"storechar xn",ckitoa((int)c),xn); - *mp++ = c; - return(0); -} -#endif /* UNICODE */ - -static FILE * ofp = NULL; /* For /OUTPUT: file */ - -static int -typeline(buf,len,outcs,ofp) char * buf; int len, outcs; FILE * ofp; { - register int i; - - debug(F011,"typeline buf",buf,len); - /* debug(F101,"typeline outcs","",outcs); */ - -#ifdef OS2 -#ifndef NOLOCAL -#ifdef UNICODE - /* In K95 only, the buffer is guaranteed to be in UCS-2 if outcs >= 0. */ - /* Len is its length in bytes. There is no line terminator. */ - /* outcs is the file character-set number (FC_xxx) of the target set */ - /* that was requested by the user. */ - if (!inserver && !k95stdout) { - extern int wherex[], wherey[]; - extern unsigned char colorcmd; - - VscrnWrtUCS2StrAtt( VCMD, (unsigned short *)buf, len/2, - wherey[VCMD], wherex[VCMD], &colorcmd); - printf("\r\n"); - return(0); - } -#endif /* UNICODE */ -#endif /* NOLOCAL */ -#endif /* OS2 */ - -/* In Unix, VMS, etc, the line has already been converted to the desired */ -/* character-set, if one was given. OR... on all platforms, including in */ -/* K95, we don't know the character set. In either case we dump the line */ -/* byte by byte in case it contains NULs (printf() would truncate). */ - -#ifdef COMMENT - for (i = 0; i < len; i++) - putchar(buf[i]); -#else - for (i = 0; i < len; i++) { - if (ofp == stdout) { - putchar(buf[i]); - } else { - putc(buf[i],ofp); - } - } -#endif /* COMMENT */ - -#ifdef IKSD - if (inserver) { -#ifdef UNICODE - if (outcs == FC_UCS2) { - if (ofp == stdout) { - putchar(NUL); - } else { - putc(NUL,ofp); - } - } -#endif /* UNICODE */ - if (ofp == stdout) { - putchar('\r'); - } else { - putc('\r',ofp); - } - } -#endif /* IKSD */ -#ifdef UNICODE - if (outcs == FC_UCS2) { - if (ofp == stdout) { - putchar(NUL); - } else { - putc(NUL,ofp); - } - } -#endif /* UNICODE */ - if (ofp == stdout) { - putchar('\n'); - } else { - putc('\n',ofp); - } - fflush(stdout); - return(0); -} - -static int /* Get translated line */ -typegetline(incs, outcs, buf, n) int incs, outcs, n; char * buf; { - int x = 0, c0, c1, len = 0, count = 0, eof = 0, xlate = 0; -#ifdef UNICODE - int xxn = -1; - int yyn = -9; - xn = 0L; - -#ifdef DEBUG - if (deblog && typ_lines == 0) { - debug(F101,"typegetline incs","",incs); - debug(F101,"typegetline outcs","",outcs); - debug(F101,"typegetline feol","",feol); - debug(F101,"typegetline byteorder","",byteorder); - debug(F101,"typegetline ucsorder ","",ucsorder); - debug(F111,"typegetline fileorder","1",fileorder); - } -#endif /* DEBUG */ - - if (incs < 0) /* Shouldn't happen */ - return(-2); - - if (outcs == -1) /* Can happen */ - outcs = incs; - - if (incs != outcs || incs == FC_UCS2) { /* See if we should translate */ - xlate = 1; - if (!mbuf) { /* Allocate buffer if not allocated */ - mbuf = (char *)malloc(TYPXBUFL+1); /* yet */ - if (!mbuf) { - printf("WARNING: Translation buffer allocation failure.\n"); - printf("Translation will be skipped...\n"); - xlate = 0; - } - } - } - if (xlate) { /* Translating... */ - mp = mbuf; /* Reset working buffer pointer */ -/* - Here we call xgnbyte() in a loop, having it return UCS-2 bytes. In K95, we - use UCS-2 directly. Elsewhere, we feed the UCS-2 bytes into xpnbyte() to - convert them to the desired target character set. But since we are using - UCS-2, we have several sources for confusion: (1) xgnbyte() might return in - LE or BE byte order, with no explicit indication of what the order is; but - (2) xpnbyte() wants BE; but (3) Windows wants LE. -*/ - while (1) { - if (typ_int) /* Quit if interrupted */ - return(0); - c0 = xgnbyte(FC_UCS2,incs,NULL); /* Convert to UCS-2 */ - debug(F000,"typegetline c0","",c0); - if (c0 < 0) { /* EOF */ - eof++; - break; - } - c1 = xgnbyte(FC_UCS2,incs,NULL); /* Convert to UCS-2 */ - debug(F000,"typegetline c1","",c1); - if (c1 < 0) { /* EOF */ - eof++; - break; - } -#ifdef DEBUG - if (deblog && typ_lines == 0) { - if (count == 0) /* Check fileorder after BOM */ - debug(F111,"typegetline fileorder","2",fileorder); - } -#endif /* DEBUG */ - -#ifdef COMMENT -/* Now we have the two UCS-2 bytes. Which order are they in? */ - - if (fileorder > 0) { /* Little Endian */ - int t; /* So swap them */ - debug(F100,"typegetline swapping","",0); - t = c1; - c1 = c0; - c0 = t; - } -#endif /* COMMENT */ - if (c0 == 0 && c1 == 0x0D) /* Now see if we have EOL */ - yyn = xn; - - if (c0 == 0 && c1 == 0x0A) /* Now see if we have EOL */ - xxn = xn; - - count++; /* Count byte */ - -/* Give the two bytes to xpnbyte() in BE order */ - - if ((x = xpnbyte(c0,TC_UCS2,outcs,storechar)) < 0) return(-1); - if ((x = xpnbyte(c1,TC_UCS2,outcs,storechar)) < 0) return(-1); - - if (xxn > -1) { /* Have end of line? */ - xn = xxn; - if (yyn == xxn - 2) /* Adjust for CRLF */ - xn = yyn; - break; /* And break out of loop. */ - } - } - mbuf[xn] = NUL; - if (xn > n) /* Can truncate here... */ - xn = n; - memcpy(buf,mbuf,xn); - debug(F011,"typegetline xlate",buf,xn); - return((eof && (xn == 0)) ? -1 : xn); - } -#endif /* UNICODE */ -#ifdef COMMENT - /* We can't use this because, stupidly, zsinl() doesn't return a length. */ - /* It could be changed but then we'd have to change all ck?fio.c modules */ - x = zsinl(ZIFILE,buf,n); -#else - /* So instead, we copy zsinl() to here... */ - /* But note: This does not necessarily handle UCS-2 alignment properly; */ - /* that's what the code in the first section of this routine is for. */ - /* But it does tolerate files that contain NULs. */ - { - int a; - char *s; - - s = buf; - a = -1; /* Current character, none yet. */ - debug(F101,"typegetline zsinl simulation","",n); - while (n--) { /* Up to given length */ -#ifdef COMMENT - int old = 0; - if (feol) /* Previous character */ - old = a; -#endif /* COMMENT */ - if (zchin(ZIFILE,&a) < 0) { /* Read a character from the file */ - debug(F101,"typegetline zchin fail","",count); - if (count == 0) - x = -1; /* EOF or other error */ - break; - } else - count++; - if (feol) { /* Single-character line terminator */ - if (a == feol) - break; - } else { /* CRLF line terminator */ -#ifdef COMMENT -/* Debug log shows that in Windows, is returned as . */ -/* Apparently we're not reading the file in binary mode. */ - - if (a == '\015') /* CR, get next character */ - continue; - if (old == '\015') { /* Previous character was CR */ - if (a == '\012') { /* This one is LF, so we have a line */ - break; - } else { /* Not LF, deposit CR */ - *s++ = '\015'; - n--; - len++; - } - } -#else - if (a == LF) { - if (s[len] == CR) { /* This probably won't happen */ - s[len] = NUL; - s--; - len--; - } - break; - } -#endif /* COMMENT */ - } - *s = a; /* Deposit character */ - s++; - len++; - } - *s = '\0'; /* Terminate the string */ - } -#endif /* COMMENT */ - return(x < 0 ? -1 : len); -} - - -#ifndef MAC -SIGTYP -#ifdef CK_ANSIC -tytrap(int foo) /* TYPE interrupt trap */ -#else -tytrap(foo) int foo; -#endif /* CK_ANSIC */ -/* tytrap */ { -#ifdef __EMX__ - signal(SIGINT, SIG_ACK); -#endif - debug(F100,"type tytrap SIGINT","",0); - typ_int = 1; /* (Need arg for ANSI C) */ - SIGRETURN; -} -#endif /* MAC */ - -int -dotype(file, paging, first, head, pat, width, prefix, incs, outcs, outfile, z) - char * file, * pat, * prefix; int paging, first, head, width, incs, outcs; - char * outfile; int z; -/* dotype */ { - extern long ffc; - char buf[TYPBUFL+2]; - char * s = NULL; - int rc = 1, lines = 0, ucs2 = 0; - char ** tail = NULL; - int * tlen = NULL; - int tailing = 0, counting = 0; - int x, c, n, i, j, k = 0; - int number = 0, save, len, pfxlen = 0, evalpfx = 1; -#ifdef UNICODE - int ucsbom_sav; - extern int ucsbom; -#endif /* UNICODE */ -#ifdef NT - int gui = 0; -#endif /* NT */ - -#ifndef MAC -#ifdef OS2 -#ifdef NT - SIGTYP (* oldsig)(int); /* For saving old interrupt trap. */ -#else /* NT */ - SIGTYP (* volatile oldsig)(int); -#endif /* NT */ -#else /* OS2 */ - SIGTYP (* oldsig)(); -#endif /* OS2 */ -#endif /* MAC */ - -#ifdef KUI - if (outfile == (char *)1) { - gui = 1; - outfile = ""; - } -#endif /* KUI */ - - if (!file) file = ""; - if (!*file) return(-2); - - if (ofp != stdout) { /* In case of previous interruption */ - if (ofp) fclose(ofp); - ofp = stdout; - } - if (!outfile) outfile = ""; - if (outfile[0]) { - ofp = fopen(outfile,"w"); /* Open output file */ - if (!ofp) { - printf("?Can't open output file %s: %s\n",outfile,ck_errstr()); - ofp = stdout; - return(-9); - } - } - number = z; - if (number && prefix) prefix = NULL; - -#ifdef UNICODE - ucsbom_sav = ucsbom; /* We are not creating a file */ - ucsbom = 0; /* Do not use BOM bytes */ -#endif /* UNICODE */ - - typ_int = 0; - - save = binary; /* Save file type */ - - debug(F101,"dotype incs","",incs); - debug(F101,"dotype outcs","",outcs); - -#ifdef UNICODE - debug(F111,"dotype fileorder","A",fileorder); -#ifdef OS2 - if (!inserver && !k95stdout) - outcs = FC_UCS2; -#endif /* OS2 */ - - if (outcs == FC_UCS2) /* Output is UCS-2? */ - ucs2 = 1; - if (fileorder < 0) - fileorder = ucsorder; - debug(F111,"dotype fileorder","B",fileorder); -#endif /* UNICODE */ - -#ifdef CK_TTGWSIZ -#ifdef OS2 - ttgcwsz(); -#else /* OS2 */ - /* Check whether window size changed */ - if (ttgwsiz() > 0) { - if (tt_rows > 0 && tt_cols > 0) { - cmd_rows = tt_rows; - cmd_cols = tt_cols; - debug(F101,"dotype cmd_rows","",cmd_rows); - debug(F101,"dotype cmd_cols","",cmd_cols); - } - } -#endif /* OS2 */ -#endif /* CK_TTGWSIZ */ - - if (prefix) - pfxlen = strlen(prefix); - - if (paging < 0) { /* Count only, don't print */ - counting = 1; - prefix = NULL; - width = 0; - paging = 0; - } - if (ucs2) /* Crude... */ - width *= 2; - -#ifdef OS2 - if (*file) { - ckstrncpy(buf, file, TYPBUFL); /* Change / to \. */ - p = buf; - while (*p) { - if (*p == '/') *p = '\\'; - p++; - } - file = buf; - } else { - rc = 0; - goto xdotype; - } -#endif /* OS2 */ - - if (zchki(file) == -2) { /* It's a directory */ - debug(F111,"dotype zchki failure",file,-2); - if (xcmdsrc == 0) { - printf("?Not a regular file: \"%s\"\n",file); - rc = -9; - } else - rc = 0; - goto xdotype; - } - if (!zopeni(ZIFILE, file)) { /* Not a directory, open it */ - debug(F111,"dotype zopeni failure",file,0); - if (xcmdsrc == 0) { - printf("?Can't open file: \"%s\"\n",file); - rc = -9; - } else - rc = 0; - goto xdotype; - } - -#ifndef AMIGA -#ifndef MAC - errno = 0; - oldsig = signal(SIGINT, tytrap); /* Save current interrupt trap. */ - debug(F111,"type SIGINT trap set",ckitoa(errno),oldsig); -#endif /* MAC */ -#endif /* AMIGA */ - - if (paging > -1) /* More-prompting */ - xaskmore = paging; - - binary = 0; - - if (head < 0) { /* "tail" was requested */ - tailing = 1; /* Set flag */ - head = 0 - head; /* Get absolute number of lines */ - if (!counting) { - tail = (char **) malloc(head * sizeof(char *)); /* Allocate list */ - if (!tail) { - printf("?Memory allocation failure\n"); - goto xdotype; - - } - tlen = (int *) malloc(head * sizeof(int)); - if (!tlen) { - printf("?Memory allocation failure\n"); - goto xdotype; - - } - for (i = 0; i < head; i++) { /* Initialize each pointer in list. */ - tail[i] = NULL; - tlen[i] = 0; - } - } - } - typ_lines = 0; - typ_mtchs = 0; - -#ifdef UNICODE - if (outcs > -1 && (incs != outcs || incs == FC_UCS2)) { /* Translating? */ - ffc = 0L; - initxlate(incs,outcs); /* Set up translation functions */ - } else -#endif /* UNICODE */ - outcs = -1; /* Means we don't know the charset */ - - debug(F101,"dotype ffc","",ffc); - debug(F101,"dotype outcs 2","",outcs); -#ifdef UNICODE - debug(F111,"dotype fileorder","C",fileorder); -#endif /* UNICODE */ - - /* Allow the buffer to contain NULs */ - - for (n = first; - (len = typegetline(incs,outcs,buf,TYPBUFL)) > -1; - lines++ - ) { - debug(F011,"dotype line",buf,len); -#ifndef MAC - if (typ_int) { /* Interrupted? */ - typ_int = 0; - debug(F101,"type interrupted line","",lines); - printf("^C...\n"); /* Print message */ - if (ofp != stdout) { /* Close any output file */ - if (ofp) fclose(ofp); - ofp = stdout; - } - goto xxdotype; - } -#endif /* MAC */ - typ_lines++; /* For \v(ty_ln) */ - if (pat) /* Matching? */ - if (!ckmatch(pat,buf,1,1+4)) /* Line matches pattern? */ - continue; /* No, skip it */ - typ_mtchs++; - - if (head > 0 && !tailing && lines == head) /* Handle /HEAD:n */ - break; - - buf[TYPBUFL+1] = NUL; /* Just in case... */ - if (prefix) { /* Add specified prefix to each line */ - char pbuf[64]; - char * pp; - pp = prefix; -#ifndef NOSPL - if (evalpfx) { /* Prefix is a variable? */ - int n = 63; /* Maybe - evaluate it and see */ - char * p = pbuf; - zzstring(prefix,&p,&n); /* If there is no change */ - if (!strcmp(prefix,pbuf)) { /* it's not a variable */ - evalpfx = 0; /* So don't do this again. */ - } else { /* It was a variable */ - pp = pbuf; /* So substitute its value */ - pfxlen = 63 - n; /* and get its new length */ - } - } -#endif /* NOSPL */ - if (len + pfxlen + 2 < TYPBUFL) { - /* Shift right to make room for prefix */ - memcpy((char *)line+pfxlen,(char *)buf,len); - lset((char *)line,pp,pfxlen,SP); - debug(F110,"dotype prefix",line,pfxlen); - len += pfxlen; - memcpy((char *)buf,(char *)line,len); - } - } else if (number) { /* Line numbers */ - int x; - sprintf(line,"%4d. ",typ_lines); - x = strlen(line); - len += x; - if (len < LINBUFSIZ) { - memcpy((char *)&line[x],(char *)buf,len); - memcpy((char *)buf,(char *)line,len); - } - } - if (width > 0 && width <= TYPBUFL) { /* Truncate at given width. */ - char * obuf = line; /* But to do that first we must */ - int i,k,z; /* expand tabs; assume every 8 cols. */ - line[0] = NUL; - for (i = 0, k = 0; i < width; k++) { /* Character loop... */ - if (!buf[k]) /* No more chars in this line, done. */ - break; - if (buf[k] != '\t') { /* If it's not a tab */ - if (i >= LINBUFSIZ) /* Check for overflow */ - break; - obuf[i++] = buf[k]; /* and then deposit it. */ - obuf[i] = NUL; /* Keep it null-terminated */ - continue; - } - z = 8 - (i % 8); /* It's a tab, expand it. */ - if (z == 0) z = 8; - for (j = 0; j < z && i < LINBUFSIZ; j++) { -#ifdef UNICODE - if (ucs2 && !ucsorder) - obuf[i++] = NUL; -#endif /* UNICODE */ - obuf[i++] = ' '; -#ifdef UNICODE - if (ucs2 && ucsorder) - obuf[i++] = NUL; -#endif /* UNICODE */ - } - obuf[i++] = NUL; - obuf[i] = NUL; - } - obuf[width] = NUL; /* Now truncate at given width. */ -#ifdef COMMENT - /* This doesn't work for UCS-2 because it contains NULs */ - ckstrncpy(buf,obuf,TYPBUFL); /* and copy it back (again?) */ -#else - memcpy((char *)buf,(char *)obuf,i); /* Copy it back */ -#endif /* COMMENT */ - len = (i > width) ? width : i; /* Spare us another strlen()... */ - } - if (tailing) { /* If /TAIL:n... */ - k = lines % head; /* save this line in circular buffer */ - if (!counting) { - if (tail[k]) free(tail[k]); - tail[k] = malloc(len+2); - if (!tail[k]) { - printf("?Memory allocation failure\n"); - goto xdotype; - } - memcpy(tail[k],buf,len); - tlen[k] = len; - continue; - } - } - if (counting) /* If only counting */ - continue; /* we're done with this line */ - - if (paging) { /* Displaying this line... */ - int u; - u = len; /* Length in BYTES */ - if (ucs2) /* If outputting in UCS-2 */ - u /= 2; /* convert length to CHARACTERS */ - x = (u / cmd_cols) + 1; /* Crudely allow for wrap */ - if (cmd_rows > 0 && cmd_cols > 0) - n += x; /* This assumes terminal will wrap */ - } -#ifdef KUI - if ( gui ) { - int i; - unsigned short * uch = (unsigned short *)buf; - for ( i=0; i 0 && ofp == stdout) { /* Pause at end of screen */ - if (cmd_rows > 0 && cmd_cols > 0) { - if (n > cmd_rows - 3) { - if (!askmore()) - goto xdotype; - else - n = 0; - } - } - } -#endif /* CK_TTGWSIZ */ - } - - xdotype: - if (counting) { - fprintf(ofp, - "%s: %d line%s\n",file,typ_lines,typ_lines == 1 ? "" : "s"); - if (pat) - fprintf(ofp, - "%s: %d match%s\n",pat,typ_mtchs,typ_mtchs == 1 ? "" : "es"); - goto xxdotype; - } - if (tailing && tail) { /* Typing tail of file? */ - if (lines < head) { /* Yes, show the lines we saved */ - k = 0; /* Show all lines */ - } else { /* More lines than tail number */ - lines = k; /* Last line to show */ - k++; /* First line to show */ - if (k >= head) - k = 0; - } - n = first; /* Output line counter */ - for (i = k ;; i++) { /* Loop thru circular buffer */ -#ifndef MAC - if (typ_int) { /* Interrupted? */ - printf("^C...\n"); /* Print message */ - goto xxdotype; - } -#endif /* MAC */ - j = i % head; /* Index of this line */ - s = tail[j]; /* Point to line to display */ - if (!s) /* (shouldn't happen...) */ - break; - if (paging) { /* Crudely allow for line wrap */ - x = tlen[j]; - if (ucs2) x /= 2; - x = x / cmd_cols + 1; - if (cmd_rows > 0 && cmd_cols > 0) - n += x; - } - typeline(s,tlen[j],outcs,ofp); /* Display this line */ - if (paging && ofp == stdout) { /* Pause at end of screen */ - if (cmd_rows > 0 && cmd_cols > 0) { - if (n > cmd_rows - 3) { - if (!askmore()) - break; - else - n = 0; - } - } - } - tail[j] = NULL; - free(s); /* Free the line */ - if (i % head == lines) /* When to stop */ - break; - } - free((char *)tail); /* Free the list */ - tail = NULL; - if (tlen) free((char *)tlen); - tlen = NULL; - } - -/* Come here when finished or on SIGINT */ - - xxdotype: -#ifndef AMIGA -#ifndef MAC - signal(SIGINT,oldsig); /* Put old signal action back. */ -#endif /* MAC */ -#endif /* AMIGA */ - if (tailing && tail) { - for (i = 0; i < head; i++) { /* Free each line. */ - if (tail[i]) - free(tail[i]); - } - free((char *)tail); /* Free list pointer */ - if (tlen) - free((char *)tlen); - } - x = zclose(ZIFILE); /* Done, close the input file */ - if (ofp != stdout) { /* Close any output file */ - if (ofp) fclose(ofp); - ofp = stdout; - } - binary = save; /* Restore text/binary mode */ -#ifdef UNICODE - ucsbom = ucsbom_sav; /* Restore BOM usage */ -#endif /* UNICODE */ - -#ifdef KUI - if ( gui ) - gui_text_popup_wait(-1); /* Wait for user to close the dialog */ -#endif /* KUI */ - return(rc); -} - -/* GREP command */ - -#define GREP_CASE 0 /* /CASE */ -#define GREP_COUN 1 /* /COUNT */ -#define GREP_DOTF 2 /* /DOTFILES */ -#define GREP_NAME 3 /* /NAMEONLY */ -#define GREP_NOBK 4 /* /NOBACKUP */ -#define GREP_NODO 5 /* /NODOTFILES */ -#define GREP_NOLI 6 /* /NOLIST */ -#define GREP_NOMA 7 /* /INVERT = /NOMATCH */ -#define GREP_NOPA 8 /* /NOPAGE */ -#define GREP_NUMS 9 /* /LINENUMBERS */ -#define GREP_PAGE 10 /* /PAGE */ -#define GREP_RECU 11 /* /RECURSIVE */ -#define GREP_TYPE 12 /* /TYPE: */ -#define GREP_OUTP 13 /* /OUTPUTFILE: */ - -static struct keytab greptab[] = { - { "/count", GREP_COUN, CM_ARG }, - { "/dotfiles", GREP_DOTF, 0 }, - { "/linenumbers", GREP_NUMS, 0 }, - { "/nameonly", GREP_NAME, 0 }, - { "/nobackupfiles",GREP_NOBK, 0 }, - { "/nocase", GREP_CASE, 0 }, - { "/nodotfiles", GREP_NODO, 0 }, - { "/nolist", GREP_NOLI, 0 }, - { "/nomatch", GREP_NOMA, 0 }, - { "/nopage", GREP_NOPA, 0 }, - { "/output", GREP_OUTP, CM_ARG }, - { "/page", GREP_PAGE, 0 }, - { "/quiet", GREP_NOLI, CM_INV }, -#ifdef RECURSIVE - { "/recursive", GREP_RECU, 0 }, -#endif /* RECURSIVE */ - { "/type", GREP_TYPE, CM_ARG }, - { "", 0, 0 } -}; -static int ngreptab = sizeof(greptab)/sizeof(struct keytab)-1; - -int -dogrep() { - int match, x, y, fc, getval, mc = 0, count = 0, bigcount = 0; - int fline = 0, sline = 0, wild = 0, len = 0; - int xmode = -1, scan = 0; - char c, name[CKMAXPATH+1], outfile[CKMAXPATH+1], *p, *s, *cv = NULL; - FILE * fp = NULL; - - int /* Switch values and defaults */ - gr_coun = 0, - gr_name = 0, - gr_nobk = 0, - gr_case = 1, - gr_noli = 0, - gr_noma = 0, - gr_nums = 0, - gr_page = xaskmore; - - struct FDB sw, fl; - - g_matchdot = matchdot; /* Save global matchdot setting */ - outfile[0] = NUL; - - if (ofp != stdout) { /* In case of previous interruption */ - if (ofp) fclose(ofp); - ofp = stdout; - } - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "String or pattern to search for, or switch", - "", /* default */ - "", /* addtl string data */ - ngreptab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - greptab, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* Anything that doesn't match */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, /* xxstring */ - NULL, - NULL - ); - while (1) { /* Parse 0 or more switches */ - x = cmfdb(&sw); /* Parse something */ - if (x < 0) - return(x); - if (cmresult.fcode != _CMKEY) /* Break out if not a switch */ - break; - c = cmgbrk(); - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - if ((cmresult.nresult != GREP_COUN) && !getval && - (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - switch (cmresult.nresult) { - case GREP_COUN: { - gr_coun++; - if (getval) { - if ((x = cmfld("Variable for result","",&s,NULL)) < 0) - return(x); - makestr(&cv,s); - } - break; - } - case GREP_CASE: gr_case=0; break; - case GREP_NAME: gr_name++; gr_noli=0; break; - case GREP_NOBK: gr_nobk++; break; - case GREP_NOLI: gr_noli++; gr_name=0; gr_nums=0; break; - case GREP_NOMA: gr_noma++; break; - case GREP_NOPA: gr_page=0; break; - case GREP_NUMS: gr_nums++; gr_noli=0; break; - case GREP_PAGE: gr_page++; gr_noli=0; break; - case GREP_NODO: - matchdot = 0; - break; - case GREP_DOTF: - matchdot = 1; - break; -#ifdef RECURSIVE - case GREP_RECU: - recursive = 1; - break; -#endif /* RECURSIVE */ - case GREP_TYPE: { - extern struct keytab txtbin[]; - if ((x = cmkey(txtbin,3,"","",xxstring)) < 0) - return(x); - if (x == 2) { /* ALL */ - xmode = -1; - } else { /* TEXT or BINARY only */ - xmode = x; - scan = 1; - } - break; - } - case GREP_OUTP: /* Send output to file */ - if ((x = cmofi("File for GREP'd lines","",&s,xxstring)) < 0) - return(x); - ckstrncpy(outfile,s,CKMAXPATH); - break; - } - } - if (outfile[0]) { - ofp = fopen(outfile,"w"); /* Open output file */ - if (!ofp) { - printf("?Can't open output file %s: %s\n",outfile,ck_errstr()); - ofp = stdout; - return(-9); - } - gr_page = 0; - } - s = cmresult.sresult; - s = brstrip(s); /* Strip braces from pattern */ - if (!*s) { - printf("?Pattern required\n"); - return(-9); - } - ckstrncpy(tmpbuf,s,TMPBUFSIZ); /* Save pattern */ - if ((x = cmifi("File(s) to search","",&s,&wild,xxstring)) < 0) { - if (x == -3) { - printf("?File specification required\n"); - x = -9; - } - return(x); - } - s = brstrip(s); /* Strip braces from filename */ -#ifndef ZXREWIND - ckstrncpy(line,s,LINBUFSIZ); -#endif /* ZXREWIND */ - if ((y = cmcfm()) < 0) - return(y); - - if (gr_page > -1) - xaskmore = gr_page; /* Paging... */ - - p = tmpbuf; /* Point to pattern */ -#ifdef COMMENT -/* Now this is done in ckmatch */ - if (*p == '^') { /* '^' anchors pattern to beginning */ - p++; - } else if (*p != '*') { /* Otherwise prepend implied '*' */ - tmpbuf[0] = '*'; - p = tmpbuf; - } - x = strlen(p); /* Get length of result */ - if (x > 0 && x < TMPBUFSIZ) { /* '$' at end anchors pattern to end */ - if (p[x-1] == '$') { - p[x-1] = NUL; - } else if (p[x-1] != '*') { - p[x] = '*'; - p[x+1] = NUL; - } - } -#endif /* COMMENT */ - debug(F111,"grep pat",p,x); - -#ifdef ZXREWIND - fc = zxrewind(); /* Rewind the file list */ -#else - { - int flags = ZX_FILONLY; /* Expand file list */ - if (matchdot) flags |= ZX_MATCHDOT; - if (recursive) flags |= ZX_RECURSE; - fc = nzxpand(line,flags); - } -#endif /* ZXREWIND */ -#ifdef UNIX - sh_sort(mtchs,NULL,fc,0,0,filecase); -#endif /* UNIX */ - - debug(F101,"grep cmd_rows","",cmd_rows); - debug(F101,"grep cmd_cols","",cmd_cols); - - while (1) { /* Loop for each file */ - znext(name); /* Get next file */ - if (!name[0]) /* No more, done */ - break; - if (gr_nobk) /* Skipping backup files? */ - if (ckmatch("*.~[1-9]*~",name,1,1)) /* Backup file? */ - continue; /* Yes, skip */ - if (scan) { /* /TYPE: given? */ - switch (scanfile(name,&y,nscanfile)) { /* Yes, scan the file */ - case FT_BIN: - if (xmode != 1) - continue; - break; - case FT_TEXT: - case FT_7BIT: - case FT_8BIT: -#ifdef UNICODE - case FT_UTF8: - case FT_UCS2: -#endif /* UNICODE */ - if (xmode != 0) - continue; - } - } - fp = fopen(name,"r"); /* Open */ - if (!fp) /* Can't */ - continue; /* Skip */ - count = 0; /* Match count, this file */ - fline = 0; /* Line count, this file */ - while (1) { /* Loop for each line */ - if (fgets(line,LINBUFSIZ,fp) == NULL) { /* Get next line */ - fclose(fp); - fp = NULL; - debug(F100,"GREP EOF","",0); - break; - } - fline++; /* Count this line */ - line[LINBUFSIZ] = NUL; /* Make sure it's terminated */ - debug(F111,"GREP",line,fline); - len = (int)strlen(line); /* Get length */ - while (len > 0 && (line[len-1] == '\n' || line[len-1] == '\r')) - line[--len] = NUL; /* Chop off terminators */ - match = ckmatch(p,line,gr_case,1+4); /* Match against pattern */ - if (gr_noma) /* Invert match sense if requested */ - match = !match; - if (match) { /* Have a matching line */ - mc++; /* Total match count */ - count++; /* Match count this file */ - if (gr_name) { /* Don't care how many lines match */ - fclose(fp); /* Close the file */ - fp = NULL; /* and quit the line-reading loop. */ - break; - } - if (gr_coun || gr_noli) /* Not listing each line */ - continue; /* so don't print anything now. */ - if (wild) { /* If searching multiple files */ - fprintf(ofp,"%s:",name); /* print filename. */ - len += (int)strlen(name) + 1; - } - if (gr_nums) { /* If line numbers wanted */ - char nbuf[32]; - len += ckmakmsg(nbuf,32,ckitoa(fline),":",NULL,NULL); - fprintf(ofp,"%s",nbuf); - } - if (cmd_rows > 0 && cmd_cols > 0) - sline += (len / cmd_cols) + 1; - fprintf(ofp,"%s\n",line); /* Print the line. */ - if (sline > cmd_rows - 3) { - if (!askmore()) goto xgrep; else sline = 0; - } - } - } - if (!gr_noli) { /* If not not listing... */ - x = 0; - if (gr_coun) { /* Show match count only */ - fprintf(ofp,"%s:%d\n",name,count); - x++; - } else if (gr_name && count > 0) { /* Show name only */ - fprintf(ofp,"%s\n",name); - x++; - } - if (x > 0) { - if (++sline > cmd_rows - 3) { - if (!askmore()) goto xgrep; else sline = 0; - } - } - } - bigcount += count; /* Overall count */ - } - xgrep: -#ifndef NOSPL - if (gr_coun && cv) { /* /COUNT:blah */ - addmac(cv,ckitoa(bigcount)); /* set the variable */ - makestr(&cv,NULL); /* free this */ - } -#endif /* NOSPL */ - if (fp) fclose(fp); /* close input file if still open */ - if (ofp != stdout) { /* Close any output file */ - if (ofp) fclose(ofp); - ofp = stdout; - } - return(success = mc ? 1 : 0); -} - -/* System-independent directory */ - -static char ** dirlist = NULL; -static int ndirlist = 0; - -static VOID -freedirlist() { - if (dirlist) { - int i; - for (i = 0; i < ndirlist; i++) { - if (dirlist[i]) - free(dirlist[i]); - } - free((char *)dirlist); - dirlist = NULL; - } - ndirlist = 0; -} - -static struct keytab dirswtab[] = { /* DIRECTORY command switches */ - { "/after", DIR_AFT, CM_ARG }, - { "/all", DIR_ALL, 0 }, -#ifndef NOSPL - { "/array", DIR_ARR, CM_ARG }, -#endif /* NOSPL */ - { "/ascending", DIR_ASC, 0 }, - { "/backup", DIR_BUP, 0 }, - { "/before", DIR_BEF, CM_ARG }, - { "/brief", DIR_BRF, 0 }, - { "/descending", DIR_DSC, CM_INV }, - { "/directories", DIR_DIR, 0 }, - { "/dotfiles", DIR_DOT, 0 }, - { "/englishdate", DIR_DAT, 0 }, - { "/except", DIR_EXC, CM_ARG }, - { "/files", DIR_FIL, 0 }, - { "/heading", DIR_HDG, 0 }, - { "/isodate", DIR_ISO, 0 }, - { "/larger-than", DIR_LAR, CM_ARG }, -#ifdef CKSYMLINK - { "/followlinks", DIR_LNK, 0 }, -#endif /* CKSYMLINK */ - { "/message", DIR_MSG, CM_ARG }, - { "/nobackupfiles",DIR_NOB, 0 }, - { "/nodotfiles", DIR_NOD, 0 }, -#ifdef CKSYMLINK - { "/nofollowlinks",DIR_NLK, 0 }, -#endif /* CKSYMLINK */ - { "/noheading", DIR_NOH, 0 }, - { "/nomessage", DIR_NOM, 0 }, -#ifdef CK_TTGWSIZ - { "/nopage", DIR_NOP, 0 }, -#endif /* CK_TTGWSIZ */ -#ifdef RECURSIVE - { "/norecursive", DIR_NOR, 0 }, -#else -#ifdef VMS - { "/norecursive", DIR_NOR, 0 }, -#else -#ifdef datageneral - { "/norecursive", DIR_NOR, 0 }, -#endif /* datageneral */ -#endif /* VMS */ -#endif /* RECURSIVE */ - { "/nosort", DIR_NOS, 0 }, - { "/not-after", DIR_NAF, CM_ARG }, - { "/not-before", DIR_NBF, CM_ARG }, - { "/not-since", DIR_NAF, CM_INV|CM_ARG }, - { "/noxfermode", DIR_NOT, 0 }, - { "/output", DIR_OUT, CM_ARG }, -#ifdef CK_TTGWSIZ - { "/page", DIR_PAG, 0 }, -#endif /* CK_TTGWSIZ */ -#ifdef RECURSIVE - { "/recursive", DIR_REC, 0 }, -#else -#ifdef VMS - { "/recursive", DIR_REC, 0 }, -#else -#ifdef datageneral - { "/recursive", DIR_REC, 0 }, -#endif /* datageneral */ -#endif /* VMS */ -#endif /* RECURSIVE */ - { "/reverse", DIR_DSC, 0 }, - { "/since", DIR_AFT, CM_ARG|CM_INV }, - { "/smaller-than",DIR_SMA, CM_ARG }, - { "/sort", DIR_SRT, CM_ARG }, - { "/summary", DIR_SUM, 0 }, - { "/type", DIR_BIN, CM_ARG }, - { "/xfermode", DIR_TYP, 0 }, - { "/verbose", DIR_VRB, 0 }, - { "",0,0 } -}; -static int ndirswtab = (sizeof(dirswtab) / sizeof(struct keytab)) - 1; - -static struct keytab dirsort[] = { /* DIRECTORY /SORT: options */ - { "date", DIRS_DT, 0 }, - { "name", DIRS_NM, 0 }, - { "size", DIRS_SZ, 0 } -}; -static int ndirsort = (sizeof(dirsort) / sizeof(struct keytab)); - -static int dir_date = -1; /* Option defaults (-1 means none) */ -static int dir_page = -1; -static int dir_verb = 1; -static int dir_msg = -1; -#ifdef VMS -static int dir_sort = -1; /* Names are already sorted in VMS */ -static int dir_rvrs = -1; -#else -static int dir_sort = 1; /* Sort by default */ -static int dir_rvrs = 0; /* Not in reverse */ -#endif /* VMS */ -static int dir_skey = DIRS_NM; /* By name */ -#ifdef RECURSIVE -static int dir_recu = -1; -#endif /* RECURSIVE */ -static int dir_mode = -1; -static int dir_show = -1; /* Show all files by default */ -int dir_dots = -1; /* Except dot files */ -int dir_back = 1; -int dir_head = 0; -static char * dirmsg = NULL; -static int dirmsglen = 0; - -#ifndef NOSHOW -VOID -showdiropts() { - int x = 0; - extern int optlines; - prtopt(&optlines,"DIRECTORY"); - if (dir_show > 0) { - prtopt(&optlines,(dir_show == 1) ? "/FILES" : - ((dir_show == 2) ? "/DIRECTORIES" : "/ALL")); - x++; - } else { - prtopt(&optlines,"/ALL"); - x++; - } - if (dir_verb > -1) { - prtopt(&optlines,dir_verb ? "/VERBOSE" : "/BRIEF"); - x++; - } - if (dir_page > -1) { - prtopt(&optlines,dir_page ? "/PAGE" : "/NOPAGE"); - x++; - } - if (dir_date > -1) { - prtopt(&optlines,dir_date ? "/ENGLISHDATE" : "/ISODATE"); - x++; - } - if (dir_dots > -1) { - prtopt(&optlines,dir_dots ? "/DOTFILES" : "/NODOTFILES"); - x++; - } - if (dir_back > -1) { - prtopt(&optlines,dir_back ? "/BACKUP" : "/NOBACKUP"); - x++; - } - if (dir_head > -1) { - prtopt(&optlines,dir_head ? "/HEADING" : "/NOHEADING"); - x++; - } -#ifdef RECURSIVE - if (dir_recu > -1) { - prtopt(&optlines,dir_recu ? "/RECURSIVE" : "/NORECURSIVE"); - x++; - } -#endif /* RECURSIVE */ - if (dir_mode > -1) { - prtopt(&optlines,dir_mode ? "/XFERMODE" : "/NOXFERMODE"); - x++; - } - if (dir_sort == 0) { - x++; - prtopt(&optlines,"/NOSORT "); - } else if (dir_sort > 0) { - x++; - if (dir_skey == DIRS_NM) s = "/SORT:NAME"; - else if (dir_skey == DIRS_SZ) s = "/SORT:SIZE"; - else if (dir_skey == DIRS_DT) s = "/SORT:DATE"; - prtopt(&optlines,s); - } - if (dir_rvrs > -1) { - prtopt(&optlines,dir_rvrs ? "/REVERSE" : "/ASCENDING"); - x++; - } - if (dir_msg > -1) { - if (dir_msg == 0) { - prtopt(&optlines,"/NOMESSAGE"); - } else { - ckmakmsg(tmpbuf,TMPBUFSIZ,"/MESSAGE:{",dirmsg,"}",NULL); - prtopt(&optlines,tmpbuf); - } - x++; - } - if (!x) prtopt(&optlines,"(no options set)"); - prtopt(&optlines,""); -} -#endif /* NOSHOW */ - -int -setdiropts() { /* Set DIRECTORY option defaults */ - int xb = -1, xv = -1, xp = -1, xd = -1, xh = -1, xf = -1; - int xk = -1, xr = -1, xs = -1, xx = -1, xm = -1, xa = -1, xg = -1; - int getval; - char c; - while (1) { - if ((y = cmswi(dirswtab,ndirswtab,"Switch","",xxstring)) < 0) { - if (y == -3) - break; - else - return(y); - } - c = cmgbrk(); - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - switch (y) { - case DIR_BRF: xv = 0; break; - case DIR_VRB: xv = 1; break; - case DIR_PAG: xp = 1; break; - case DIR_NOP: xp = 0; break; - case DIR_ISO: xd = 0; break; - case DIR_DAT: xd = 1; break; - case DIR_HDG: xh = 1; break; - case DIR_NOH: xh = 0; break; - case DIR_DOT: xf = 1; break; - case DIR_NOD: xf = 0; break; - case DIR_ALL: xa = 3; break; - case DIR_DIR: xa = 2; break; - case DIR_FIL: xa = 1; break; - case DIR_SRT: - x = DIRS_NM; - if (getval) - if ((x = cmkey(dirsort,ndirsort,"Sort key","name",xxstring)) < 0) - return(x); - xk = x; - xs = 1; - break; - case DIR_NOS: xs = 0; break; - case DIR_ASC: xx = 0; break; - case DIR_DSC: xx = 1; break; - case DIR_REC: xr = 1; break; - case DIR_NOR: xr = 0; break; - case DIR_TYP: xm = 1; break; - case DIR_NOT: xm = 0; break; - case DIR_BUP: xb = 1; break; - case DIR_NOB: xb = 0; break; - case DIR_NOM: xg = 0; break; - case DIR_MSG: - if (getval) - if ((x = cmfld("Message to append to each line", - "", - &s, - xxstring - )) < 0) - return(x); - xg = 1; - ckstrncpy(tmpbuf,brstrip(s),TMPBUFSIZ); - break; - default: - printf("?This option can not be set\n"); - return(-9); - } - } - if ((x = cmcfm()) < 0) /* Get confirmation */ - return(x); - if (xv > -1) dir_verb = xv; /* Confirmed, save defaults */ - if (xp > -1) dir_page = xp; - if (xd > -1) dir_date = xd; - if (xh > -1) dir_head = xh; - if (xs > -1) dir_sort = xs; - if (xk > -1) dir_skey = xk; - if (xx > -1) dir_rvrs = xx; - if (xf > -1) dir_dots = xf; - if (xa > -1) dir_show = xa; - if (xm > -1) dir_mode = xm; - if (xb > -1) dir_back = xb; -#ifdef RECURSIVE - if (xr > -1) dir_recu = xr; -#endif /* RECURSIVE */ - if (xg > -1) dir_msg = xg; - if (xg > 0) - makestr(&dirmsg,tmpbuf); - return(success = 1); -} - -int -domydir() { /* Internal DIRECTORY command */ - extern char *months[]; -#ifdef VMS - _PROTOTYP( char * zrelname, (char *,char *) ); - char * cdp = NULL; -#endif /* VMS */ - - char name[CKMAXPATH+1], outfile[CKMAXPATH+1], *p = NULL, c = NUL; - char linebuf[CKMAXPATH+256]; - char * mstr = NULL, * dstr = NULL, * s2 = NULL; - long len = 0, ndirs = 0, nfiles = 0, nbytes = 0, nmatches = 0; - int verbose = 0, wild = 0, page = 0, n = 0, engdate = 0, summary = 0; - int heading = 0, xsort = 0, reverse = 0, sortby = 0, msg = 0; - int k, i = 0, x = 0, nx = 0, skey = 0, dlen = 0, itsadir = 0; - int show = 3, xfermod = 0, backup = 1, rc = 0, getval = 0; - int fs = 0; - int multiple = 0; - int cmifn1 = 1, cmifn2 = 0; - long minsize = -1L, maxsize = -1L; - struct FDB sw, fi, fl; - char dbuf[32], xbuf[32]; - -#ifndef NOSPL - char array = NUL; - char ** ap = NULL; -#endif /* NOSPL */ - char - * dir_aft = NULL, - * dir_bef = NULL, - * dir_naf = NULL, - * dir_nbf = NULL, - * dir_exc = NULL; - char * xlist[16]; - - g_matchdot = matchdot; /* Save global matchdot setting */ - nolinks = 2; /* (it should already be 2) */ - outfile[0] = NUL; /* No output file yet */ - - if (ofp != stdout) { /* In case of previous interruption */ - if (ofp) fclose(ofp); - ofp = stdout; - } - for (i = 0; i < 16; i++) xlist[i] = NULL; - - name[0] = NUL; - freedirlist(); /* In case not freed last time */ - page = dir_page > -1 ? dir_page : xaskmore; /* Set option defaults */ - engdate = dir_date > -1 ? dir_date : 0; - verbose = dir_verb > -1 ? dir_verb : 1; - heading = dir_head > -1 ? dir_head : 0; - xsort = dir_sort > -1 ? dir_sort : 0; - sortby = dir_skey > -1 ? dir_skey : 0; - reverse = dir_rvrs > -1 ? dir_rvrs : 0; - msg = dir_msg > -1 ? dir_msg : 0; -#ifdef UNIXOROSK - if (dir_dots > -1) matchdot = dir_dots; -#endif /* UNIXOROSK */ - xfermod = dir_mode > -1 ? dir_mode : 0; - backup = dir_back > -1 ? dir_back : 1; -#ifdef RECURSIVE - recursive = dir_recu > -1 ? dir_recu : 0; -#endif /* RECURSIVE */ - show = dir_show > -1 ? dir_show : 3; - -#ifdef CK_TTGWSIZ -#ifdef OS2 - ttgcwsz(); /* Screen length for more-prompting */ -#else /* OS2 */ - /* Check whether window size changed */ - if (ttgwsiz() > 0) { - if (tt_rows > 0 && tt_cols > 0) { - cmd_rows = tt_rows; - cmd_cols = tt_cols; - } - } -#endif /* OS2 */ -#endif /* CK_TTGWSIZ */ - - diractive = 1; - cmifn1 = nolinks | 1; /* 1 = files or directories */ - cmifn2 = 0; /* 0 = not directories only */ - - again: - - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "Enter or Return to confirm the command, or\n\ - file specification, or switch", - "", /* default */ - "", /* addtl string data */ - ndirswtab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - dirswtab, /* Keyword table */ - &fi /* Pointer to next FDB */ - ); - cmfdbi(&fi, /* 2nd FDB - filespec to match */ - _CMIFI, /* fcode */ - "File specification", /* hlpmsg */ -#ifdef datageneral - "+", /* Default filespec is wildcard */ -#else /* that matches all files... */ -#ifdef VMS - "*.*", -#else - "*", -#endif /* VMS */ -#endif /* datageneral */ - "", /* addtl string data */ - cmifn1, - cmifn2, /* 1 = only dirs; 0 files or dirs */ - xxstring, - NULL, - &fl - ); - cmfdbi(&fl, /* Anything that doesn't match */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - while (1) { /* Parse 0 or more switches */ - x = cmfdb(&sw); /* Parse something */ - debug(F101,"domydir cmfdb","",x); - if (x < 0) - return(x); - if (cmresult.fcode != _CMKEY) /* Break out if not a switch */ - break; - c = cmgbrk(); - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - switch (k = cmresult.nresult) { - case DIR_BRF: verbose = 0; break; - case DIR_VRB: verbose = 1; break; -#ifdef CK_TTGWSIZ - case DIR_PAG: page = 1; break; - case DIR_NOP: page = 0; break; -#endif /* CK_TTGWSIZ */ - case DIR_ISO: engdate = 0; break; - case DIR_DAT: engdate = 1; break; - case DIR_HDG: heading = 1; break; - case DIR_NOH: heading = 0; break; -#ifdef UNIXOROSK - case DIR_DOT: matchdot = 1; break; - case DIR_NOD: matchdot = 0; break; -#endif /* UNIXOROSK */ - case DIR_ALL: - show = 3; - cmifn1 |= 1; - cmifn2 = 0; - goto again; - case DIR_DIR: - show = 2; - cmifn1 |= 1; - cmifn2 = 1; - goto again; - case DIR_FIL: - show = 1; - cmifn1 &= ~(1); - cmifn2 = 0; - goto again; - case DIR_SRT: - x = DIRS_NM; - if (c == ':' || c == '=') - if ((x = cmkey(dirsort,ndirsort,"Sort key","name",xxstring)) < 0) - return(x); - xsort = 1; - sortby = x; - break; - - case DIR_BUP: backup = 1; fs++; break; - case DIR_NOB: backup = 0; fs++; break; - - case DIR_NOS: xsort = 0; break; - case DIR_ASC: reverse = 0; break; - case DIR_DSC: reverse = 1; break; -#ifdef RECURSIVE - case DIR_REC: recursive = 1; diractive = 1; break; - case DIR_NOR: recursive = 0; diractive = 0; break; -#endif /* RECURSIVE */ - case DIR_TYP: xfermod = 1; break; - case DIR_NOT: xfermod = 0; break; - -#ifdef CKSYMLINK - case DIR_LNK: /* Follow links */ - nolinks = 0; - cmifn1 &= ~(2); - goto again; - case DIR_NLK: /* Don't follow links */ - nolinks = 2; - cmifn1 &= ~(2); - goto again; -#endif /* CKSYMLINK */ - - case DIR_NOM: msg = 0; break; - case DIR_MSG: - if (c == ':' || c == '=') - if ((x = cmfld("Message to append to each line", - "", - &s, - xxstring - )) < 0) - return(x); - msg = 1; - ckstrncpy(tmpbuf,brstrip(s),TMPBUFSIZ); - break; - - case DIR_SMA: - case DIR_LAR: - if (!getval) break; - if ((x = cmnum("File size in bytes","0",10,&y,xxstring)) < 0) - return(x); - fs++; - show = 1; - switch (cmresult.nresult) { - case DIR_SMA: minsize = y; break; - case DIR_LAR: maxsize = y; break; - } - break; - -#ifndef NOSPL - case DIR_ARR: - if (c != ':' && c != '=') { - printf("?Array name required\n"); - return(-9); - } - if ((x = cmfld("Array name (a single letter will do)", - "", - &s, - NULL - )) < 0) { - if (x == -3) { - printf("?Array name required\n"); - return(-9); - } else - return(x); - } - if (!*s) { - printf("?Array name required\n"); - return(-9); - } - s2 = s; - if (*s == CMDQ) s++; - if (*s == '&') s++; - if (!isalpha(*s)) { - printf("?Bad array name - \"%s\"\n",s2); - return(-9); - } - array = *s++; - if (isupper(array)) array = tolower(array); - if (*s && (*s != '[' || *(s+1) != ']')) { - printf("?Bad array name - \"%s\"\n",s2); - return(-9); - } - break; -#endif /* NOSPL */ - case DIR_AFT: - case DIR_BEF: - case DIR_NAF: - case DIR_NBF: - if (!getval) break; - if ((x = cmdate("File-time","",&s,0,xxstring)) < 0) { - if (x == -3) { - printf("?Date-time required\n"); - rc = -9; - } else - rc = x; - goto xdomydir; - } - fs++; - switch (k) { - case DIR_AFT: makestr(&dir_aft,s); break; - case DIR_BEF: makestr(&dir_bef,s); break; - case DIR_NAF: makestr(&dir_naf,s); break; - case DIR_NBF: makestr(&dir_nbf,s); break; - } - break; - case DIR_EXC: - if (!getval) break; - if ((x = cmfld("Pattern","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Pattern required\n"); - rc = -9; - } else - rc = x; - goto xdomydir; - } - fs++; - makestr(&dir_exc,s); - break; - - case DIR_SUM: - summary = 1; break; - - case DIR_BIN: { - extern struct keytab txtbin[]; - extern int xfiletype; - if (!getval) break; - if ((x = cmkey(txtbin,3,"","all",xxstring)) < 0) { - rc = x; - goto xdomydir; - } - if (x == 2) { - xfiletype = -1; - } else { - xfiletype = x; - fs = 1; - } - break; - } - case DIR_OUT: - if ((x = cmofi("File for directory listing","",&s,xxstring)) < 0) - return(x); - ckstrncpy(outfile,s,CKMAXPATH+1); - break; - - default: - printf("?Sorry, not implemented yet - \"%s\"\n", atmbuf); - goto xdomydir; - } - } - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Safe copy of filespec */ - -/* ^^^ START MULTIPLE */ - - while (1) { - x = cmfld("Another filespec or Enter","",&s,xxstring); - if (x == -3) - break; - if (x < 0) - return(x); - ckstrncat(line,",",LINBUFSIZ); - ckstrncat(line,s,LINBUFSIZ); - multiple++; - } - ckmakmsg(tmpbuf,TMPBUFSIZ,"{",line,"}",NULL); - ckstrncpy(line,tmpbuf,LINBUFSIZ); - cmresult.nresult = 1; - cmresult.fcode = _CMIFI; - -/* ^^^ END MULTIPLE */ - - s = line; - - if ((x = cmcfm()) < 0) /* Get confirmation */ - return(x); - if (cmresult.fcode != _CMIFI) { /* Nothing matched */ - char * m; - if (*s == '/') -#ifdef UNIXOROSK - m = "does not match switch or name of accessible file"; -#else -#ifdef OS2 - m = "does not match switch or name of accessible file"; -#else - m = "no switches match"; -#endif /* OS2 */ -#endif /* UNIXOROSX */ - else - m = "not found or not accessible"; - printf("\"%s\" - %s\n",s,m); - rc = -9; - goto xdomydir; - } - wild = cmresult.nresult; /* Wildcard was given? */ - debug(F111,"domydir cmifi2",s,wild); - - if (outfile[0]) { - ofp = fopen(outfile,"w"); /* Open output file */ - if (!ofp) { - printf("?Can't open output file %s: %s\n",outfile,ck_errstr()); - ofp = stdout; - return(-9); - } - page = 0; - } - -#ifdef OS2 - if (!wild) { - if (zchki(s) == -2) { /* Found a directory */ - p = s + (int)strlen(s) - 1; /* Yes */ - if (*p == '\\' || *p == '/') - strcat(s, "*"); - else if (*p == ':') - strcat(s, "./*"); - else - strcat(s, "/*"); - wild = 1; /* Now it's wild */ - } - } -#else - if (!wild) if (isdir(s)) { /* Is it a directory? */ - p = s + (int)strlen(s) - 1; /* Yes */ -#ifdef VMS - { - /* Convert from FOO.DIR;1 to [x.FOO] if necessary */ - char buf[CKMAXPATH+1]; - debug(F000,"domydir directory 0",s,*p); - if (cvtdir(s,buf,CKMAXPATH) > 0) - ckstrncpy(line,buf,LINBUFSIZ); - } -#endif /* VMS */ - debug(F000,"domydir directory 1",s,*p); -#ifdef VMS - if (*p == ']' || *p == '>' || *p == ':') - strcat(s, "*.*"); -#else -#ifdef datageneral - if (*p == ':') - strcat(s, "+"); - else - strcat(s, ":+"); -#else -#ifdef STRATUS - if (*p == '>') - strcat(s, "*"); - else - strcat(s, ">*"); -#endif /* STRATUS */ -#endif /* datageneral */ -#endif /* VMS */ - wild = 1; /* Now it's wild */ - debug(F000,"domydir directory 2",s,*p); - } -#endif /* OS2 */ - -#ifdef ZXREWIND -/* cmifi() already called nzxpand so we can just re-use the same list. */ - if (!multiple) { - x = zxrewind(); /* Rewind the list */ - debug(F111,"domydir zxrewind",s,x); - } else { -#endif /* ZXREWIND */ - nzxopts = (show == ZX_DIRONLY) ? ZX_DIRONLY : - (show == ZX_FILONLY ? ZX_FILONLY : 0); - if (matchdot) nzxopts |= ZX_MATCHDOT; - if (recursive) nzxopts |= ZX_RECURSE; - x = nzxpand(s,nzxopts); /* Expand file list */ - debug(F111,"domydir nzxpand",s,x); -#ifdef ZXREWIND - } -#endif /* ZXREWIND */ - -#ifndef NOSPL - if (array) { - int n, xx; - n = (x < 0) ? 0 : x; - if ((xx = dclarray(array,n)) < 0) { - printf("?Array declaration failure\n"); - rc = -9; - goto xdomydir; - } - array = xx; - ap = a_ptr[array]; - if (n < 1) { - rc = 0; - goto xdomydir; - } - } else -#endif /* NOSPL */ - if (x < 1) { -#ifdef CKROOT - extern int ckrooterr; - if (ckrooterr) - printf("?Off limits: %s\n",s); - else -#endif /* CKROOT */ - if (x == 0 && isdir(s)) - printf("?Empty directory - \"%s\"\n", s); - else - printf("?%s %s match - \"%s\"\n", - (x == 0) ? "No" : "Too many", - (show == 2) ? "directories" : "files", - s - ); - rc = -9; - goto xdomydir; - } - nx = x; /* Remember how many files */ - - if (msg) { - makestr(&dirmsg,tmpbuf); - dirmsglen = strlen(tmpbuf); - } - -#ifdef VMS - cdp = zgtdir(); /* Get current directory */ - debug(F110,"domydir VMS zgtdir",cdp,0); -#endif /* VMS */ - - if (xsort && verbose) { /* If sorting, allocate space */ - if (!(dirlist = (char **) malloc((x + 1) * sizeof(char **)))) { - if (!quiet) { - printf("* Warning: Failure to allocate memory for sorting.\n"); - printf("* Will proceed without sorting...\n"); - } - xsort = 0; - } - debug(F101,"domydir sort malloc","",xsort); - } - - /* Display the listing */ - -#ifndef NOSPL - if (array) /* Storing instead of printing */ - heading = 0; -#endif /* NOSPL */ - - if (heading) { /* If /HEADING print heading */ - zfnqfp(s,TMPBUFSIZ,tmpbuf); - fprintf(ofp,"\nDirectory of %s\n\n",tmpbuf); - n += 3; - } - if (page > -1) /* Paging */ - xaskmore = page; - - if (!verbose) { /* /BRIEF */ - if (outfile[0]) { /* To file */ - int k = 0; - znext(name); - while (name[0]) { /* One line per file */ - k++; - if (fs) if (fileselect(name, - dir_aft,dir_bef,dir_naf,dir_nbf, - minsize,maxsize,!backup,16,xlist) < 1) { - znext(name); - continue; - } - fprintf(ofp,"%s\n",name); - znext(name); - } - if (heading) - fprintf(ofp,"Files: %d\n\n",k); - rc = 1; - goto xdomydir; - } else { - rc = filhelp(x,"","",n,0); - if (rc < 0) - goto xdomydir; - if (heading && rc > 0) - fprintf(ofp,"Files: %d\n\n",x); /* (Might scroll a line or 2) */ - rc = 1; - goto xdomydir; - } - } - ndirs = nfiles = nbytes = 0L; /* Initialize counters */ - - if (dir_exc) /* Have exception list? */ - makelist(dir_exc,xlist,16); /* Yes, convert to array */ - - diractive = 1; - znext(name); /* Get next file */ - while (name[0]) { /* Loop for each file */ - if (fs) if (fileselect(name, - dir_aft,dir_bef,dir_naf,dir_nbf, - minsize,maxsize,!backup,16,xlist) < 1) { - znext(name); - continue; - } - len = zgetfs(name); /* Get file length */ - debug(F111,"domydir zgetfs",name,len); -#ifdef VMSORUNIX - itsadir = zgfs_dir; /* See if it's a directory */ -#else - itsadir = (len == -2 || isdir(name)); -#endif /* VMSOUNIX */ - debug(F111,"domydir itsadir",name,itsadir); - if ((itsadir && (show == 1)) || (!itsadir && (show == 2))) { - znext(name); - continue; - } - /* Get here when we know we have selected this file */ - - nmatches ++; - if (itsadir) { /* Accumulate totals for summary */ - ndirs++; - } else { - nfiles++; - nbytes += len; - } - if (summary) { /* Summary only, no detail */ - znext(name); - continue; - } -#ifndef NOSPL - if (array) { - debug(F111,"domydir array",name,nfiles); - if (ap) - makestr(&(ap[nmatches]),name); - znext(name); - continue; - } -#endif /* NOSPL */ - -/* - NOTE: The sprintf's in this routine should be safe. They involve - permission strings, date/time strings, and filenames, all of which have - known maximum lengths; none of these items is input from users. The - destination buffers are large enough to hold maximum sizes for any and - all items. -*/ - dstr = zfcdat(name); /* Get modification date/time */ - debug(F111,"domydir zcfdat",dstr,0); - if (!dstr) dstr = ""; - { -/* - Note that zfcdat() always returns "" or yyyymmdd hh:mm:ss, so any warnings - about possible out-of-bounds dstr[] array refs do not apply. This block of - code is to stifle the warnings and also allows for any out-of-spec - zfcdat() implementations. -*/ - int x; - char * p = "00000000 00:00:00"; - x = ckstrncpy(xbuf,dstr,32); - if (x < 17) ckstrncpy(&xbuf[x],p+x,32-x); - dstr = xbuf; - } - if (engdate) { /* English date requested? */ - short month, day, year, hour, minute, seconds; - month = (dstr[4]-48)*10 + (dstr[5]-48); - mstr = (month > 0 && month <= 12) ? months[month-1] : "xxx"; - day = (dstr[6]-48)*10 + (dstr[7]-48); - year = (((dstr[0]-48)*10 + - (dstr[1]-48))*10 + - (dstr[2]-48))*10 + - (dstr[3]-48); - hour = (dstr[9]-48)*10 + (dstr[10]-48); - minute = (dstr[12]-48)*10 + (dstr[13]-48); - seconds = (dstr[15]-48)*10 + (dstr[16]-48); - sprintf(dbuf, /* SAFE */ - "%2d-%s-%4d %02d:%02d:%02d", - day,mstr,year,hour,minute,seconds - ); - dstr = dbuf; - } else { /* ISO date */ - dbuf[0] = dstr[0]; /* yyyy */ - dbuf[1] = dstr[1]; - dbuf[2] = dstr[2]; - dbuf[3] = dstr[3]; - dbuf[4] = '-'; - dbuf[5] = dstr[4]; /* mm (numeric) */ - dbuf[6] = dstr[5]; - dbuf[7] = '-'; - dbuf[8] = dstr[6]; /* dd */ - dbuf[9] = dstr[7]; - strcpy(dbuf+10,dstr+8); /* hh:mm:ss */ - dstr = dbuf; - } - dlen = strlen(dbuf); /* Length of date */ - name[CKMAXPATH] = NUL; -#ifdef CK_PERMS -#ifdef VMSORUNIX - p = ziperm(name); /* Get permissions */ - debug(F110,"ziperm perms",p,0); -#else - p = zgperm(name); - debug(F110,"zgperm perms",p,0); -#endif /* VMSORUNIX */ -#else - p = NULL; - debug(F110,"NULL perms",p,0); -#endif /* CK_PERMS */ - -#ifdef VMS - /* Get relative name to save space -- VMS fullnames are long... */ - ckstrncpy(name,zrelname(name,cdp),CKMAXPATH); -#endif /* VMS */ - - if (itsadir && len < 0) { /* Directory */ -#ifdef VMS - sprintf(linebuf,"%-22s%-10s %s %s",p,"",dstr,name); -#else - if (p) - sprintf(linebuf,"%10s%-10s %s %s",p,"",dstr,name); - else - sprintf(linebuf,"%-10s %s %s", "", dstr, name); -#endif /* VMS */ - } else { /* Regular file */ -#ifdef VMS - sprintf(linebuf,"%-22s%10ld %s %s", p, len, dstr, name); -#else - if (p) - sprintf(linebuf,"%10s%10ld %s %s", p, len, dstr, name); - else - sprintf(linebuf,"%10ld %s %s", len, dstr, name); -#endif /* VMS */ - } -#ifdef UNIX -#ifdef CKSYMLINK - if (zgfs_link) { - int n, m; - extern char linkname[]; - n = strlen(linebuf); - m = strlen(linkname) + n; - if (m < CKMAXPATH + 58) - strcpy(linebuf+n, " -> "); /* safe (checked) */ - if (m + 4 < CKMAXPATH - 58) - strcpy(linebuf+n+4, linkname); /* safe (checked) */ - } else -#endif /* CKSYMLINK */ -#endif /* UNIX */ - if (xfermod) { /* Show transfer mode */ - int i, x, y; - char * s = ""; - y = -1; - x = scanfile(name,&y,nscanfile); - switch (x) { - case FT_TEXT: s = " (T)"; break; - case FT_7BIT: s = " (T)(7BIT)"; break; - case FT_8BIT: s = " (T)(8BIT)"; break; -#ifdef UNICODE - case FT_UTF8: s = " (T)(UTF8)"; break; - case FT_UCS2: - s = y ? " (T)(UCS2LE)" : " (T)(UCS2BE)"; - break; -#endif /* UNICODE */ - case FT_BIN: s = " (B)"; break; - } - if (!*s) { - s = binary ? " (B)" : " (T)"; - } - if (*s) { - int n; - n = strlen(linebuf); - if (n + 4 < CKMAXPATH - 58) - strcpy(linebuf+n, s); /* safe (checked) */ - } - } - if (msg && dirmsg) { - int n; - n = strlen(linebuf); - if (n + dirmsglen + 2 < CKMAXPATH) - sprintf((char *)(linebuf+n)," %s", dirmsg); /* SAFE */ - } - if (xsort) { /* Sorting - save line */ - i = strlen(linebuf); - if ((ndirlist >= nx) || - !(dirlist[ndirlist] = (char *)malloc(i+1))) { - printf("?Memory allocation error - try /NOSORT\n"); - rc = -9; - goto xdomydir; - } - strcpy(dirlist[ndirlist],linebuf); /* safe */ - ndirlist++; - } - znext(name); /* Peek ahead to next file */ - - if (!xsort) { - fprintf(ofp,"%s\n",linebuf); - if (page && (name[0] || heading)) { /* If /PAGE */ - if (cmd_cols > 0) { - int x = strlen(linebuf); - int y; - y = (x % cmd_cols) ? 1 : 0; - n += x / cmd_cols + y; - } else { - n++; - } -#ifdef CK_TTGWSIZ - if (n > (cmd_rows - 3)) { /* Do more-prompting */ - if (!askmore()) { - rc = 0; - goto xdomydir; - } else - n = 0; - } -#endif /* CK_TTGWSIZ */ - } - } - } -#ifndef NOSPL - if (array) { - if (ap) - makestr(&(ap[0]),ckitoa(nmatches)); - rc = 1; - goto xdomydir; - } -#endif /* NOSPL */ - if (xsort) { - skey = 0; -#ifdef VMS - switch (sortby) { - case DIRS_NM: skey = dlen + 35; break; - case DIRS_DT: skey = 33; break; - case DIRS_SZ: skey = 21; - } -#else - if (p) { - switch (sortby) { - case DIRS_NM: skey = dlen + 24; break; - case DIRS_DT: skey = 22; break; - case DIRS_SZ: skey = 10; - } - } else { - switch (sortby) { - case DIRS_NM: skey = dlen + 14; break; - case DIRS_DT: skey = 12; break; - case DIRS_SZ: skey = 0; - } - } -#endif /* VMS */ - sh_sort(dirlist,NULL,ndirlist,skey,reverse,filecase); - for (i = 0; i < ndirlist; i++) { - fprintf(ofp,"%s\n",dirlist[i]); - if (page && (i < ndirlist -1 || heading)) { /* If /PAGE */ - if (cmd_cols > 0) { - int x = strlen(dirlist[i]); - int y; - y = (x % cmd_cols) ? 1 : 0; - n += ((int)strlen(dirlist[i]) / cmd_cols) + y; - } else { - n++; - } -#ifdef CK_TTGWSIZ - if (n > (cmd_rows - 3)) { /* Do more-prompting */ - if (!askmore()) { - rc = 0; - goto xdomydir; - } else - n = 0; - } -#endif /* CK_TTGWSIZ */ - } - } - } - - if (heading || summary) { -#ifdef CKFLOAT - CKFLOAT gm; -#endif /* CKFLOAT */ - fprintf(ofp,"\n%ld director%s, %ld file%s, %ld byte%s", - ndirs, - (ndirs == 1) ? "y" : "ies", - nfiles, - (nfiles == 1) ? "" : "s", - nbytes, - (nbytes == 1) ? "" : "s" - ); -#ifdef CKFLOAT - gm = ((CKFLOAT) nbytes ) / 1000000.0; - if (gm > 1000.0) - fprintf(ofp," (%0.2fGB)",(gm / 1000.0)); - else if (gm >= 0.01) - fprintf(ofp," (%0.2fMB)",gm); -#endif /* CKFLOAD */ - fprintf(ofp,"\n\n"); - } - xdomydir: - if (g_matchdot > -1) { - matchdot = g_matchdot; /* Restore these... */ - g_matchdot = -1; - } - freedirlist(); - if (ofp != stdout) { /* Close any output file */ - if (ofp) fclose(ofp); - ofp = stdout; - } - if (rc > 0) - success = 1; - return(rc); -} - -int -dodir(cx) int cx; { /* Do the DIRECTORY command */ - char *dc , *msg; - -#ifdef OS2 - return(domydir()); -#else /* OS2 */ - if (nopush -#ifdef DOMYDIR /* Builds that domydir() by default */ - || (cx == XXDIR || cx == XXLDIR) -#endif /* DOMYDIR */ - ) - return(domydir()); /* Built-in directory command */ - - /* Use the system's directory command. */ - - msg = (cx == XXLS) ? - "Arguments for ls" : - "Directory and/or file specification"; - if ((x = cmtxt(msg,"",&s,xxstring)) < 0) - return(x); - - ckstrncpy(tmpbuf,s,TMPBUFSIZ); /* Copy the filespec */ - s = tmpbuf; - - if ((y = cmcfm()) < 0) return(y); - - lp = line; - if (!(dc = getenv("CK_DIR"))) - dc = DIRCMD; - ckmakmsg(lp,LINBUFSIZ,dc," ",s,NULL); - debug(F110,"DIR",line,0); -#ifdef VMS - conres(); -#endif /* VMS */ - x = zshcmd(line); -#ifdef VMS - concb((char)escape); -#endif /* VMS */ - return(success = (x < 1) ? 0 : 1); -#endif /* OS2 */ -} - -#ifndef NOSERVER -#ifndef NOFRILLS -/* Do the ENABLE and DISABLE commands */ - -int -doenable(y,x) int y, x; { -#ifdef CK_LOGIN - if (isguest) /* IKSD: Don't let guests */ - return(0); /* enable anything that's disabled */ -#endif /* CK_LOGIN */ - switch (x) { - case EN_ALL: - en_cwd = en_cpy = en_del = en_dir = en_fin = en_get = y; - en_ren = en_sen = en_set = en_spa = en_typ = en_ret = y; - if (!inserver) - en_who = en_mai = en_pri = y; - en_mkd = en_rmd = y; - en_xit = y; -#ifndef datageneral - en_bye = y; -#endif /* datageneral */ -#ifndef NOPUSH - if (!nopush && !inserver) - en_hos = y; -#endif /* NOPUSH */ -#ifndef NOSPL - en_asg = en_que = y; -#endif /* NOSPL */ - break; - - case EN_BYE: -#ifndef datageneral -/* - In Data General AOS/VS Kermit can't log out its superior process. -*/ - en_bye = y; -#endif /* datageneral */ - break; - case EN_CPY: - en_cpy = y; - break; - case EN_CWD: - en_cwd = y; -#ifdef IKSD - if (inserver && y == 0) { - fnrpath = PATH_OFF; - fnspath = PATH_OFF; - } -#endif /* IKSD */ - break; - case EN_DEL: /* Deleting of files */ - en_del = y; - break; - case EN_DIR: - en_dir = y; - break; - case EN_FIN: - en_fin = y; - break; - case EN_GET: - en_get = y; - break; -#ifndef NOPUSH - case EN_HOS: - if (!nopush) - en_hos = y; - break; -#endif /* NOPUSH */ - case EN_REN: - en_ren = y; - break; - case EN_SEN: - en_sen = y; - break; - case EN_SET: - en_set = y; - break; - case EN_SPA: - en_spa = y; - break; - case EN_TYP: - en_typ = y; - break; - case EN_WHO: - en_who = y; - break; -#ifndef NOSPL - case EN_ASG: - en_asg = y; - break; - case EN_QUE: - en_que = y; - break; -#endif /* NOSPL */ - case EN_RET: - en_del = y; - break; - case EN_MAI: -#ifdef CK_LOGIN - if (isguest && y) { - printf("?Sorry, not valid for guests\n"); - return(-9); - } -#endif /* CK_LOGIN */ - en_mai = y; - break; - case EN_PRI: -#ifdef CK_LOGIN - if (isguest && y) { - printf("?Sorry, not valid for guests\n"); - return(-9); - } -#endif /* CK_LOGIN */ - en_pri = y; - break; - case EN_MKD: - en_mkd = y; - break; - case EN_RMD: - en_rmd = y; - break; - case EN_XIT: - en_xit = y; - break; - case EN_ENA: - if (((y & 1) && !(en_ena & 1)) || - ((y & 2) && !(en_ena & 2))) { - printf("?Sorry, DISABLE ENABLE can not be undone\n"); - return(-9); - } else { - en_ena = y; - break; - } - default: - return(-2); - } - return(1); -} -#endif /* NOFRILLS */ -#endif /* NOSERVER */ - -#ifndef NOFRILLS - -static int del_lis = 0; -static int del_dot = 0; -static int del_hdg = 0; -static int del_pag = -1; -static int del_ask = 0; - -#ifndef NOSHOW -VOID -showdelopts() { - int x = 0; - extern int optlines; - prtopt(&optlines,""); - prtopt(&optlines,"DELETE"); - if (del_ask > -1) { - prtopt(&optlines, del_ask ? "/ASK" : "/NOASK"); - x++; - } -#ifdef UNIXOROSK - if (del_dot > -1) { - prtopt(&optlines, del_dot ? "/DOTFILES" : "/NODOTFILES"); - x++; - } -#endif /* UNIXOROSK */ - if (del_lis > -1) { - prtopt(&optlines, del_lis ? "/LIST" : "/NOLIST"); - x++; - } - if (del_hdg > -1) { - prtopt(&optlines, del_hdg ? "/HEADING" : "/NOHEADING"); - x++; - } -#ifndef CK_TTGWSIZ - if (del_pag > -1) { - prtopt(&optlines, del_pag ? "/PAGE" : "/NOPAGE"); - x++; - } -#endif /* CK_TTGWSIZ */ - if (!x) prtopt(&optlines,"(no options set)"); - prtopt(&optlines,""); -} -#endif /* NOSHOW */ - - -int -setdelopts() { - int x_lis = -1, x_pag = -1, x_dot = -1, x_hdg = -1, x_ask = -1; - int getval = 0; - char c; - while (1) { - if ((y = cmswi(deltab,ndeltab,"Switch","",xxstring)) < 0) { - if (y == -3) - break; - else - return(y); - } - c = cmgbrk(); - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - switch (y) { - case DEL_DOT: - x_dot = 1; - break; - case DEL_NOD: - x_dot = 0; - break; - case DEL_HDG: - x_hdg = 1; - break; - case DEL_LIS: - x_lis = 1; - break; - case DEL_NOL: - x_lis = 0; - break; -#ifndef CK_TTGWSIZ - case DEL_PAG: - x_pag = 1; - break; - case DEL_NOP: - x_pag = 0; - break; -#endif /* CK_TTGWSIZ */ - case DEL_QUI: - x_lis = 0; - break; - case DEL_VRB: - x_lis = 1; - break; - case DEL_ASK: - x_ask = 1; - break; - case DEL_NAS: - x_ask = 0; - break; - default: - printf("?Sorry, this option can not be set\n"); - return(-9); - } - } - if ((x = cmcfm()) < 0) /* Get confirmation */ - return(x); - if (x_pag > -1) del_pag = x_pag; - if (x_dot > -1) del_dot = x_dot; - if (x_hdg > -1) del_hdg = x_hdg; - if (x_lis > -1) del_lis = x_lis; - if (x_ask > -1) del_ask = x_ask; - return(success = 1); -} - -#ifdef OS2 -static char ** xmtchs = NULL; -static int xmtchn = 0; -#endif /* OS2 */ - -int -dodel() { /* DELETE */ - int i, j, k, x; - int fs = 0; /* Need to call fileselect() */ - int len = 0; - int bad = 0; - int getval = 0, asking = 0; - int simulate = 0, rc = 0; - long minsize = -1L, maxsize = -1L; - int havename = 0, confirmed = 0; - int qflag = 0; - int summary = 0; - int deldirs = 0; - int deltree = 0; - int itsadir = 0; - int argisdir = 0; - int xmode = -1, scan = 0, skip = 0; -#ifdef COMMENT - int pass = 0; -#endif /* COMMENT */ - char c; - char * deldef = ""; - char safebuf[CKMAXPATH+1]; - struct FDB sw, fi, fl; - char - * del_aft = NULL, - * del_bef = NULL, - * del_naf = NULL, - * del_nbf = NULL, - * del_exc = NULL; - int - x_lis = 0, - /* x_dot = -1, */ - x_hdg = 0; - - char * dxlist[8]; - - for (i = 0; i < 8; i++) dxlist[i] = NULL; - - g_matchdot = matchdot; - - if (del_lis > -1) x_lis = del_lis; - if (del_dot > -1) matchdot = del_dot; - if (del_hdg > -1) x_hdg = del_hdg; - if (del_pag > -1) xaskmore = del_pag; - if (del_ask > -1) asking = del_ask; - - diractive = 1; - nolinks = 2; /* By default don't follow links */ - - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "File specification;\n or switch", - "", /* default */ - "", /* addtl string data */ - ndeltab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - deltab, /* Keyword table */ - &fi /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* Anything that doesn't match */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - again: - cmfdbi(&fi, /* 2nd FDB - file to delete */ - _CMIFI, /* fcode */ - "File(s) to delete", /* hlpmsg */ - deldef, /* default */ - "", /* addtl string data */ - nolinks | deldirs, /* 0 = files, 1 = files or dirs */ - 0, /* 1 = dirs only */ - xxstring, - NULL, - &fl - ); - while (!havename && !confirmed) { - x = cmfdb(&sw); /* Parse something */ - if (x < 0) { /* Error */ - if (x == -3) - break; - if (x == -2 || x == -9) - printf("?Does not match switch or filename: \"%s\"\n",atmbuf); - return(x); - } - if (cmresult.fcode != _CMKEY) /* Break out if not a switch */ - break; - c = cmgbrk(); /* Get break character */ - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - rc = -9; - goto xdelete; - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - rc = -9; - goto xdelete; - } - switch (k = cmresult.nresult) { - case DEL_AFT: - case DEL_BEF: - case DEL_NAF: - case DEL_NBF: - if (!getval) break; - if ((x = cmdate("File-time","",&s,0,xxstring)) < 0) { - if (x == -3) { - printf("?Date-time required\n"); - x = -9; - } else - rc = x; - goto xdelete; - } - fs++; - deltree = 0; - switch (k) { - case DEL_AFT: makestr(&del_aft,s); break; - case DEL_BEF: makestr(&del_bef,s); break; - case DEL_NAF: makestr(&del_naf,s); break; - case DEL_NBF: makestr(&del_nbf,s); break; - } - break; - case DEL_DOT: - matchdot = 1; - break; - case DEL_NOD: - matchdot = 0; - break; - case DEL_ALL: - fs = 0; -#ifdef VMS - deldef = "*.*"; /* UNIX, Windows, OS/2 */ -#else -#ifdef datageneral - deldef = "+"; /* AOS/VS */ -#else - deldef = "*"; /* UNIX, Windows, OS/2, VMS... */ -#endif /* datageneral */ -#endif /* VMS */ - deltree = 1; - nolinks = 2; - matchdot = 1; - recursive = 1; /* Fall through purposely... */ - case DEL_DIR: - deldirs = 1; - goto again; - case DEL_EXC: - if (!getval) break; - if ((x = cmfld("Pattern","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Pattern required\n"); - x = -9; - } else - rc = x; - goto xdelete; - } - fs++; - deltree = 0; - makestr(&del_exc,s); - break; - case DEL_HDG: - x_hdg = 1; - break; -#ifdef RECURSIVE - case DEL_REC: - recursive = 1; - break; -#endif /* RECURSIVE */ - case DEL_LIS: - x_lis = 1; - break; - case DEL_SUM: - summary = 1; - x_lis = 0; - x_hdg = 1; - break; - case DEL_NOL: - x_lis = 0; - break; -#ifndef CK_TTGWSIZ - case DEL_PAG: - xaskmore = 1; - break; - case DEL_NOP: - xaskmore = 0; - break; -#endif /* CK_TTGWSIZ */ - case DEL_QUI: - qflag = 1; - x_lis = 0; - break; - case DEL_VRB: - x_lis = 1; - break; - - case DEL_SMA: - case DEL_LAR: - if (!getval) break; - if ((x = cmnum("File size in bytes","0",10,&y,xxstring)) < 0) - return(x); - fs++; - deltree = 0; - switch (cmresult.nresult) { - case DEL_SMA: minsize = y; break; - case DEL_LAR: maxsize = y; break; - } - break; - - case DEL_SIM: - simulate = 1; - x_lis = 1; - break; - case DEL_ASK: - asking = 1; - break; - case DEL_NAS: - asking = 0; - break; - case DEL_TYP: { - extern struct keytab txtbin[]; - if (!getval) break; - if ((x = cmkey(txtbin,3,"","",xxstring)) < 0) - return(x); - if (x == 2) { /* ALL */ - xmode = -1; - } else { /* TEXT or BINARY only */ - xmode = x; - scan = 1; - } - break; - } - default: - printf("?Not implemented yet - \"%s\"\n",atmbuf); - return(-9); - } - } - if (qflag && (cmresult.fcode == _CMFLD)) { - if ((x = cmcfm()) < 0) - return(x); - else - return(success = 0); - } - if (cmresult.fcode != _CMIFI) { - if (*atmbuf) { - int x; - if (iswild(atmbuf) && nzxpand(atmbuf,nzxopts) == 0) - printf("?No files match: %s\n",atmbuf); - else if ((x = zchki(atmbuf)) == -1) - printf("?File not found: %s\n",atmbuf); - else if (x == -2) - printf("?Not a regular file: %s\n",atmbuf); - else - /* printf("?Not a deletable file: %s\n",atmbuf); */ - goto tryanyway; - } else { - printf("?A file specification is required\n"); - } - return(-9); - } - tryanyway: - ckstrncpy(tmpbuf,cmresult.sresult,TMPBUFSIZ); /* Safe copy of filespec */ - if (deldirs) { - ckstrncpy(safebuf,cmresult.sresult,CKMAXPATH); -#ifdef VMSORUNIX - len = zgetfs(tmpbuf); /* Is it a directory name? */ - argisdir = zgfs_dir; /* Then because of how zxpand() */ - if (argisdir && zgfs_link) /* works, we have to add it to */ - argisdir = 0; /* the list. */ - if (itsadir) - len = -2; -#else - len = zchki(tmpbuf); - if (len < 0) - argisdir = isdir(tmpbuf); -#endif /* VMSORUNIX */ - } - debug(F110,"DELETE file",tmpbuf,0); - if ((x = cmcfm()) < 0) - return(x); - -#ifdef IKSD -#ifdef CK_LOGIN - if (inserver && isguest) { - printf("?Sorry, DELETE unavailable to guests\n"); - return(-9); - } -#endif /* CK_LOGIN */ -#endif /* IKSD */ - -#ifndef OS2ORUNIX - if (simulate) { - printf("?Sorry, /SIMULATE not implemented on this platform\n"); - return(-9); - } -#endif /* OS2ORUNIX */ - -#ifdef COMMENT - /* (not needed) */ - if (!iswild(tmpbuf)) { - char *m; - errno = 0; - x = zchki(tmpbuf); - if (x < 0) { - switch (x) { - case -2: m = "Not a regular file"; break; - case -1: m = "File not found or not accessible"; break; - default: m = errno ? ck_errstr() : "Can't delete"; - } - printf("?%s: \"%s\"\n",m,tmpbuf); - return(-9); - } - } -#endif /* COMMENT */ - - makelist(del_exc,dxlist,8); - -/* tmpbuf[] has the name - now do any needed conversions on it */ - -#ifdef OS2 - { /* Lower level functions change / to \, not good for CMD.EXE. */ - char *p = tmpbuf; - while (*p) { /* Change them back to \ */ - if (*p == '/') *p = '\\'; - p++; - } - } -#endif /* OS2 */ - -#ifdef VMS - if (iswild(tmpbuf)) { -#ifdef COMMENT - /* Does not handle '.' as version separator */ - char *p = tmpbuf; - x = 0; - while (*p) { - if (*p == ';') { - x = 1; - break; - } else - p++; - } - if (!x) ckstrncat(tmpbuf,";*",TMPBUFSIZ); -#else - j = 0; x = 0; /* for end_dot and number of dots */ - i = strlen(tmpbuf); - if (tmpbuf[i] == ';') { - ckstrncat(tmpbuf,"0",TMPBUFSIZ); - } else { - if (tmpbuf[i--] == '.') - j++; - for (; i >= 0; i--) { - if (tmpbuf[i] == ';' || tmpbuf[i] == ':' || - tmpbuf[i] == ']' || tmpbuf[i] == '>') - break; - else if (tmpbuf[i] == '.') - x++; - } - if (tmpbuf[i] != ';') { /* dot may have been used */ - if (j) { /* last char is dot */ - if (x) /* second is version separator */ - ckstrncat(tmpbuf,"0",TMPBUFSIZ); - else /* 'foo.' */ - ckstrncat(tmpbuf,";0",TMPBUFSIZ); - } else if (x == 1) /* lacking a version separator */ - ckstrncat(tmpbuf,";0",TMPBUFSIZ); - else if (x == 0) /* x == 2 has a version */ - ckstrncat(tmpbuf,".*;0",TMPBUFSIZ); - } - } -#endif /* COMMENT */ - } -#endif /* VMS */ - - debug(F110,"dodel tmpbuf",tmpbuf,0); /* Filename */ - -#ifndef OS2ORUNIX /* No built-in DELETE code... */ - /* Construct system command. */ - ckmakmsg(line,LINBUFSIZ,DELCMD," ",tmpbuf,NULL); -#else -#ifdef VMS - if (asking) { /* Maybe overwrite in VMS */ - if (x_lis) /* if options are needed... */ - ckmakmsg(line,LINBUFSIZ,DELCMD," /confirm/log ",tmpbuf,NULL); - else - ckmakmsg(line,LINBUFSIZ,DELCMD," /confirm ",tmpbuf,NULL); - } else if (x_lis) - ckmakmsg(line,LINBUFSIZ,DELCMD," /log ",tmpbuf,NULL); - conres(); -#endif /* VMS */ - - debug(F110,"dodel line",line,0); -#endif /* OS2ORUNIX */ - -#ifdef MAC - success = (zdelet(tmpbuf) == 0); - -#else /* !MAC ... */ - -#ifdef OS2ORUNIX - { - int filespace = 0; - int count = 0; - int lines = 0; - int n = 0; - - s = tmpbuf; - -#ifdef CK_TTGWSIZ -#ifdef OS2 - ttgcwsz(); -#else /* OS2 */ - /* Check whether window size changed */ - if (ttgwsiz() > 0) { - if (tt_rows > 0 && tt_cols > 0) { - cmd_rows = tt_rows; - cmd_cols = tt_cols; - } - } -#endif /* OS2 */ -#endif /* CK_TTGWSIZ */ - - if (x_hdg > 0 && !summary) { - printf("Deleting %s...%s\n", s, simulate ? " (SIMULATION)" : ""); - n += 2; - } -#ifdef ZXREWIND - z = zxrewind(); /* Rewind file list */ -#else - if (!deldirs) - nzxopts = ZX_FILONLY; - if (recursive) nzxopts |= ZX_RECURSE; - if (matchdot) nzxopts |= ZX_MATCHDOT; - errno = 0; - z = nzxpand(s,nzxopts); /* Expand file list */ -#endif /* ZXREWIND */ - debug(F111,"dodel",s,z); - - /* If deleting directories, sort in reverse order */ - /* so we delete the files first, then the directory. */ - -#ifdef OS2 - /* In K95, we have no mtchs array, nor any control over */ - /* the order in which znext() returns filenames, so we */ - /* must copy the array and sort it. */ - { - int i; - if (xmtchs) { /* Free previous list in case */ - debug(F101,"dodel freeing previous list","",xmtchn); - for (i = 0; i < xmtchn; i++) /* it wasn't freed last time. */ - if (xmtchs[i]) - free(xmtchs[i]); - free(xmtchs); - } - xmtchn = 0; - xmtchs = (char **)malloc(z * (sizeof(char **))); /* Make new one */ - if (!xmtchs) { - printf("?Memory allocation failure\n"); - return(-9); - } - for (i = 0; i < z; i++) { - xmtchs[i] = NULL; - znext(tmpbuf); - if (!*tmpbuf) - break; - makestr(&(xmtchs[i]),tmpbuf); - if (!xmtchs[i]) { - printf("?Memory allocation failure\n"); - xmtchn = i - 1; - rc = -9; - goto xdelete; - } - /* debug(F111,"dodel add",xmtchs[i],i); */ - } - xmtchn = i; - debug(F101,"dodel xmtchn","",xmtchn); - sh_sort(xmtchs,NULL,z,0,deldirs,0); - } -#else -#ifdef UNIX - sh_sort(mtchs,NULL,z,0,deldirs,filecase); -#endif /* UNIX */ -#endif /* OS2 */ - - if (z > 0) { - int i; -#ifdef OS2 - int ix = 0; -#endif /* OS2 */ - success = 1; - if (x_hdg > 0) - printf("\n"); - - while ( -#ifdef OS2 - ix < xmtchn -#else - 1 -#endif /* OS2 */ - ) { /* Loop for all files */ -#ifdef OS2 - ckstrncpy(tmpbuf,xmtchs[ix++],TMPBUFSIZ); -#else - znext(tmpbuf); /* Get next file */ -#endif /* OS2 */ - if (!*tmpbuf) { /* No more */ - if (deldirs && recursive && argisdir) { - ckstrncpy(tmpbuf,safebuf,TMPBUFSIZ); - argisdir = 0; /* (only do this once) */ - } else - break; - } - skip = 0; - if (!deltree) { - if (fs) - if (fileselect(tmpbuf, - del_aft,del_bef,del_naf,del_nbf, - minsize,maxsize,0,8,dxlist) < 1) { - skip++; - } - } - if (!skip && scan && itsadir) { - skip++; - } - if (!skip && scan) { - switch (scanfile(tmpbuf,&y,nscanfile)) { - case FT_BIN: - if (xmode != 1) - skip++; - break; - case FT_TEXT: - case FT_7BIT: - case FT_8BIT: -#ifdef UNICODE - case FT_UTF8: - case FT_UCS2: -#endif /* UNICODE */ - if (xmode != 0) - skip++; - } - } - if (!skip && asking) { - int x; - ckmakmsg(line,LINBUFSIZ," Delete ",tmpbuf,"? ",NULL); - x = getyesno(line,3); - switch (x) { - case 0: continue; /* no */ - case 1: break; /* yes */ - case 2: goto xdelete; /* quit */ - case 3: asking = 0; break; /* go */ - } - } -#ifdef VMSORUNIX - len = zgetfs(tmpbuf); /* Get length and accessibility */ - itsadir = zgfs_dir; - if (itsadir && zgfs_link) { /* Treat links to directories */ - itsadir = 0; /* as regular files */ - if (scan) /* But not if /TYPE: was given */ - skip++; - } - if (itsadir) /* (emulate non-Unix code) */ - len = -2; -#else - len = zchki(tmpbuf); /* Get accessibility */ - if (len < 0) /* See if it's a directory */ - itsadir = isdir(tmpbuf); -#endif /* VMSORUNIX */ - - if (skip) { -#ifdef COMMENT /* Too verbose */ - if (x_lis > 0) { - lines++; - printf(" %s (SKIPPED)\n",tmpbuf); -#ifdef CK_TTGWSIZ - if (++n > cmd_rows - 3) - if (!askmore()) goto xdelete; else n = 0; -#endif /* CK_TTGWSIZ */ - } -#endif /* COMMENT */ - continue; - } - - debug(F111,"DELETE len",tmpbuf,len); - if (simulate) { - filespace += len; - count++; - if (x_lis > 0) { - lines++; - printf(" %s (SELECTED)\n",tmpbuf); - if (++n > cmd_rows - 3) { - int xx; - xx = askmore(); - if (!xx) goto xdelete; else n = 0; - } - } - } else if (len >= 0 || !itsadir) { /* Regular file */ - zdelet(tmpbuf); /* or symlink, etc... */ - if (zchki(tmpbuf) < 0) { - filespace += len; - count++; - if (x_lis > 0) { - lines++; - printf(" %s (OK)\n",tmpbuf); - if (++n > cmd_rows - 3) - if (!askmore()) goto xdelete; else n = 0; - } - } else { - bad++; - success = 0; - if (x_lis > 0) { - lines++; - printf(" %s (FAILED: %s)\n",tmpbuf,ck_errstr()); - if (++n > cmd_rows - 3) - if (!askmore()) goto xdelete; else n = 0; - } - } - } else if (/* pass > 0 && */ deldirs && itsadir) { - /* It's a directory */ - if (zrmdir(tmpbuf) > -1) { /* Only works if empty */ - count++; - if (x_lis > 0) { - lines++; - printf(" %s (OK)\n",tmpbuf); - if (++n > cmd_rows - 3) - if (!askmore()) goto xdelete; else n = 0; - } - } else { - success = 0; - if (x_lis > 0) { - lines++; - printf(" %s (FAILED: %s)\n", - tmpbuf, - ck_errstr()); - if (++n > cmd_rows - 3) - if (!askmore()) goto xdelete; else n = 0; - } - } - } else if (x_lis > 0) { - lines++; - if (isdir(tmpbuf)) - printf(" %s (FAILED: directory)\n",tmpbuf); - else - printf(" %s (FAILED: not a regular file)\n",tmpbuf); - if (++n > cmd_rows - 3) - if (!askmore()) goto xdelete; else n = 0; - } - } - if (x_hdg > 0) { - if (lines > 0) - printf("\n"); - if (++n > cmd_rows - 3) - if (!askmore()) goto xdelete; else n = 0; - printf("%d file%s %sdeleted, %d byte%s %sfreed%s\n", - count, - count != 1 ? "s" : "", - simulate ? "would be " : "", - filespace, - filespace != 1 ? "s" : "", - simulate ? "would be " : "", - simulate ? " (maybe)" : "" - ); - } - if (!x_lis && !success && !quiet) { - printf("?DELETE failed for %d file%s \ -(use DELETE /LIST to see details)\n", - bad, bad == 1 ? "" : "s" - ); - } - } else if (x_lis > 0) { - if (errno) - printf("?%s: %s\n",ck_errstr(), tmpbuf); - else - printf("?Can't delete: %s\n",tmpbuf); - } - } -#else /* OS2ORUNIX */ -#ifndef VMS /* Others - let the system do it. */ - xsystem(line); - x = nzxpand(tmpbuf,nzxopts); - success = (x > 0) ? 0 : 1; - if (x_hdg > 0) - printf("%s - %sdeleted\n", tmpbuf, success ? "" : "not "); -#else - if (asking) - printf("\n"); - x = xsystem(line); /* zshcmd returns 1 for success */ - success = (x > 0) ? 1 : 0; - if (x_hdg > 0 && !asking) - printf("%s - %sdeleted\n", tmpbuf, success ? "" : "not "); - concb((char)escape); -#endif /* VMS */ -#endif /* OS2ORUNIX */ -#endif /* MAC */ - xdelete: - if (g_matchdot > -1) { - matchdot = g_matchdot; /* Restore these... */ - g_matchdot = -1; - } -#ifdef OS2 - if (xmtchs) { - int i; - debug(F101,"dodel freeing list","",xmtchn); - for (i = 0; i < xmtchn; i++) - if (xmtchs[i]) free(xmtchs[i]); - free(xmtchs); - xmtchs = NULL; - xmtchn = 0; - } -#endif /* OS2 */ - debug(F101,"dodel result","",rc); - return((rc < 0) ? rc : success); -} -#endif /* NOFRILLS */ - -#ifndef NOSPL /* The ELSE command */ -_PROTOTYP( VOID pushqcmd, (char *) ); - -int -doelse() { - if (!ifcmd[cmdlvl]) { - printf("?ELSE doesn't follow IF\n"); - return(-2); - } -#ifdef COMMENT -/* - Wrong. This prevents IF..ELSE IF...ELSE IF...ELSE IF...ELSE... - from working. -*/ - ifcmd[cmdlvl] = 0; -#endif /* COMMENT */ - if (!iftest[cmdlvl]) { /* If IF was false do ELSE part */ - if (maclvl > -1 || tlevel > -1) { /* In macro or command file */ - debug(F100,"doelse pushing","",0); -#ifdef COMMENT - pushcmd(NULL); /* save rest of command. */ -#else - /* This fixes certain obscure problems */ - /* but breaks many other constructions that must work. */ - pushqcmd(NULL); -#endif /* COMMENT */ - } else { /* If interactive, */ - cmini(ckxech); /* just start a new command */ - printf("\n"); /* (like in MS-DOS Kermit) */ - if (pflag) prompt(xxstring); - } - } else { /* Condition is false */ - if ((y = cmtxt("command to be ignored","",&s,NULL)) < 0) - return(y); /* Gobble up rest of line */ - } - return(0); -} -#endif /* NOSPL */ - -#ifndef NOSPL -int -doswitch() { - char *lp, *ap; /* Macro argument pointer */ - int len = 0, x, y, pp = 0; - char brbuf[3]; - - /* Get variable name */ - - tmpbuf[0] = NUL; - brbuf[0] = '{'; - brbuf[1] = '}'; - brbuf[2] = NUL; - - y = cmfld("Variable name","",&s,xxstring); - debug(F111,"doswitch cmfld",s,y); - if (y < 0) { - if (y == -3) /* Because brstrip() writes */ - s = brbuf; /* into its argument. */ - else - return(y); - } - debug(F110,"doswitch A",s,0); - if (!strcmp(s,"(")) { - pp++; - if ((y = cmfld("Variable name","",&s,xxstring)) < 0) { - if (y == -3) - s = brbuf; - else - return(y); - debug(F110,"doswitch B",s,0); - } - } - len = ckstrncpy(tmpbuf,brstrip(s),TMPBUFSIZ); - if (tmpbuf[0] == CMDQ) { - if (chkvar(s) < 1) { - printf("?Variable name required\n"); - return(-9); - } - } - if (pp > 0) { /* If open paren given parse closing */ - if ((y = cmfld("Closing parenthesis","",&s,NULL)) < 0) - return(y); - if (strcmp(atmbuf,")")) { - printf("?Closing parenthesis required\n"); - return(-9); - } - } - lp = line; - x = ckstrncpy(lp,"_switx ",LINBUFSIZ); /* _switx + space */ - lp += x; - ap = lp; - debug(F010,"SWITCH a",line,0); - -#ifdef COMMENT - x = ckmakmsg(lp,LINBUFSIZ-x,tmpbuf," ",NULL,NULL); /* variable name + SP */ -#else - { /* variable name + SP */ - char * p = tmpbuf; - if (len > 0) { - if (tmpbuf[0] == '(' && tmpbuf[len-1] == ')') { - tmpbuf[len-1] = NUL; - p++; - } - } - x = ckmakmsg(lp,LINBUFSIZ-x,"{",brstrip(p),"}"," "); - } -#endif /* COMMENT */ - debug(F010,"SWITCH b",line,0); - lp += x; - - /* Get body */ - - if ((y = cmtxt("series of cases","",&s,NULL)) < 0) return(y); - if ((y = (int)strlen(s)) < 1) return(-2); - if (s[0] != '{' && s[y-1] != '}') { /* Supply braces if missing */ - ckmakmsg(tmpbuf,TMPBUFSIZ,"{ ",s," }",NULL); - s = tmpbuf; - } - if (litcmd(&s,&lp,(LINBUFSIZ - (lp - (char *)line) - 2)) < 0) { - printf("?Unbalanced braces\n"); - return(0); - } - debug(F010,"SWITCH c",line,0); - - x = mlook(mactab,"_switx",nmac); /* Look up SWITCH macro definition */ - if (x < 0) { /* Not there? */ - addmmac("_switx",sw_def); /* Put it back. */ - if ((x = mlook(mactab,"_switx",nmac)) < 0) { /* Look it up again. */ - printf("?SWITCH macro definition gone!\n"); /* Shouldn't happen. */ - return(success = 0); - } - } - debug(F010,"SWITCH command",line,0); /* Execute the SWITCH macro. */ - success = dodo(x,ap,cmdstk[cmdlvl].ccflgs | CF_IMAC); - debug(F101,"SWITCH status","",success); - return(success); -} - -int -dofor() { /* The FOR command. */ - int i, fx, fy, fz; /* loop variables */ - char *ap, *di; /* macro argument pointer */ - int pp = 0; /* Paren level */ - int mustquote = 0; - - for (i = 0; i < 2; i++) { - if ((y = cmfld("Variable name","",&s,NULL)) < 0) { - if (y == -3) { - printf("?Variable name required\n"); - return(-9); - } else - return(y); - } - if (strcmp(s,"(")) - break; - pp++; - } -#ifdef COMMENT - if ((y = parsevar(s,&x,&z)) < 0) /* Check variable. */ - return(y); -#else - if (*s == CMDQ) /* If loop variable starts with */ - mustquote++; /* backslash, mustquote is > 0. */ -#endif /* COMMENT */ - - lp = line; /* Build a copy of the command */ - ckstrncpy(lp,"_forx ",LINBUFSIZ); - lp += (int)strlen(line); /* "_for" macro. */ - ap = lp; /* Save pointer to macro args. */ - - if (*s == CMDQ) s++; /* Skip past backslash if any. */ - while ((*lp++ = *s++)) ; /* copy it */ - lp--; *lp++ = SP; /* add a space */ - - if ((y = cmnum("initial value","",10,&fx,xxstring)) < 0) { - if (y == -3) return(-2); - else return(y); - } - debug(F101,"dofor fx","",fx); - s = atmbuf; /* Copy the atom buffer */ - - if ((int)strlen(s) < 1) goto badfor; -/* - In edit 192, we change the loop variables to be evaluated at loop entry, - not each time through the loop. This was required in order to allow - \v(argc) to be used as a loop variable, or in a loop-variable expression. - Thus, we can't have FOR loops that modify their own exit conditions by - changing the final value or the increment. The problem with \v(argc) was - that it is on the macro stack; after entry into the _forx macro, it is at - the wrong place. -*/ - sprintf(tmpbuf,"%d",fx); /* (SAFE) Substitute actual value */ - s = tmpbuf; - while ((*lp++ = *s++)) ; /* (what they actually typed) */ - lp--; *lp++ = SP; -#ifdef DEBUG - *lp = NUL; - debug(F110,"FOR A",line,0); -#endif /* DEBUG */ - - if ((y = cmnum("final value","",10,&fy,xxstring)) < 0) { - if (y == -3) return(-2); - else return(y); - } - debug(F101,"dofor fy","",fy); - s = atmbuf; /* Same deal */ - if ((int)strlen(s) < 1) - goto badfor; - - sprintf(tmpbuf,"%d",fy); /* SAFE */ - s = tmpbuf; - while ((*lp++ = *s++)) ; - lp--; - *lp++ = SP; -#ifdef DEBUG - *lp = NUL; - debug(F110,"FOR B",line,0); -#endif /* DEBUG */ - - x_ifnum = 1; /* Increment or parenthesis */ - di = (fx < fy) ? "1" : "-1"; /* Default increment */ - if ((y = cmnum("increment",di,10,&fz,xxstring)) < 0) { - debug(F111,"dofor increment",atmbuf,y); - x_ifnum = 0; - if (y == -3) { /* Premature termination */ - return(-2); - } else if (y == -2) { /* Maybe closing paren */ - if (!strcmp(atmbuf,")")) { - pp--; /* Count it */ - s = di; /* supply default interval */ - fz = atoi(s); - } else /* Not closing paren, invalid */ - return(y); - } else /* Other error */ - return(y); - } else { /* Number */ - x_ifnum = 0; - debug(F101,"dofor fz","",fz); - s = atmbuf; /* Use it */ - } - if ((int)strlen(s) < 1) - goto badfor; - - sprintf(tmpbuf,"%d",fz); /* (SAFE) Same deal */ - s = tmpbuf; - while ((*lp++ = *s++)) ; - lp--; *lp++ = SP; - -#ifdef DEBUG - *lp = NUL; - debug(F110,"FOR C",line,0); -#endif /* DEBUG */ - - /* Insert the appropriate comparison operator */ - if (fz < 0) - *lp++ = '<'; - else - *lp++ = '>'; - *lp++ = SP; - -#ifdef DEBUG - *lp = NUL; - debug(F110,"FOR D",line,0); -#endif /* DEBUG */ - - if (pp > 0) { /* If open paren given parse closing */ - if ((y = cmfld("Closing parenthesis","",&s,NULL)) < 0) - return(y); - if (strcmp(atmbuf,")")) { - printf("?Closing parenthesis required\n"); - return(-9); - } - } - if ((y = cmtxt("Command to execute","",&s,NULL)) < 0) return(y); - if ((y = (int)strlen(s)) < 1) return(-2); - if (s[0] != '{' && s[y-1] != '}') { /* Supply braces if missing */ - ckmakmsg(tmpbuf,TMPBUFSIZ,"{ ",s," }",NULL); - s = tmpbuf; - } - if (litcmd(&s,&lp,(LINBUFSIZ - (lp - (char *)line) - 2)) < 0) { - printf("?Unbalanced braces\n"); - return(0); - } -#ifdef DEBUG - *lp = NUL; - debug(F110,"FOR E",line,0); -#endif /* DEBUG */ - -#ifdef COMMENT -/* Too strict */ - if (fz == 0) { - printf("?Zero increment not allowed\n"); - return(0); - } -#endif /* COMMENT */ -/* - In version 8.0 we decided to allow macro names anyplace a numeric-valed - variable could appear. But this caused trouble for the FOR loops because - the quoting in for_def[] assumed a \%i-style loop variable. We account - for this here in the if (mustquote)...else logic by invoking separate - FOR macro definitions in the two cases. -*/ - if (mustquote) { /* \%i-style loop variable */ - x = mlook(mactab,"_forx",nmac); /* Look up FOR macro definition */ - if (x < 0) { /* Not there? */ - addmmac("_forx",for_def); /* Put it back. */ - if ((x = mlook(mactab,"_forx",nmac)) < 0) { /* Look it up again. */ - printf("?FOR macro definition gone!\n"); - return(success = 0); - } - } - } else { /* Loop variable is a macro */ - x = mlook(mactab,"_forz",nmac); - if (x < 0) { - addmmac("_forz",foz_def); - if ((x = mlook(mactab,"_forz",nmac)) < 0) { - printf("?FOR macro definition gone!\n"); - return(success = 0); - } - } - } - debug(F010,"FOR command",line,0); /* Execute the FOR macro. */ - return(success = dodo(x,ap,cmdstk[cmdlvl].ccflgs | CF_IMAC)); - -badfor: - printf("?Incomplete FOR command\n"); - return(-2); -} -#endif /* NOSPL */ - -#ifndef NOFRILLS -/* Do the BUG command */ - -int -dobug() { - int n; - char * s = ""; - extern char * k_info_dir; - - if (k_info_dir) - s = k_info_dir; - -#ifdef COMMENT - printf("\n%s,%s\n Numeric: %ld",versio,ckxsys,vernum); -#endif /* COMMENT */ - printf( -"\nBefore requesting technical support from Columbia U., please consult:\n\n" - ); - n = 7; -#ifdef OS2 - printf(" . Your \"Kermit 95\" user manual (use the MANUAL command).\n"); - printf(" . The technical reference manual, \"Using C-Kermit\".\n"); - n += 2; -#else - printf(" . The book \"Using C-Kermit\" (type HELP for more info).\n"); - n += 1; -#endif /* OS2 */ - - printf(" . Your own organization's support staff, if any.\n"); - printf( -" . The comp.protocols.kermit.misc newsgroup.\n"); - printf( -" . The Kermit support website, http://www.columbia.edu/kermit/support.html \n" - ); - printf( - -" . The Kermit FAQ, http://www.columbia.edu/kermit/newfaq.html \n"); -#ifdef OS2 - printf( -" . The Kermit 95 FAQ, http://www.columbia.edu/kermit/k95faq.html \n"); - n++; -#endif /* OS2 */ - - printf( -" . The C-Kermit FAQ, http://www.columbia.edu/kermit/ckfaq.html \n"); - n += 4; - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - printf("\n\ -If you still need help or have a bug to report after consulting these sources," - ); - printf("\nsend e-mail to:\n\n"); - n += 2; - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - printf(" mailto:kermit-support@columbia.edu\n\n"); - n += 1; - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - printf("Or contact us by post:\n\n"); - printf( -" Kermit, Columbia University, 612 W 115 Street, New York NY 10025, USA\n\n" - ); - n += 1; - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - printf("Or by fax at +1 (212) 662-6442.\n\n"); - n += 1; - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; -#ifdef COMMENT - printf("Telephone support is available too:\n\n"); - n += 1; - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - printf( - " +1 (212) 854-5126, from anywhere, $25.00 USD per call, MC/Visa\n\n"); - n += 1; - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; -#endif /* COMMENT */ -#ifndef NOSHOW -#ifndef NOFRILLS - printf( -"Before reporting problems, please use the SHOW FEATURES command\n"); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - printf( -"to get detailed program version and configuration information.\n\n"); -#endif /* NOFRILLS */ -#endif /* NOSHOW */ - return(1); -} -#endif /* NOFRILLS */ - -#ifndef NOSPL - -/* T O D 2 S E C -- Convert time of day as hh:mm:ss to secs since midnite */ -/* - Call with a string hh:mm or hh:mm:ss. - Returns a 0 to 86400 on success, or a negative number on failure. -*/ -long -tod2sec(t) char * t; { - long t2; - long hh = 0L, mm = 0L, ss = 0L; - - if (!t) t = ""; - if (!*t) - return(-3L); - debug(F110,"tod2sec",t,0); - - if (isdigit(*t)) /* Get hours from argument */ - hh = *t++ - '0'; - else - return(-1L); - if (isdigit(*t)) - hh = hh * 10 + *t++ - '0'; -#ifdef COMMENT - if (hh > 24L) - return(-1L); -#endif /* COMMENT */ - if (*t == ':') - t++; - else if (!*t) - goto xtod2sec; - else - return(-1L); - - if (isdigit(*t)) /* Minutes */ - mm = *t++ - '0'; - else - return(-1L); - if (isdigit(*t)) - mm = mm * 10 + *t++ - '0'; - if (mm > 60L) - return(-1L); - if (*t == ':') - t++; - else if (!*t) - goto xtod2sec; - else - return(-1L); - - if (isdigit(*t)) /* Seconds */ - ss = *t++ - '0'; - else - return(-1L); - if (isdigit(*t)) - ss = ss * 10 + *t++ - '0'; - if (ss > 60L) - return(-1L); - - if (*t > 32) /* No trailing junk allowed */ - return(-1L); - - xtod2sec: - - t2 = hh * 3600L + mm * 60L + ss; /* Seconds since midnight from arg */ - debug(F101,"tod2sec t2","",t2); - - return(t2); -} - -int waitinterval = 1; - -#ifdef OLDWAIT -#undef OLDWAIT -#endif /* OLDWAIT */ - -int kbchar = NUL; - -int -dopaus(cx) int cx; { - long zz; - extern int sleepcan; - -#ifdef OLDWAIT - zz = -1L; - x_ifnum = 1; /* Turn off internal complaints */ - if (cx == XXWAI) - y = cmnum("seconds to wait, or time of day hh:mm:ss","1",10,&x,xxstring); - else if (cx == XXPAU) - y = cmnum("seconds to pause, or time of day hh:mm:ss", - "1",10,&x,xxstring); - else - y = cmnum("milliseconds to sleep, or time of day hh:mm:ss", - "100",10,&x,xxstring); - x_ifnum = 0; - if (y < 0) { - if (y == -2) { /* Invalid number or expression */ - char *p = tmpbuf; /* Retrieve string from atmbuf */ - int n = TMPBUFSIZ; - *p = NUL; - zzstring(atmbuf,&p,&n); /* Evaluate in case it's a variable */ - zz = tod2sec(tmpbuf); /* Convert to secs since midnight */ - if (zz < 0L) { - printf("?Number, expression, or time of day required\n"); - return(-9); - } else { - char now[32]; /* Current time */ - char *p; - long tnow; - p = now; - ztime(&p); - tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17); - if (zz < tnow) /* User's time before now */ - zz += 86400L; /* So make it tomorrow */ - zz -= tnow; /* Seconds from now. */ - } - } else - return(y); - } - if (x < 0) x = 0; - switch (cx) { - case XXPAU: /* PAUSE */ - case XXMSL: /* MSLEEP */ - if ((y = cmcfm()) < 0) return(y); - break; - case XXWAI: /* WAIT */ - z = 0; /* Modem signal mask */ - while (1) { /* Read zero or more signal names */ - y = cmkey(mstab,nms,"modem signal","",xxstring); - if (y == -3) break; /* -3 means they typed CR */ - if (y < 0) return(y); /* Other negatives are errors */ - z |= y; /* OR the bit into the signal mask */ - } - if ((y = cmcfm()) < 0) return(y); - break; - - default: /* Shouldn't happen */ - return(-2); - } - -/* Command is entered, now do it. */ - - if (zz > -1L) { /* Time of day given? */ - x = zz; - if (zz != (long) x) { - printf( -"Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.\n" - ); - return(-9); - } - } - if (cx == XXMSL) { /* Millisecond sleep */ - msleep(zz < 0 ? x : x * 1000); - return(success = 1); - } - if (cx == XXPAU && !sleepcan) { /* SLEEP CANCELLATION is OFF */ - sleep(x); - return(success = 1); - } - - /* WAIT, or else SLEEP with cancellation allowed... */ - - do { /* Sleep loop */ - int mdmsig; - if (sleepcan) { /* Keyboard cancellation allowed? */ - if (y = conchk()) { /* Did they type something? */ -#ifdef COMMENT - while (y--) coninc(0); /* Yes, gobble it all up */ -#else - /* There is a debate over whether PAUSE should absorb */ - /* its cancelling character(s). There are several */ - /* reasons why it should gobble at least one character: */ - /* (1) MS-DOS Kermit does it */ - /* (2) if not, subsequent PAUSE commands will terminate */ - /* immediately */ - /* (3) if not, subsequent ASK commands will use it as */ - /* valid input. If \13, then it will get no input */ - /* (4) if not, then the character appears on the command */ - /* line after all enclosing macros are complete. */ - kbchar = coninc(0); /* Gobble one up */ -#endif /* COMMENT */ - break; /* And quit PAUSing or WAITing */ - } - } - if (cx == XXWAI) { /* WAIT (z == modem signal mask) */ - debug(F101,"WAIT x","",x); - if (z > 0) { /* Looking for any modem signals? */ - mdmsig = ttgmdm(); /* Yes, get them */ - if (mdmsig < 0) /* Failed */ - return(success = 0); - if ((mdmsig & z) == z) /* Got what we wanted? */ - return(success = 1); /* Succeed */ - } - if (x == 0) /* WAIT 0 and didn't get our signals */ - break; - } - sleep(1); /* No interrupt, sleep one second */ - } while (--x > 0); - - if (cx == XXWAI) /* If WAIT and loop exhausted */ - success = (z == 0); /* Fail. */ - else /* */ - success = (x == 0); /* Set SUCCESS/FAILURE for PAUSE. */ - return(success); - -#else /* New code uses chained FDBs and allows FILE waits... */ - - char * m = ""; /* Help message */ - struct FDB nu, fl; /* Parse function descriptor blocks */ - int filewait = 0; - int mdmsig = 0, fs = 0; - char filedate[32]; - - kbchar = 0; - - switch (cx) { - case XXWAI: m = "seconds to wait, or time of day hh:mm:ss"; break; - case XXPAU: m = "seconds to pause, or time of day hh:mm:ss"; break; - case XXMSL: m = "milliseconds to sleep, or time of day hh:mm:ss"; break; - } - zz = -1L; - cmfdbi(&nu, - _CMNUM, /* Number */ - m, /* Help message */ - (cx == XXMSL) ? "100" : "1", /* Default */ - "", /* N/A */ - 0, /* N/A */ - 0, /* N/A */ - xxstring, /* Processing function */ - NULL, /* N/A */ - &fl /* Next */ - ); - cmfdbi(&fl, /* Time of day */ - _CMFLD, /* Field */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, /* processing func */ - NULL, /* N/A */ - NULL /* No next */ - ); - x = cmfdb(&nu); /* Parse a number or a field */ - if (x < 0) { - if (x == -3) - x = -2; - return(x); - } - switch (cmresult.fcode) { - case _CMNUM: /* Number */ - x = cmresult.nresult; - break; - case _CMFLD: /* Field */ - zz = tod2sec(cmresult.sresult); /* Convert to secs since midnight */ - if (zz < 0L) { - printf("?Number, expression, or time of day required\n"); - return(-9); - } else { - char now[32]; /* Current time */ - char *p; - long tnow; - p = now; - ztime(&p); - tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17); - if (zz < tnow) /* User's time before now */ - zz += 86400L; /* So make it tomorrow */ - zz -= tnow; /* Seconds from now. */ - } - } - debug(F101,"PAUSE/WAIT/MSLEEP zz","",zz); - switch (cx) { - case XXPAU: /* PAUSE */ - case XXMSL: /* MSLEEP */ - if ((y = cmcfm()) < 0) return(y); - break; - case XXWAI: /* WAIT */ - z = 0; /* Modem signal mask */ - y = cmkey(waittab,nwaittab,"","",xxstring); - if (y < 0) { - if (y == -3) { - if ((y = cmcfm()) < 0) - return(y); - break; - } else - return(y); - } - if (y == WAIT_FIL) { /* FILE */ - int wild = 0; - if ((z = cmkey(wfswi,nwfswi,"event","",xxstring)) < 0) - return(z); - filewait = z; - if (filewait == WF_MOD || filewait == WF_DEL) - z = cmifi("Filename","",&s,&wild,xxstring); - else - z = cmfld("Filename","",&s,xxstring); - if (z < 0) - return(z); - if (wild || ((filewait == WF_CRE) && iswild(s))) { - printf("?Wildcards not valid here\n"); - return(-9); - } - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - if ((z = cmcfm()) < 0) - return(z); - break; - } else if (y != WAIT_MDM) { /* A modem signal */ - z |= y; /* OR the bit into the signal mask */ - } - if (!filewait) { /* Modem signals... */ - while (1) { /* Get zero or more signal names */ - y = cmkey(mstab,nms,"modem signal","",xxstring); - if (y == -3) break; /* -3 means they typed CR */ - if (y < 0) return(y); /* Other negatives are errors */ - z |= y; /* OR the bit into the signal mask */ - } - if ((y = cmcfm()) < 0) return(y); - break; - } - - default: /* Shouldn't happen */ - return(-2); - } /* switch (cx) */ - -/* Command is entered, now do it. */ - - if (zz > -1L) { /* Time of day given? */ - x = zz; - if (zz != (long) x) { - printf( -"Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.\n" - ); - return(-9); - } - } - if (sleepcan) - concb((char)escape); /* Ensure single-char wakeup */ - - if (cx == XXMSL) { /* Millisecond sleep */ - msleep(zz < 0 ? x : x * 1000); - return(success = 1); - } - if (cx == XXPAU && !sleepcan) { /* SLEEP CANCELLATION is OFF */ - sleep(x); - return(success = 1); - } - if (filewait) { /* FILE... */ - fs = zchki(tmpbuf); /* Check if file exists */ - switch (filewait) { - case WF_DEL: - if (fs == -1) - return(success = 1); - break; - case WF_MOD: - if (fs == -1) { - printf("?File does not exit: %s\n",tmpbuf); - return(-9); - } - s = zfcdat(tmpbuf); /* Get current modification date */ - if (!s) s = ""; - if (ckstrncpy(filedate,s,32) != 17) { - printf("?Can't get modification time: %s\n",tmpbuf); - return(-9); - } - break; - case WF_CRE: - if (fs > -1) - return(success = 1); - break; - } - } - do { /* Polling loop */ - if (sleepcan) { /* Keyboard cancellation allowed? */ - if ((y = conchk()) > 0) { /* Did they type something? */ - kbchar = coninc(0); /* Yes, get first char they typed */ - debug(F000,"WAIT kbchar","",kbchar); -#ifdef COMMENT - while (--y > 0) /* Gobble the rest up */ - coninc(0); -#endif /* COMMENT */ - return(success = 0); /* And quit PAUSing or WAITing */ - } - } - if (filewait == 0) { - if (cx == XXWAI) { /* WAIT for modem signals */ - if (z != 0) { - mdmsig = ttgmdm(); /* Get them. */ - debug(F101,"WAIT ttgmdm","",mdmsig); - if (mdmsig < 0) /* Failure to get them? */ - return(success = 0); /* Fail. */ - if ((mdmsig & z) == z) /* Got desired ones? */ - return(success = 1); /* Succeed. */ - } else if (x == 0) - return(success = 0); - } - } else { /* FILE... */ - fs = zchki(tmpbuf); /* Get file status */ - if (filewait == WF_MOD) { /* Wait for modification */ - if (fs == -1) /* Failure to get status */ - return(success = 0); /* so WAIT fails. */ - s = zfcdat(tmpbuf); /* Get current modification time */ - if (!s) s = ""; /* And compare with the time */ - if (strcmp(s,filedate)) /* when the WAIT started */ - return(success = 1); - } else if (filewait == WF_DEL) { /* Wait for deletion */ - if (fs == -1) /* If file doesn't exist, */ - return(success = 1); /* succeed. */ - } else if (filewait == WF_CRE) { /* Wait for creation */ - if (fs != -1) /* If file exists */ - return(success = 1); /* succeed. */ - } - } - if (x < 1) /* SLEEP/WAIT/PAUSE 0 */ - break; - sleep(waitinterval); /* No interrupt, sleep */ - x -= waitinterval; /* Deduct sleep time */ - } while (x > 0); - - if (cx == XXWAI) /* WAIT time expired */ - success = (z == 0); /* Succeed if no modem signals */ - else /* For SLEEP or PAUSE, success */ - success = (x == 0); /* depends on whether it was */ - return(success); /* interrupted from the keyboard. */ -#endif /* OLDWAIT */ -} -#endif /* NOSPL */ - -#ifdef OS2ORUNIX -_PROTOTYP(int zcmpfn,(char *, char *)); -#endif /* OS2ORUNIX */ - -#ifndef NOFRILLS -#ifdef NT -int -dolink() { - /* Parse a file or a directory name */ - int i, x, z, listing = 0, havename = 0, wild = 0, rc = 1; - struct FDB sw, fi; - - cmfdbi(&sw, /* 2nd FDB - optional /PAGE switch */ - _CMKEY, /* fcode */ - "Filename or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nqvswtab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - qvswtab, /* Keyword table */ - &fi /* Pointer to next FDB */ - ); - - cmfdbi(&fi, /* 1st FDB - file to type */ - _CMIFI, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 3, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - - while (!havename) { - x = cmfdb(&sw); /* Parse something */ - if (x < 0) /* Error */ - return(x); - switch (cmresult.fcode) { - case _CMKEY: - switch (cmresult.nresult) { - case DEL_LIS: - case DEL_VRB: - listing = 1; - break; - case DEL_NOL: - case DEL_QUI: - listing = 0; - break; - } - break; - case _CMIFI: - s = cmresult.sresult; - havename = 1; - break; - default: - return(-2); - } - } - wild = cmresult.nresult; /* Source specification wild? */ - - ckstrncpy(line,s,LINBUFSIZ); /* Make a safe copy of source name */ - s = line; - - if (!wild) - wild = iswild(line); - - p = tmpbuf; /* Place for new name */ - if ((x = cmofi(wild ? "Target directory" : "New name", - "",&s,xxstring)) < 0) { /* Get new name */ - if (x == -3) { - printf("?%s required\n", wild ? "Target directory" : "New name"); - return(-9); - } else return(x); - } - ckstrncpy(p,s,TMPBUFSIZ); /* Make a safe copy of the new name */ - if ((y = cmcfm()) < 0) return(y); - - if (!wild) { /* Just one */ - if (listing) printf("%s => %s ",line,p); - if (zlink(line,p) < 0) { - if (listing) printf("(FAILED: %s\n",ck_errstr()); - rc = 0; - } else { - if (listing) printf("(OK)\n"); - } - return(success = rc); - } - if (!isdir(p)) { /* Multiple */ - printf( /* if target is not a directory */ -"?Multiple source files not allowed if target is not a directory.\n"); - return(-9); - } -#ifdef COMMENT - else { /* Show full path of target */ - char buf[CKMAXPATH]; /* (too much) */ - if (zfnqfp(p,CKMAXPATH,buf)) - ckstrncpy(tmpbuf,buf,TMPBUFSIZ); - } -#endif /* COMMENT */ - -#ifdef VMS - conres(); /* Let Ctrl-C work. */ -#endif /* VMS */ - debug(F110,"dolink line",line,0); - -#ifdef ZXREWIND - z = zxrewind(); /* Rewind file list */ -#else - z = nzxpand(s,0); /* Expand file list */ -#endif /* ZXREWIND */ - debug(F111,"dolink p",p,z); - -#ifdef UNIX - if (wild && z > 1) - sh_sort(mtchs,NULL,z,0,0,filecase); /* Alphabetize the filename list */ -#endif /* UNIX */ - - while (z-- > 0) { - if (!(z == 0 && !wild)) - znext(line); - if (!line[0]) - break; - if (listing) printf("%s => %s ",line,p); - if (zlink(line,p) < 0) { - if (listing) printf("(FAILED: %s\n",ck_errstr()); - rc = 0; - } else { - if (listing) printf("(OK)\n"); - } - } -#ifdef VMS - concb((char)escape); -#endif /* VMS */ - return(success = rc); -} -#endif /* NT */ - -#ifdef ZCOPY -int -docopy() { - int i, x, listing = 0, nolist = 0, havename = 0; - struct FDB sw, fi; - int targetisdir = 0; - int targetlen = 0; - int swapping = 0; - int appending = 0; - int fromb64 = 0; - int tob64 = 0; - int wild = 0; - int rc = 1; - - cmfdbi(&sw, /* 2nd FDB - optional /PAGE switch */ - _CMKEY, /* fcode */ - "Filename or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - ncopytab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - copytab, /* Keyword table */ - &fi /* Pointer to next FDB */ - ); - cmfdbi(&fi, /* 1st FDB - file to type */ - _CMIFI, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - - while (!havename) { - x = cmfdb(&sw); /* Parse something */ - if (x < 0) /* Error */ - return(x); - switch (cmresult.fcode) { - case _CMKEY: - switch (cmresult.nresult) { - case DEL_LIS: - case DEL_VRB: - nolist = 0; - listing = 1; - break; - case DEL_NOL: - case DEL_QUI: - nolist = 1; - listing = 0; - break; - case 999: - swapping = 1; - break; - case 998: - appending = 1; - break; -#ifndef NOSPL - case 997: - fromb64 = 1; - break; - case 996: - tob64 = 1; - break; -#endif /* NOSPL */ - } - break; - case _CMIFI: - s = cmresult.sresult; - havename = 1; - break; - default: - return(-2); - } - } - wild = cmresult.nresult; - ckstrncpy(line,s,LINBUFSIZ); /* Make a safe copy of source name */ - s = line; - p = tmpbuf; /* Place for new name */ - - /* Get destination name */ - if ((x = cmofi("destination name and/or directory", -#ifdef UNIX - "." -#else - "" -#endif /* UNIX */ - ,&s,xxstring)) < 0) { - if (x == -3) { - printf("?Name for destination file required\n"); - return(-9); - } else return(x); - } - ckstrncpy(p,s,TMPBUFSIZ); /* Safe copy of destination name */ - if ((y = cmcfm()) < 0) return(y); - if (appending && swapping) { - printf("?Sorry, /APPEND and /SWAP conflict\n"); - return(-9); - } -#ifdef COMMENT -/* - This unreasonably prevented "COPY /APPEND *.* bifile" from concatenating - a bunch of files into one big file. -*/ - if (appending && wild) { - printf("?Sorry, /APPEND can be used only with single files\n"); - return(-9); - } -#endif /* COMMENT */ - targetisdir = isdir(p); - x = strlen(p); - if (targetisdir) { -#ifdef UNIXOROSK - if (p[x-1] != '/') { - ckstrncat(p,"/",TMPBUFSIZ); - x++; - } -#else -#ifdef OS2 - if (p[x-1] != '/') { - ckstrncat(p,"/",TMPBUFSIZ); - x++; - } -#else -#ifdef STRATUS - if (p[x-1] != '>') { - ckstrncat(p,">",TMPBUFSIZ); - x++; - } -#else -#ifdef datageneral - if (p[x-1] != ':') { - ckstrncat(p,":",TMPBUFSIZ); - x++; - } -#else - if (p[x-1] != '/') { - ckstrncat(p,"/",TMPBUFSIZ); - x++; - } -#endif /* datageneral */ -#endif /* STRATUS */ -#endif /* OS2 */ -#endif /* UNIXOROSK */ - } - targetlen = x; - - if (!appending) { /* If /APPEND not given */ - if (wild && !targetisdir) { /* No wildcards allowed */ - printf( /* if target is not a directory */ -"?Multiple source files not allowed if target is not a directory.\n"); - return(-9); - } - } - -#ifdef VMS - conres(); /* Let Ctrl-C work. */ -#endif /* VMS */ - debug(F110,"docopy line",line,0); - debug(F110,"docopy p",p,0); - -#ifdef ZXREWIND - z = zxrewind(); /* Rewind file list */ -#else - z = nzxpand(s,0); /* Expand file list */ -#endif /* ZXREWIND */ - -#ifdef UNIX - if (wild) - sh_sort(mtchs,NULL,z,0,0,filecase); /* Alphabetize the filename list */ -#endif /* UNIX */ - -#ifdef IKSD - if (!targetisdir && zchki(p) > -1) { /* Destination file exists? */ - if (inserver && (!ENABLED(en_del) -#ifdef CK_LOGIN - || isguest -#endif /* CK_LOGIN */ - )) { - printf("?Sorry, overwriting existing files is disabled\n"); - return(-9); - } - } -#endif /* IKSD */ - - if (tob64 && fromb64) { /* To and from B64 = no conversion */ - tob64 = 0; - fromb64 = 0; - } - debug(F110,"COPY dest",p,0); - - while (z > 0) { - - znext(line); - if (!line[0]) - break; - - errno = 0; /* Reset errno */ - - if (listing) printf("%s => %s ",line,p); - - /* Straight copy */ - if (!swapping && !appending && !fromb64 && !tob64) { - debug(F110,"COPY zcopy",line,0); - - if ((x = zcopy(line,p)) < 0) { /* Let zcopy() do it. */ - switch (x) { - case -2: - if (listing) - printf("(FAILED: Not a regular file)\n"); - else if (!nolist) - printf("?Not a regular file - %s\n",line); - rc = 0; - break; - case -3: - if (listing) - printf("(FAILED: Not found or not accessible)\n"); - else if (!nolist) - printf("?Not found or not accessible - %s\n",line); - rc = 0; - break; - case -4: - if (listing) - printf("(FAILED: Permission denied)\n"); - else if (!nolist) - printf("?Permission denied - %s\n",line); - rc = 0; - break; - case -5: - if (listing) - printf("(Source and destination are the same file)\n"); - else if (!nolist) - printf( - "?Source and destination are the same file - %s\n", - line - ); - break; - case -6: - if (listing) - printf("(FAILED: Input/Output error)\n"); - else if (!nolist) - printf("?Input/Output error - %s\n",line); - rc = 0; - break; - case -7: - if (listing) - printf("(FAILED: %s - %s)\n",p,ck_errstr()); - else if (!nolist) - printf("?%s - %s\n",ck_errstr(),p); - rc = 0; - break; - default: - if (listing) - printf("(FAILED: %s)\n",ck_errstr()); - else if (!nolist) - printf("?%s\n",ck_errstr()); - rc = 0; - } - } else { - if (listing) printf("(OK)\n"); - } - - } else { /* Special options */ - - int prev, y, x = 0; /* Variables needed for them */ - int i, t; - char ibuf[100]; - char obuf[200]; - FILE * in = NULL; - FILE * out = NULL; - - if ((in = fopen(line,"r")) == NULL) { /* Open input file */ - if (listing) - printf("(FAILED: %s)\n",ck_errstr()); - else if (!nolist) - printf("?%s - %s)\n",ck_errstr(),line); - rc = 0; - continue; - } - if (targetisdir) { /* Target is directory */ - char * buf = NULL; /* so append this filename to it */ - zstrip(line,&buf); - p[targetlen] = NUL; - if (buf) - ckstrncat(p,buf,TMPBUFSIZ); - } -#ifdef OS2ORUNIX - if (zcmpfn(line,p)) { /* Input and output are same file? */ - if (listing) - printf("(FAILED: Source and destination identical)\n"); - else if (!nolist) - printf("?Source and destination identical - %s\n", line); - rc = 0; - continue; - } -#endif /* OS2ORUNIX */ - if ((out = fopen(p, (appending ? "a" : "w"))) == NULL) { - fclose(in); - if (listing) - printf("(FAILED: %s - %s)\n",p,ck_errstr()); - else if (!nolist) - printf("?%s - %s\n",p,ck_errstr()); - rc = 0; - continue; - } -#ifndef NOSPL - if (tob64) { /* Converting to Base-64 */ - - debug(F110,"COPY tob64",line,0); - - while (1) { /* Loop... */ - prev = x; - if ((x = fread(ibuf,1,54,in)) < 1) { /* EOF */ - if (listing) - printf("(OK)\n"); - break; - } - if (prev % 3) { - if (listing) - printf("(FAILED: Phase error at %d)\n",prev); - else if (!nolist) - printf("?Phase error at %d\n",prev); - rc = 0; - break; - } - if (swapping) { - if (x & 1) { - if (listing) - printf("(FAILED: Swap error)\n"); - else if (!nolist) - printf("?Swap error\n"); - rc = 0; - break; - } - for (i = 0; i < x; i+=2) { - t = ibuf[i]; - ibuf[i] = ibuf[i+1]; - ibuf[i+1] = t; - } - } - if ((y = b8tob64(ibuf,x,obuf,180)) < 0) { - if (listing) - printf("(FAILED: Encoding error)\n"); - else if (!nolist) - printf("?Encoding error\n"); - rc = 0; - break; - } - fprintf(out,"%s\n",obuf); - } - - } else if (fromb64) { /* Converting from Base 64 */ - - debug(F110,"COPY fromb64",line,0); - - if ((out = fopen(p,appending ? "a" : "w")) == NULL) { - fclose(in); - if (listing) - printf("(FAILED: %s - %s)\n",p,ck_errstr()); - else if (!nolist) - printf("?%s - %s\n",p,ck_errstr()); - rc = 0; - continue; - } - x = 1; - while (x) { - x = fread(ibuf,1,80,in); - if ((y = b64tob8(ibuf,x,obuf,80)) < 0) { - if (listing) - printf("(FAILED: Decoding error)\n"); - else if (!nolist) - printf("?Decoding error\n"); - rc = 0; - break; - } - if (swapping) { - if (x & 1) { - if (listing) - printf("(FAILED: Swap error)\n"); - else if (!nolist) - printf("?Swap error\n"); - rc = 0; - break; - } - for (i = 0; i < y; i+=2) { - t = obuf[i]; - obuf[i] = obuf[i+1]; - obuf[i+1] = t; - } - } - if (y > 0) { - if (fwrite(obuf,1,y,out) < 1) { - if (listing) - printf("(FAILED: %s - %s)\n",p,ck_errstr()); - else if (!nolist) - printf("?%s - %s\n",p,ck_errstr()); - rc = 0; - break; - } - } - } - - } else -#endif /* NOSPL */ - - if (swapping) { /* Swapping bytes */ - - CHAR c[3]; - c[2] = NUL; - - debug(F110,"COPY swapping",line,0); - - while (1) { - x = fread((char *)c,1,2,in); - if (x < 1) { - if (listing) - printf("(OK)\n"); - break; - } else if (x == 1) { - c[1] = c[0]; - c[0] = NUL; - printf( - "(WARNING: Odd byte count)"); - if (!listing) printf("\n"); - } - if (fprintf(out,"%c%c",c[1],c[0]) == EOF) { - if (listing) - printf("(FAILED: %s - %s)\n",p,ck_errstr()); - else if (!nolist) - printf("?%s - %s\n",p,ck_errstr()); - rc = 0; - break; - } - } - - } else if (appending) { /* Appending to target file */ - - char c; - - debug(F110,"COPY appending",line,0); - - while (1) { - x = fread(&c,1,1,in); - if (x < 1) { - if (listing) - printf("(OK)\n"); - break; - } - if (fwrite(&c,1,1,out) < 1) { - if (listing) - printf("(FAILED: %s - %s)\n",p,ck_errstr()); - else if (!nolist) - printf("?%s - %s\n",p,ck_errstr()); - rc = 0; - break; - } - } - } - if (out) fclose(out); - if (in) fclose(in); - } -#ifdef VMSORUNIX - concb((char)escape); -#endif /* VMSORUNIX */ - } - if (rc > -1) success = rc; - return(rc); -} -#endif /* ZCOPY */ -#endif /* NOFRILLS */ - -#ifndef NORENAME -#ifndef NOFRILLS -#ifdef ZRENAME -int -dorenam() { - /* Parse a file or a directory name */ - int i, x, z, listing = 0, havename = 0, wild = 0, rc = 1; - int nolist = 0; - struct FDB sw, fi; - - cmfdbi(&sw, /* 2nd FDB - optional /PAGE switch */ - _CMKEY, /* fcode */ - "Filename or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nqvswtab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - qvswtab, /* Keyword table */ - &fi /* Pointer to next FDB */ - ); - - cmfdbi(&fi, /* 1st FDB - file to type */ - _CMIFI, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 3, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - - while (!havename) { - x = cmfdb(&sw); /* Parse something */ - if (x < 0) /* Error */ - return(x); - switch (cmresult.fcode) { - case _CMKEY: - switch (cmresult.nresult) { - case DEL_LIS: - case DEL_VRB: - listing = 1; - break; - case DEL_NOL: - case DEL_QUI: - nolist = 1; - listing = 0; - break; - } - break; - case _CMIFI: - s = cmresult.sresult; - havename = 1; - break; - default: - return(-2); - } - } - wild = cmresult.nresult; /* Source specification wild? */ - - ckstrncpy(line,s,LINBUFSIZ); /* Make a safe copy of source name */ - s = line; - - if (!wild) - wild = iswild(line); - - p = tmpbuf; /* Place for new name */ - if ((x = cmofi(wild ? "Target directory" : "New name", - "",&s,xxstring)) < 0) { /* Get new name */ - if (x == -3) { - printf("?%s required\n", wild ? "Target directory" : "New name"); - return(-9); - } else return(x); - } - ckstrncpy(p,s,TMPBUFSIZ); /* Make a safe copy of the new name */ - if ((y = cmcfm()) < 0) return(y); - - if (!wild) { /* Just one */ - if (listing) printf("%s => %s ",line,p); - if (zrename(line,p) < 0) { - if (listing) - printf("(FAILED: %s)\n",ck_errstr()); - else if (!nolist) - printf("?%s\n",ck_errstr()); - rc = 0; - } else { - if (listing) printf("(OK)\n"); - } - return(success = rc); - } - if (!isdir(p)) { /* Multiple */ - printf( /* if target is not a directory */ -"?Multiple source files not allowed if target is not a directory.\n"); - return(-9); - } -#ifdef COMMENT - else { /* Show full path of target */ - char buf[CKMAXPATH]; /* (too much) */ - if (zfnqfp(p,CKMAXPATH,buf)) - ckstrncpy(tmpbuf,buf,TMPBUFSIZ); - } -#endif /* COMMENT */ - -#ifdef VMS - conres(); /* Let Ctrl-C work. */ -#endif /* VMS */ - debug(F110,"dorename line",line,0); - -#ifdef ZXREWIND - z = zxrewind(); /* Rewind file list */ -#else - z = nzxpand(s,0); /* Expand file list */ -#endif /* ZXREWIND */ - debug(F111,"dorename p",p,z); - -#ifdef UNIX - if (wild && z > 1) - sh_sort(mtchs,NULL,z,0,0,filecase); /* Alphabetize the filename list */ -#endif /* UNIX */ - -/* - Note: COPY, RENAME, DELETE and similar commands should have options to - stop or proceed when they are operating on multiple files and the operation - fails. -*/ - while (z-- > 0) { - if (!(z == 0 && !wild)) - znext(line); - if (!line[0]) - break; - if (listing) printf("%s => %s ",line,p); - if (zrename(line,p) < 0) { - if (listing) - printf("(FAILED: %s)\n",ck_errstr()); - else if (!nolist) - printf("?%s - %s\n",ck_errstr(),line); - rc = 0; - } else { - if (listing) printf("(OK)\n"); - } - } -#ifdef VMS - concb((char)escape); -#endif /* VMS */ - return(success = rc); -} -#endif /* ZRENAME */ -#endif /* NOFRILLS */ -#endif /* NORENAME */ - -#ifndef NOSPL - -/* Do the RETURN command */ - -int -doreturn(s) char *s; { - int x; - extern int tra_asg; - char * line, * lp; - - if (cmdlvl < 1) { - printf("\n?Can't return from level %d\n",maclvl); - return(success = 0); - } - line = malloc(LINBUFSIZ); - if (line == NULL) - return(success = 0); - lp = line; /* Expand return value now */ - x = LINBUFSIZ-1; - if (!s) s = ""; - debug(F110,"RETURN s",s,0); - if (zzstring(s,&lp,&x) > -1) { - s = line; - debug(F110,"RETURN zzstring",s,0); - } - - /* Pop from all FOR/WHILE/SWITCH/XIFs */ - while ((maclvl > 0) && - (m_arg[maclvl-1][0]) && - (cmdstk[cmdlvl].src == CMD_MD) && - (!strncmp(m_arg[maclvl-1][0],"_xif",4) || - !strncmp(m_arg[maclvl-1][0],"_for",4) || - !strncmp(m_arg[maclvl-1][0],"_swi",4) || - !strncmp(m_arg[maclvl-1][0],"_whi",4))) { - debug(F111,"RETURN IF/FOR/WHI/SWI pop",m_arg[maclvl-1][0],maclvl); - dogta(XXPTA); /* Put args back */ - popclvl(); /* Pop up two levels */ - popclvl(); - } - if (tra_asg) { /* If tracing show return value */ - if (*s) - printf("<<< %s: \"%s\"\n", m_arg[maclvl][0], s); - else - printf("<<< %s: (null)\n", m_arg[maclvl][0]); - } - popclvl(); /* Pop from enclosing TAKE or macro */ - debug(F111,"RETURN tolevel",s,maclvl); - if (!s) s = ""; - if (!*s) s = NULL; - makestr(&(mrval[maclvl+1]),s); /* Set the RETURN value */ - free(line); - return(success = 1); /* Macro succeeds if we RETURN */ -} -#endif /* NOSPL */ - -#ifndef NOSPL -/* Do the OPEN command */ - -int -doopen() { /* OPEN { append, read, write } */ - int x, y, z = 0; char *s; - static struct filinfo fcb; /* (must be static) */ - if ((x = cmkey(opntab,nopn,"mode","",xxstring)) < 0) { - if (x == -3) { - printf("?Mode required\n"); - return(-9); - } else return(x); - } - switch (x) { - case OPN_FI_R: /* Old file (READ) */ - if (chkfn(ZRFILE) > 0) { - printf("?Read file already open\n"); - return(-2); - } - if ((z = cmifi("File to read","",&s,&y,xxstring)) < 0) { - if (z == -3) { - printf("?Input filename required\n"); - return(-9); - } else return(z); - } - if (y) { /* No wildcards allowed */ - printf("\n?Please specify a single file\n"); - return(-2); - } - ckstrncpy(line,s,LINBUFSIZ); - if ((int)strlen(line) < 1) return(-2); - if ((z = cmnum("buffer size","4096",10,&y,xxstring)) < 0) - return(z); - if (y < 1) { - printf("?Positive number required\n"); - return(-9); - } - if ((z = cmcfm()) < 0) return(z); - readblock = y; - if (readbuf) - free((char *)readbuf); - if (!(readbuf = (CHAR *) malloc(readblock+1))) { - printf("?Can't allocate read buffer\n"); - return(-9); - } - return(success = zopeni(ZRFILE,line)); - -#ifndef MAC -#ifndef NOPUSH - case OPN_PI_R: /* Pipe/Process (!READ) */ - if (nopush) { - printf("?Read from pipe disabled\n"); - return(success=0); - } - if (chkfn(ZRFILE) > 0) { - printf("?Read file already open\n"); - return(-2); - } - if ((y = cmtxt("System command to read from","",&s,xxstring)) < 0) { - if (y == -3) { - printf("?Command name required\n"); - return(-9); - } else return(y); - } - ckstrncpy(line,brstrip(s),LINBUFSIZ); - if (!line[0]) return(-2); - if ((y = cmcfm()) < 0) return(y); - if (!readbuf) { - if (!(readbuf = (CHAR *) malloc(readblock+1))) { - printf("?Can't allocate read buffer\n"); - return(-9); - } - } - return(success = zxcmd(ZRFILE,line)); - - case OPN_PI_W: /* Write to pipe */ - if (nopush) { - printf("?Write to pipe disabled\n"); - return(success=0); - } - if (chkfn(ZWFILE) > 0) { - printf("?Write file already open\n"); - return(-2); - } - if ((y = cmtxt("System command to write to","",&s,xxstring)) < 0) { - if (y == -3) { - printf("?Command name required\n"); - return(-9); - } else return(y); - } - ckstrncpy(line,brstrip(s),LINBUFSIZ); - if (!line[0]) return(-2); - if ((y = cmcfm()) < 0) return(y); - success = zxcmd(ZWFILE,line); - if (!success && msgflg) - printf("Can't open process for writing: %s\n",line); - return(success); -#endif /* NOPUSH */ -#endif /* MAC */ - - case OPN_FI_W: /* New file (WRITE) */ - case OPN_FI_A: /* (APPEND) */ - if ((z = cmofi("Name of local file to create","",&s,xxstring)) < 0) { - if (z == -3) { - printf("?Filename required\n"); - return(-9); - } else return(z); - } - if (z == 2) { - printf("?Sorry, %s is a directory name\n",s); - return(-9); - } - if (chkfn(ZWFILE) > 0) { - printf("?Write/Append file already open\n"); - return(-2); - } - fcb.bs = fcb.cs = fcb.rl = fcb.fmt = fcb.org = fcb.cc = fcb.typ = 0; - fcb.lblopts = 0; - fcb.dsp = (x == OPN_FI_W) ? XYFZ_N : XYFZ_A; /* Create or Append */ - ckstrncpy(line,s,LINBUFSIZ); - if ((int)strlen(line) < 1) return(-2); - if ((y = cmcfm()) < 0) return(y); - return(success = zopeno(ZWFILE,line,NULL,&fcb)); - -#ifndef NOLOCAL - case OPN_SER: /* OPEN PORT or LINE */ - case OPN_NET: { /* OPEN HOST */ - extern int didsetlin, ttnproto; - if (x == OPN_NET) { - z = ttnproto; - ttnproto = NP_NONE; - } - if ((y = setlin((x == OPN_SER) ? XYLINE : XYHOST, 1, 0)) < 0) { - if (x == OPN_NET) - ttnproto = z; - success = 0; - } - didsetlin++; - return(y); - } -#endif /* NOLOCAL */ - - default: - printf("?Not implemented"); - return(-2); - } -} -#endif /* NOSPL */ - -#ifndef NOXFER -/* D O X G E T -- GET command parser with switches */ - -#ifdef CK_LABELED -int g_lf_opts = -1; -extern int lf_opts; -#endif /* CK_LABELED */ - -int -doxget(cx) int cx; { - extern int /* External variables we need */ -#ifdef RECURSIVE - recursive, -#endif /* RECURSIVE */ - xfermode, fdispla, protocol, usepipes, - g_binary, g_xfermode, g_displa, g_rpath, g_usepipes; - extern char * rcv_move; /* Directory to move new files to */ - extern char * rcv_rename; /* What to rename new files to */ - extern char * rcvexcept[]; /* RECEIVE / GET exception list */ - int opkt = 0; /* Flag for O-Packet needed */ - -#ifdef PIPESEND - extern int pipesend; - extern char * rcvfilter; -#endif /* PIPESEND */ - extern struct keytab rpathtab[]; - extern int nrpathtab; - extern long calibrate; - int asname = 0; /* Flag for have as-name */ - int konly = 0; /* Kermit-only function */ - int c, i, n, confirmed = 0; /* Workers */ - int getval = 0; /* Whether to get switch value */ - int rcvcmd = 0; /* Whether it is the RECEIVE command */ - int mget = 0; /* Whether it is the MGET command */ - struct stringint { /* Temporary array for switch values */ - char * sval; - int ival; - } pv[SND_MAX+1]; - struct FDB sw, fl, cm; /* FDBs for each parse function */ - char * cmdstr = "this command"; - -#ifdef NEWFTP - if (cx == XXGET || cx == XXREGET || cx == XXMGET || cx == XXRETR) { - extern int ftpget; - extern int ftpisopen(); - if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) - return(doftpget(cx,0)); - } -#endif /* NEWFTP */ - - debug(F101,"xget cx","",cx); - - oopts = -1; - omode = -1; - - for (i = 0; i <= SND_MAX; i++) { /* Initialize switch values */ - pv[i].sval = NULL; - pv[i].ival = -1; - } - /* Preset switch values based on top-level command that called us */ - - switch (cx) { - case XXREC: /* RECEIVE */ - cmdstr = "RECEIVE"; - rcvcmd = 1; break; - case XXGET: /* GET */ - cmdstr = "GET"; - konly = 1; - break; -#ifdef CK_RESEND - case XXREGET: /* REGET */ - cmdstr = "REGET"; - konly = 1; - pv[SND_BIN].ival = 1; /* Implies /BINARY */ - pv[SND_RES].ival = 1; break; -#endif /* CK_RESEND */ - case XXRETR: /* RETRIEVE */ - cmdstr = "RETRIEVE"; - konly = 1; - pv[SND_DEL].ival = 1; break; -#ifdef PIPESEND - case XXCREC: /* CRECEIVE */ - cmdstr = "CRECEIVE"; - konly = 1; - rcvcmd = 1; - pv[SND_CMD].ival = 1; break; - case XXCGET: /* CGET */ - cmdstr = "CGET"; - konly = 1; - pv[SND_CMD].ival = 1; break; -#endif /* PIPESEND */ -#ifndef NOMGET - case XXMGET: /* MGET */ - cmdstr = "MGET"; - konly = 1; - mget = 1; break; -#endif /* NOMGET */ - } - debug(F111,"xget rcvcmd",cmdstr,rcvcmd); - debug(F101,"xget konly","",konly); - -#ifdef CK_XYZ - if (!rcvcmd && protocol != PROTO_K) { - printf("?Sorry, %s works only with Kermit protocol\n",cmdstr); - return(-9); - } -#endif /* CK_XYZ */ - - /* Set up chained parse functions... */ - - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - rcvcmd ? - "Optional name/template to store incoming files under, or switch" : - "Remote filename, or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - rcvcmd ? nrcvtab : ngettab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - rcvcmd ? rcvtab : gettab, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - if (rcvcmd || mget) /* RECEIVE or MGET */ - cmfdbi(&fl, - _CMTXT, /* fcode */ - rcvcmd ? /* hlpmsg */ - "Output filename or Command" : /* Output filename */ - "File(s) to GET", /* Files we are asking for */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ -#ifdef CK_XYZ - (protocol == PROTO_X || protocol == PROTO_XC) ? - xxstring : - (rcvcmd ? (xx_strp)0 : xxstring) -#else - rcvcmd ? (xx_strp)0 : xxstring /* Processing function */ -#endif /* CK_XYZ */ - , - NULL, - &cm - ); - else - cmfdbi(&fl, /* Remote filename or command */ - _CMFLD, /* fcode */ - "Remote filename", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - &cm - ); - cmfdbi(&cm, /* Confirmation */ - _CMCFM, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - NULL, - NULL, - NULL - ); - - /* (See doxsend() for fuller commentary) */ - - while (1) { /* Parse 0 or more switches */ - x = cmfdb(&sw); /* Parse something */ - debug(F101,"xget cmfdb","",x); - if (x < 0) /* Error */ - goto xgetx; /* or reparse needed */ - if (cmresult.fcode != _CMKEY) /* Break out if not a switch */ - break; - c = cmgbrk(); /* Get break character */ - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - x = -9; - goto xgetx; - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - x = -9; - goto xgetx; - } - n = cmresult.nresult; /* Numeric result = switch value */ - debug(F101,"xget switch","",n); - - switch (n) { /* Process the switch */ -#ifdef PIPESEND - case SND_CMD: /* These take no args */ - if (nopush) { - printf("?Sorry, system command access is disabled\n"); - x = -9; - goto xgetx; - } else if (rcvfilter) { - printf( -"?Sorry, no GET /COMMAND when RECEIVE FILTER selected\n"); - x = -9; - goto xgetx; - } - if (rcvcmd) - sw.hlpmsg = "Command, or switch"; /* Change help message */ - /* Fall thru... */ -#endif /* PIPESEND */ - - case SND_REC: /* /RECURSIVE */ - pv[SND_PTH].ival = PATH_REL; /* Implies relative pathnames */ - pv[n].ival = 1; /* Set the recursive flag */ - break; - - case SND_RES: /* /RECOVER */ - pv[SND_BIN].ival = 1; /* Implies /BINARY */ - pv[n].ival = 1; /* Set the resend flag */ - break; - - case SND_DEL: /* /DELETE */ - case SND_SHH: /* /QUIET */ - case SND_CAL: /* /CALIBRATE */ - case SND_XPA: /* /TRANSPARENT */ - pv[n].ival = 1; /* Just set the appropriate flag */ - break; - - case SND_PIP: /* /PIPES:{ON,OFF} */ - if (!getval) { - pv[n].ival = 1; - break; - } - if ((x = cmkey(onoff,2,"","on",xxstring)) < 0) - goto xgetx; - if (!nopush) - pv[n].ival = x; - break; - - /* File transfer modes - each undoes the others */ - - case SND_BIN: /* Binary */ - case SND_TXT: /* Text */ - case SND_IMG: /* Image */ - case SND_LBL: /* Labeled */ - pv[SND_BIN].ival = 0; /* Unset all */ - pv[SND_TXT].ival = 0; - pv[SND_IMG].ival = 0; - pv[SND_LBL].ival = 0; - pv[n].ival = 1; /* Set the requested one */ - break; - - case SND_EXC: /* Excludes */ - if (!getval) break; - if ((x = cmfld("Pattern","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Pattern required\n"); - x = -9; - } - goto xgetx; - } - if (pv[n].sval) free(pv[n].sval); - y = strlen(s); - if (y > 256) { - printf("?Pattern too long - 256 max\n"); - x = -9; - goto xgetx; - } - pv[n].sval = malloc(y+1); - if (pv[n].sval) { - strcpy(pv[n].sval,s); /* safe */ - pv[n].ival = 1; - } - break; - -#ifdef COMMENT - /* Not implemented */ - case SND_PRI: /* GET to printer */ - pv[n].ival = 1; - if (!getval) break; - if ((x = cmfld("Print options","",&s,xxstring)) < 0) - goto xgetx; - pv[n].sval = malloc((int)strlen(s)+1); - if (pv[n].sval) - strcpy(pv[n].sval,s); /* safe */ - break; -#endif /* COMMENT */ - - case SND_MOV: /* MOVE after */ - case SND_REN: /* RENAME after */ - if (!getval) break; - if ((x = cmfld(n == SND_MOV ? - "device and/or directory for source file after sending" : - "new name for source file after sending", - "", - &s, - n == SND_MOV ? xxstring : NULL - )) < 0) { - if (x == -3) { - printf("%s\n", n == SND_MOV ? - "?Destination required" : - "?New name required" - ); - x = -9; - } - goto xgetx; - } - if (pv[n].sval) { - free(pv[n].sval); - pv[n].sval = NULL; - } - s = brstrip(s); - y = strlen(s); - if (y > 0) { - pv[n].sval = malloc(y+1); - if (pv[n].sval) { - strcpy(pv[n].sval,s); /* safe */ - pv[n].ival = 1; - } - } - break; - - case SND_ASN: /* As-name */ - if (!getval) break; - if (mget) { - printf("?Sorry, as-name not allowed with MGET\n"); - x = -9; - goto xgetx; - } - if ((x = cmfld("Name to store it under","",&s,NULL)) < 0) - goto xgetx; - s = brstrip(s); - if ((y = strlen(s)) > 0) { - if (pv[n].sval) free(pv[n].sval); - pv[n].sval = malloc(y+1); - if (pv[n].sval) { - strcpy(pv[n].sval,s); /* safe */ - pv[n].ival = 1; - } - } - break; - -#ifdef PIPESEND - case SND_FLT: /* Filter */ - debug(F101,"xget /filter getval","",getval); - if (!getval) break; - if ((x = cmfld("Filter program to receive through", - "",&s,NULL)) < 0) { - if (x == -3) - s = ""; - else - goto xgetx; - } - if (*s) s = brstrip(s); - y = strlen(s); - for (x = 0; x < y; x++) { /* Make sure they included "\v(...)" */ - if (s[x] != '\\') continue; - if (s[x+1] == 'v') break; - } - if (x == y) { - printf( - "?Filter must contain a replacement variable for filename.\n" - ); - x = -9; - goto xgetx; - } - pv[n].ival = 1; - if (pv[n].sval) { - free(pv[n].sval); - pv[n].sval = NULL; - } - if ((y = strlen(s)) > 0) { - if ((pv[n].sval = malloc(y+1))) - strcpy(pv[n].sval,s); /* safe */ - } - break; -#endif /* PIPESEND */ - - case SND_PTH: /* Pathnames */ - if (!getval) { - pv[n].ival = PATH_REL; - break; - } - if ((x = cmkey(rpathtab,nrpathtab,"","on",xxstring)) < 0) - goto xgetx; - pv[n].ival = x; /* Ditto */ - break; - - case SND_NAM: /* Filenames */ - if (!getval) break; - if ((x = cmkey(fntab,nfntab,"","converted",xxstring)) < 0) - goto xgetx; - pv[n].ival = x; - break; - - case SND_PRO: /* Protocol to use */ - if (!getval) break; - if ((x = cmkey(protos,nprotos,"File-transfer protocol","", - xxstring)) < 0) { - if (x == -3) - x = 0; - else - goto xgetx; - } - debug(F111,"xget /proto",atmbuf,x); - pv[n].ival = x; - if (konly && x != PROTO_K) { - printf( -"?Sorry, this command works only with Kermit protocol\n" - ); - x = -9; - goto xgetx; - } - break; - - default: - printf("?Unexpected switch value - %d\n",cmresult.nresult); - x = -9; - goto xgetx; - } - } - debug(F101,"xget cmresult fcode","",cmresult.fcode); - - cmarg = line; /* Initialize string pointers */ - cmarg2 = tmpbuf; - asname = 0; - line[0] = NUL; /* and buffers. */ - tmpbuf[0] = NUL; - - switch (cmresult.fcode) { /* How did we get out of switch loop */ - case _CMFLD: /* (3) Remote filespec */ - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); - break; - case _CMTXT: /* (4) As-name */ - if (rcvcmd) { - ckstrncpy(tmpbuf,cmresult.sresult,TMPBUFSIZ); - if ((int)strlen(tmpbuf) > 0) - asname = 1; - } else { - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); - } - case _CMCFM: /* (6) Confirmation */ - confirmed = 1; - break; - default: - printf("?Unexpected function code: %d\n",cmresult.fcode); - x = -9; - goto xgetx; - } - debug(F110,"xget string",cmarg,0); - debug(F101,"xget confirmed","",confirmed); - - cmarg = brstrip(cmarg); /* Strip any braces */ - - if (!confirmed) { /* CR not typed yet, get more fields */ - if (pv[SND_CMD].ival > 0) { - debug(F100,"xget calling cmtxt","",0); - x = cmtxt("Local command to pipe into","",&s,NULL); - if (x < 0 && x != -3) goto xgetx; - if (x != -3) { - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - asname = 1; - } - } else if (!rcvcmd) { -#ifdef VMS - /* cmofi() fails if you give it a directory name */ - x = cmfld("Name or directory for incoming file","",&s,NULL); - debug(F111,"xget cmfld",s,x); -#else - x = cmofi("Name or directory for incoming file","",&s,NULL); - debug(F111,"xget cmofi",s,x); -#endif /* VMS */ - if (x < 0 && x != -3) goto xgetx; - if (x != -3) { - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - if ((x = cmcfm()) < 0) goto xgetx; - asname = 1; - } - } - } - /* Arrive here with cmarg and cmarg2 all set */ - - debug(F111,"xget asname",cmarg2,asname); - if (!asname) { - if (pv[SND_ASN].sval) - ckstrncpy(tmpbuf,pv[SND_ASN].sval,TMPBUFSIZ); - else - tmpbuf[0] = NUL; - } - cmarg2 = brstrip(cmarg2); /* Strip outer braces if any. */ - debug(F110,"xget cmarg",cmarg,0); - debug(F110,"xget cmarg2",cmarg2,0); - - if (!*cmarg && - (cx == XXGET || cx == XXREGET || cx == XXCGET || cx == XXMGET)) { - printf("?A remote file specification is required\n"); - x = -9; - goto xgetx; - } -#ifdef PIPESEND - if (pv[SND_CMD].ival > 0) { /* /COMMAND sets pipesend flag */ - x = -9; - if (!*cmarg2) { - printf("?Command required\n"); - goto xgetx; - } else if (nopush) { - printf("?Sorry, system command access is disabled\n"); - goto xgetx; - } else if (rcvfilter) { - printf("?Sorry, no GET /COMMAND while RECEIVE FILTER selected\n"); - goto xgetx; - } else - pipesend = 1; - } - debug(F101,"xget /COMMAND pipesend","",pipesend); -#endif /* PIPESEND */ - -#ifdef CK_RESEND - if (pv[SND_RES].ival > 0) { /* REGET or GET /RECOVER */ -#ifdef RECURSIVE - if (pv[SND_REC].ival > 0) { /* RECURSIVE */ -#ifdef COMMENT - printf("?Unsupported option combination: /RECOVER /RECURSIVE\n"); - x = -9; - goto xgetx; -#else - opkt = 1; -#endif /* COMMENT */ - } -#endif /* RECURSIVE */ - if (pv[SND_DEL].ival > 0) { /* /DELETE */ -#ifdef COMMENT - printf("?Unsupported option combination: /RECOVER /DELETE\n"); - x = -9; - goto xgetx; -#else - opkt = 1; -#endif /* COMMENT */ - } - } -#endif /* CK_RESEND */ - - if (pv[SND_EXC].ival > 0) /* /EXCEPT */ - makelist(pv[SND_EXC].sval,rcvexcept,NSNDEXCEPT); - -#ifdef IKS_OPTION - if (!rcvcmd -#ifdef CK_XYZ - && protocol == PROTO_K -#endif /* CK_XYZ */ - ) { - if (!iks_wait(KERMIT_REQ_START,1)) { - printf( - "?A Kermit Server is not available to process this command\n"); - x = -9; /* correct the return code */ - goto xgetx; - } - } -#endif /* IKS_OPTION */ - -#ifdef CK_XYZ - { - int po, pg; /* (for clarity) */ - po = pv[SND_PRO].ival; /* /PROTOCOL option */ - pg = protocol; /* Protocol global */ - if ((rcvcmd && !*cmarg2) && /* If no as-name was given */ - /* and /PROTOCOL is XMODEM or global protocol is XMODEM... */ - ((po < 0 && (pg == PROTO_X || pg == PROTO_XC)) || - (po > -1 && (po == PROTO_X || po == PROTO_XC))) - ) { - printf( -"Sorry, you must specify a name when receiving a file with XMODEM protocol\n" - ); - x = -9; - goto xgetx; - } - } -#endif /* CK_XYZ */ - -#ifdef RECURSIVE - if (pv[SND_REC].ival > 0) { /* RECURSIVE */ - recursive = 1; - pv[SND_PTH].ival = PATH_REL; /* Implies relative pathnames too */ - } -#endif /* RECURSIVE */ - - if (pv[SND_PIP].ival > -1) { - g_usepipes = usepipes; - usepipes = pv[SND_PIP].ival; - } - - /* Save global protocol parameters */ - - g_proto = protocol; -#ifdef CK_LABELED - g_lf_opts = lf_opts; /* Save labeled transfer options */ -#endif /* CK_LABELED */ - g_urpsiz = urpsiz; /* Receive packet length */ - g_spsizf = spsizf; /* Send packet length flag */ - g_spsiz = spsiz; /* Send packet length */ - g_spsizr = spsizr; /* etc etc */ - g_spmax = spmax; - g_wslotr = wslotr; - g_prefixing = prefixing; - g_fncact = fncact; - g_fncnv = fncnv; - g_fnspath = fnspath; - g_fnrpath = fnrpath; - g_xfrxla = xfrxla; - - if (pv[SND_PRO].ival > -1) { /* Change according to switch */ - protocol = pv[SND_PRO].ival; - if (ptab[protocol].rpktlen > -1) /* copied from initproto() */ - urpsiz = ptab[protocol].rpktlen; - if (ptab[protocol].spktflg > -1) - spsizf = ptab[protocol].spktflg; - if (ptab[protocol].spktlen > -1) { - spsiz = ptab[protocol].spktlen; - if (spsizf) - spsizr = spmax = spsiz; - } - if (ptab[protocol].winsize > -1) - wslotr = ptab[protocol].winsize; - if (ptab[protocol].prefix > -1) - prefixing = ptab[protocol].prefix; - if (ptab[protocol].fnca > -1) - fncact = ptab[protocol].fnca; - if (ptab[protocol].fncn > -1) - fncnv = ptab[protocol].fncn; - if (ptab[protocol].fnsp > -1) - fnspath = ptab[protocol].fnsp; - if (ptab[protocol].fnrp > -1) - fnrpath = ptab[protocol].fnrp; - } - debug(F101,"xget protocol","",protocol); - debug(F111,"xget cmarg2",cmarg2,xfermode); - - g_xfermode = xfermode; - g_binary = binary; - if (pv[SND_BIN].ival > 0) { /* Change according to switch */ - xfermode = XMODE_M; - binary = XYFT_B; /* FILE TYPE BINARY */ - omode = GMOD_BIN; /* O-Packet mode */ - debug(F101,"doxget /BINARY xfermode","",xfermode); - } else if (pv[SND_TXT].ival > 0) { /* Ditto for /TEXT */ - xfermode = XMODE_M; - binary = XYFT_T; - omode = GMOD_TXT; - debug(F101,"doxget /TEXT xfermode","",xfermode); - } else if (pv[SND_IMG].ival > 0) { - xfermode = XMODE_M; -#ifdef VMS - binary = XYFT_I; -#else - binary = XYFT_B; -#endif /* VMS */ - omode = GMOD_TXT; - debug(F101,"doxget /IMAGE xfermode","",xfermode); - } -#ifdef CK_LABELED - else if (pv[SND_LBL].ival > 0) { - xfermode = XMODE_M; - binary = XYFT_L; - omode = GMOD_LBL; - debug(F101,"doxget /LABELED xfermode","",xfermode); - } -#endif /* CK_LABELED */ - debug(F101,"xget binary","",binary); - debug(F101,"xget omode","",omode); - - if (pv[SND_XPA].ival > 0) /* /TRANSPARENT */ - xfrxla = 0; /* Don't translate character sets */ - -#ifdef PIPESEND - if (pv[SND_FLT].ival > 0) - makestr(&rcvfilter,pv[SND_FLT].sval); -#endif /* PIPESEND */ - -#ifdef CK_TMPDIR - if (pv[SND_MOV].ival > 0) { - int len; - char * p = pv[SND_MOV].sval; -#ifdef CK_LOGIN - if (isguest) { - printf("?Sorry, /MOVE-TO not available to guests\n"); - x = -9; - goto xgetx; - } -#endif /* CK_LOGIN */ - len = strlen(p); - if (!isdir(p)) { /* Check directory */ -#ifdef CK_MKDIR - char * s = NULL; - s = (char *)malloc(len + 4); - if (s) { - strcpy(s,p); /* safe */ -#ifdef datageneral - if (s[len-1] != ':') { s[len++] = ':'; s[len] = NUL; } -#else - if (s[len-1] != '/') { s[len++] = '/'; s[len] = NUL; } -#endif /* datageneral */ - s[len++] = 'X'; - s[len] = NUL; - x = zmkdir(s); - free(s); - if (x < 0) { - printf("?Can't create \"%s\"\n",p); - x = -9; - goto xgetx; - } - } -#else - printf("?Directory \"%s\" not found\n",p); - x = -9; - goto xgetx; -#endif /* CK_MKDIR */ - } - zfnqfp(p,LINBUFSIZ,line); - makestr(&rcv_move,line); - } -#endif /* CK_TMPDIR */ - - if (pv[SND_REN].ival > 0) { /* /RENAME-TO:name */ - char * p = pv[SND_REN].sval; -#ifdef CK_LOGIN - if (isguest) { - printf("?Sorry, /RENAME-TO not available to guests\n"); - x = -9; - goto xgetx; - } -#endif /* CK_LOGIN */ - if (!p) p = ""; - if (!*p) { - printf("?New name required for /RENAME\n"); - x = -9; - goto xgetx; - } - p = brstrip(p); - makestr(&rcv_rename,p); - debug(F110,"xget rcv_rename","",0); - } - -#ifdef CALIBRATE - if (pv[SND_CAL].ival > 0) - calibrate = 1L; -#endif /* CALIBRATE */ - g_displa = fdispla; - if (pv[SND_SHH].ival > 0) - fdispla = 0; - debug(F101,"xget display","",fdispla); - - if (pv[SND_NAM].ival > -1) { /* /FILENAMES */ - g_fncnv = fncnv; /* Save global value */ - fncnv = pv[SND_NAM].ival; - debug(F101,"xsend fncnv","",fncnv); - /* We should also handle O packet filename option here */ - /* but we don't really need to since WHATAMI already handles it */ - } - if (pv[SND_PTH].ival > -1) { /* PATHNAMES */ - g_rpath = fnrpath; /* Save global values */ - fnrpath = pv[SND_PTH].ival; - debug(F101,"xsend fnrpath","",fnrpath); -#ifndef NZLTOR - if (fnrpath != PATH_OFF) { - g_fncnv = fncnv; - fncnv = XYFN_L; - debug(F101,"xsend fncnv","",fncnv); - } - /* We should also handle O packet pathname option here */ - /* but we don't really need to since WHATAMI already handles it */ -#endif /* NZLTOR */ - } - - /* Set protocol start state */ - - if (opkt) { /* Extended GET Options*/ - sstate = (CHAR) 'o'; - oopts = 0; - if (pv[SND_DEL].ival > 0) oopts |= GOPT_DEL; /* GET /DELETE */ - if (pv[SND_RES].ival > 0) oopts |= GOPT_RES; /* GET /RECOVER */ - if (pv[SND_REC].ival > 0) oopts |= GOPT_REC; /* GET /RECURSIVE */ - } else if (rcvcmd) - sstate = (CHAR) 'v'; /* RECEIVE or CRECEIVE */ - else if (pv[SND_DEL].ival > 0) - sstate = (CHAR) 'h'; /* GET /DELETE (= RETRIEVE) */ - else if (pv[SND_RES].ival > 0) - sstate = (CHAR) 'j'; /* GET /RECOVER (= REGET) */ - else - sstate = (CHAR) 'r'; /* Regular GET */ - getcmd = 1; - debug(F000,"xget sstate","",sstate); -#ifdef MAC - what = W_RECV; - scrcreate(); -#endif /* MAC */ - if (local) { - if (pv[SND_SHH].ival != 0) - displa = 1; - ttflui(); - } - x = 0; -#ifdef PIPESEND - if (pipesend) - goto xgetx; -#endif /* PIPESEND */ - -#ifdef CK_TMPDIR -/* - cmarg2 is also allowed to be a device or directory name; - even the name of a directory that doesn't exist. -*/ - y = strlen(cmarg2); - debug(F111,"xget strlen(cmarg2)",cmarg2,y); - if ((y > 0) && -#ifdef OS2 - ((isalpha(cmarg2[0]) && - cmarg2[1] == ':' && - cmarg2[2] == NUL) || - (cmarg[y-1] == '/' || cmarg[y-1] == '\\') || - isdir(cmarg2)) -#else -#ifdef UNIXOROSK - (cmarg2[y-1] == '/' || isdir(cmarg2)) -#else -#ifdef VMS - (cmarg2[y-1] == ']' || cmarg2[y-1] == '>' || isdir(cmarg2)) -#else -#ifdef STRATUS - (cmarg2[y-1] == '>' || isdir(cmarg2)) -#else -#ifdef datageneral - (cmarg2[y-1] == ':' || cmarg[0] == ':' || isdir(cmarg2)) -#else - isdir(cmarg2) -#endif /* datageneral */ -#endif /* STRATUS */ -#endif /* VMS */ -#endif /* UNIXOROSK */ -#endif /* OS2 */ - ) { - debug(F110,"doxget RECEIVE cmarg2 disk or dir",cmarg2,0); - if (!f_tmpdir) { - int x; - s = zgtdir(); - if (s) { - ckstrncpy(savdir,s,TMPDIRLEN); /* remember old disk/dir */ - f_tmpdir = 1; /* and that we did this */ - } else { - printf("?Can't get current directory\n"); - cmarg2 = ""; - f_tmpdir = 0; - x = -9; - goto xgetx; - } -#ifdef CK_MKDIR - x = zchki(cmarg2); /* Does as-name exist? */ - if (x == -1) { /* Doesn't exist */ - char * p = NULL; /* Try to create it */ - x = strlen(cmarg2); - if ((p = (char *)malloc(x+4))) { - sprintf(p,"%s%s",cmarg2,"x.x"); /* SAFE (prechecked) */ - x = zmkdir(p); - free(p); - if (x < 0) { - printf("?Can't create %s\n",cmarg2); - x = -9; - goto xgetx; - } - } - } -#endif /* CK_MKDIR */ - if (!zchdir(cmarg2)) { /* change to given disk/directory, */ - printf("?Can't access %s\n",cmarg2); - x = -9; - goto xgetx; - } - cmarg2 = ""; - } - } -#endif /* CK_TMPDIR */ - - ckstrncpy(fspec,cmarg,CKMAXPATH); /* Note - this is a REMOTE filespec */ - debug(F111,"xget fspec",fspec,fspeclen); - debug(F110,"xget cmarg2",cmarg2,0); - - xgetx: - for (i = 0; i < SND_MAX; i++) - if (pv[i].sval) - free(pv[i].sval); - return(x); -} -#endif /* NOXFER */ - -#ifndef NOSPL - -/* - D O G T A -- Do _GETARGS or _PUTARGS Command. - - Used by XIF, FOR, WHILE, and SWITCH, each of which are implemented as - 2-level macros; the first level defines the macro, the second runs it. - This routine hides the fact that they are macros by importing the - macro arguments (if any) from two levels up, to make them available - in the IF, FOR, SWITCH, and WHILE commands themselves; for example as - loop indices, etc, and within the IF/FOR/WHILE/SWITCH body itself. - _PUTARGS is in case we changed any of these variables or used SHIFT - on them, so the new values won't be lost as we pop up the stack. -*/ -int -dogta(cx) int cx; { - int i, n; - char c, *p, mbuf[4]; - extern int topargc, cmdint; - extern char ** topxarg; - - if ((y = cmcfm()) < 0) - return(y); - debug(F101,"dogta cx","",cx); - debug(F101,"dogta maclvl","",maclvl); - if (cx == XXGTA) { - debug(F101,"dogta _GETARGS maclvl","",maclvl); - } else if (cx == XXPTA) { - debug(F101,"dogta _PUTARGS maclvl","",maclvl); - } else { - return(-2); - } - if (maclvl < 1) - return(success = 0); - - /* Make new copies of macro arguments /%0..9 */ - - mbuf[0] = '%'; mbuf[1] = '0'; mbuf[2] = NUL; /* Argument name buf */ - - if (cx == XXPTA) { /* Go NOINT because _PUTARGS */ - if (cmdint) /* temporarily changes maclvl. */ - connoi(); /* Interrupts OFF. */ - } - for (i = 0; i < 10; i++) { /* For all args */ - c = (char) (i + '0'); /* Make name */ - mbuf[1] = (char) c; /* Insert digit */ - if (cx == XXGTA) { /* Get arg from level-minus-2 */ - if (maclvl == 1) p = g_var[c]; /* If at level 1 use globals 0..9 */ - else p = m_arg[maclvl-2][i]; /* Otherwise they're on the stack */ - addmac(mbuf,p); -#ifdef COMMENT - if (maclvl > 1) - makestr(&(m_line[maclvl]),m_line[maclvl-2]); -#endif /* COMMENT */ - } else if (cx == XXPTA) { /* Put args level+2 */ - maclvl -= 2; /* This is gross, it's because we're */ - addmac(mbuf,m_arg[maclvl+2][i]); /* adding macros two levels up */ - maclvl += 2; /* and addmac() uses maclvl. */ - count[cmdlvl - 2] = count[cmdlvl]; - intime[cmdlvl - 2] = intime[cmdlvl]; - inpcas[cmdlvl - 2] = inpcas[cmdlvl]; - takerr[cmdlvl - 2] = takerr[cmdlvl]; - merror[cmdlvl - 2] = merror[cmdlvl]; - xquiet[cmdlvl - 2] = xquiet[cmdlvl]; - } else return(success = 0); /* Bad call to this routine */ - } - if (cx == XXPTA) { /* Restore interrupts if we */ - if (cmdint) /* turned them off above. */ - conint(trap,stptrap); - } - /* Now take care of the argument vector array \&_[], \v(return), */ - /* and \v(argc) by just copying the pointers. */ - - if (cx == XXGTA) { /* GETARGS from 2 levels up */ - if (maclvl == 1) { - a_ptr[0] = topxarg; /* \&_[] array */ - a_dim[0] = topargc - 1; /* Dimension doesn't include [0] */ - m_xarg[maclvl] = topxarg; - n_xarg[maclvl] = topargc; /* But \v(argc) does include \%0 */ - macargc[maclvl] = topargc; - makestr(&(mrval[maclvl+1]),mrval[0]); /* (see vnlook()) */ - } else { - a_ptr[0] = m_xarg[maclvl-2]; - a_dim[0] = n_xarg[maclvl-2]; - m_xarg[maclvl] = m_xarg[maclvl-2]; - n_xarg[maclvl] = n_xarg[maclvl-2]; - macargc[maclvl] = n_xarg[maclvl-2]; - makestr(&(mrval[maclvl+1]),mrval[maclvl-1]); /* (see vnlook()) */ - - } - } else { /* PUTARGS 2 levels up */ - if (maclvl > 1) { - a_ptr[0] = m_xarg[maclvl]; - m_xarg[maclvl-2] = m_xarg[maclvl]; - a_dim[0] = n_xarg[maclvl]; - n_xarg[maclvl-2] = n_xarg[maclvl]; - macargc[maclvl-2] = n_xarg[maclvl]; - } - } - return(1); /* Internal command - don't change success */ -} -#endif /* NOSPL */ - -#ifndef NOSPL -/* - Do the GOTO and [_]FORWARD commands. - s = Label to search for, cx = function code: XXGOTO, XXFWD, or XXXFWD. -*/ -#ifdef BIGBUFOK -#define LBLMAXLEN 255 /* Max label length */ -#else -#define LBLMAXLEN 63 -#endif /* BIGBUFOK */ - -int -dogoto(s, cx) char *s; int cx; { - int i, j, x, y, z, bc; - int empty = 0, stopflg = 0; - char * cmd; /* Name of this command */ - char tmplbl[LBLMAXLEN+1], *lp; /* Current label from command stream */ - char tmp2[LBLMAXLEN+1]; /* SWITCH label conversion buffer */ - char tmp3[LBLMAXLEN+1]; /* Target label */ - - stopflg = (cx == XXXFWD); /* _FORWARD (used in SWITCH) */ - bc = 0; /* Brace counter */ - - cmd = (cx == XXGOTO) ? "GOTO" : ((cx == XXFWD) ? "FORWARD" : "_FORWARD"); - if (!s) s = ""; - if (!*s) empty = 1; - -#ifdef DEBUG - if (deblog) { - debug(F111,"GOTO command",cmd,cx); - debug(F101,"GOTO cmdlvl","",cmdlvl); - debug(F101,"GOTO maclvl","",maclvl); - debug(F101,"GOTO tlevel","",tlevel); - debug(F111,"GOTO target",s,empty); - } -#endif /* DEBUG */ - debug(F110,cmd,s,0); - ckstrncpy(tmp3+1,s,LBLMAXLEN-1); - s = tmp3+1; - if (*s != ':') { /* Make copy of label */ - tmp3[0] = ':'; /* guaranteed to start with ":" */ - s--; - } - if (!stopflg && !empty) { - if (s[1] == '.' || s[1] == SP || s[1] == NUL) { - printf("?Bad label syntax - '%s'\n",s); - return(success = 0); - } - } - if (cmdlvl == 0) { - printf("?Sorry, %s only works in a command file or macro\n",cmd); - return(success = 0); - } - y = strlen(s); /* y = length of target label */ - debug(F111,cmd,s,y); - - while (cmdlvl > 0) { /* As long as not at top level... */ - if (cmdstk[cmdlvl].src == CMD_MD) { /* GOTO inside macro */ - int i, m, flag; - char *xp, *tp; - - /* GOTO: rewind the macro; FORWARD: start at current position */ - - lp = (cx == XXGOTO) ? macx[maclvl] : macp[maclvl]; - m = (int)strlen(lp) - y + 1; - debug(F010,"GOTO in macro",lp,0); - - flag = 1; /* flag for valid label position */ - for (i = 0; i < m; i++,lp++) { /* search for label in macro body */ - if (*lp == '{') /* But only at this level */ - bc++; /* Anything inside braces is off */ - else if (*lp == '}') /* limits. */ - bc--; - if (stopflg && bc > 0) /* This is good for SWITCH */ - continue; /* but interferes with WHILE, etc. */ - if (*lp == ',') { - flag = 1; - continue; - } - if (flag) { /* If in valid label position */ - if (*lp == SP) /* eat leading spaces */ - continue; - if (*lp != ':') { /* Look for label introducer */ - flag = 0; /* this isn't it */ - continue; /* keep looking */ - } - } - if (!flag) /* We don't have a label */ - continue; /* so keep looking... */ - xp = lp; tp = tmplbl; /* Copy the label from the macro */ - j = 0; /* to make it null-terminated */ - while ((*tp = *xp)) { - if (j++ > LBLMAXLEN) /* j = length of word from macro */ - break; -#ifdef COMMENT - if (*tp < 33 || *tp == ',') /* Look for end of word */ -#else - if (!*tp || *tp == ',') /* Look for end of word */ -#endif /* COMMENT */ - break; - else tp++, xp++; /* Next character */ - } - *tp = NUL; /* In case we stopped early */ - /* Now do caseless string comparison, using longest length */ - debug(F111,"macro GOTO label",s,y); - debug(F111,"macro target label",tmplbl,j); - if (stopflg) { /* Allow variables as SWITCH labels */ - int n = LBLMAXLEN - 1; - char * p = tmp2; - zzstring(tmplbl,&p,&n); - ckstrncpy(tmplbl,tmp2,LBLMAXLEN); - tmp2[49] = NUL; - } - debug(F111,"GOTO s",s,y); - debug(F111,"GOTO tmplbl",tmplbl,j); - debug(F101,"GOTO empty",ckitoa(stopflg),empty); - - if (empty) { /* Empty target */ - z = (!strcmp(s,":") && /* String is empty */ - /* and Label is ":" or ":*"... */ - (!strcmp(tmplbl,":") || !strcmp(tmplbl,":*"))) - ? 0 : 1; - debug(F111,"GOTO","A",z); - } else if (stopflg) { - z = ckmatch(tmplbl,s,inpcas[cmdlvl],1) ? 0 : 1; - debug(F111,"GOTO","B",z); - } else { - z = (stopflg && inpcas[cmdlvl]) ? - strcmp(s,tmplbl) : - ckstrcmp(s,tmplbl,(y > j) ? y : j, 0); - debug(F111,"GOTO","C",z); - } - if (!z) { - break; - } else if (stopflg && - !ckstrcmp(":default",tmplbl,(8 > j) ? 8 : j, 0)) { - debug(F100,"GOTO DEFAULT","",0); - break; - } else { - flag = 0; - } - } - debug(F111,"GOTO macro i",cmd,i); - debug(F111,"GOTO macro m",cmd,m); - if (i >= m) { /* Didn't find the label */ - debug(F101,"GOTO failed cmdlvl","",cmdlvl); -#ifdef COMMENT - /* MOVED TO AFTER POPCLVL ABOUT 20 LINES DOWN 5 AUG 2002 */ - if (stopflg) - return(0); -#endif /* COMMENT */ - if ((maclvl > 0) && - (m_arg[maclvl-1][0]) && - (cmdstk[cmdlvl].src == CMD_MD) && - (!strncmp(m_arg[maclvl-1][0],"_xif",4) || - !strncmp(m_arg[maclvl-1][0],"_for",4) || - !strncmp(m_arg[maclvl-1][0],"_swi",4) || - !strncmp(m_arg[maclvl-1][0],"_whi",4))) { - dogta(XXPTA); /* Restore args */ - debug(F101,"GOTO in XIF/FOR/WHI/SWI popping","",cmdlvl); - popclvl(); /* Pop an extra level */ - } - debug(F101,"GOTO popping","",cmdlvl); - if (!popclvl()) { /* pop up to next higher level */ - printf("?Label '%s' not found\n",s); /* if none */ - return(0); /* Quit */ - } else if (stopflg) { /* SWITCH no case label match */ - return(0); /* and no DEFAULT lable. */ - } else { - continue; /* otherwise look again */ - } - } - debug(F110,"GOTO found macro label",tmplbl,0); - macp[maclvl] = lp; /* set macro buffer pointer */ - return(1); - } else if (cmdstk[cmdlvl].src == CMD_TF) { - x = 0; /* GOTO issued in take file */ - debug(F111,"GOTO in TAKE file",cmd,cx); - if (cx == XXGOTO) { /* If GOTO, but not FORWARD, */ - rewind(tfile[tlevel]); /* search file from beginning */ - tfline[tlevel] = 0; - } - while (! feof(tfile[tlevel])) { -#ifdef COMMENT -/* This is wrong - it lets us jump to labels inside inferior blocks */ - tfline[tlevel]++; - if (fgets(line,LINBUFSIZ,tfile[tlevel]) == NULL) /* Get line */ -#else - if (getnct(line,LINBUFSIZ,tfile[tlevel],0) < 0) -#endif /* COMMENT */ - break; /* If no more, done, label not found */ - lp = line; /* Got line */ - while (*lp == SP || *lp == HT) - lp++; /* Strip leading whitespace */ - if (*lp != ':') continue; /* Check for label introducer */ - while (*(lp+1) == SP) { /* Remove space between : and name */ - *(lp+1) = ':'; - lp++; /* Strip leading whitespace */ - } - tp = lp; /* Get end of word */ - j = 0; - while (*tp) { /* And null-terminate it */ - if (*tp < 33) { - *tp = NUL; - break; - } else tp++, j++; - } - if (!ckstrcmp(lp,s,(y > j) ? y : j,0)) { /* Caseless compare */ - x = 1; /* Got it */ - break; /* done. */ - } else if (stopflg && - !ckstrcmp(":default",tmplbl,(8 > j) ? 8 : j,0)) { - x = 1; - break; - } - } - if (x == 0) { /* If not found, print message */ - debug(F101,"GOTO failed at cmdlvl","",cmdlvl); - if (stopflg) - return(0); - if (!popclvl()) { /* pop up to next higher level */ - printf("?Label '%s' not found\n",s); /* if none */ - return(0); /* quit */ - } else continue; /* otherwise look again */ - } - return(x); /* Send back return code */ - } - } - printf("?Stack problem in GOTO %s\n",s); /* Shouldn't see this */ - return(0); -} -#endif /* NOSPL */ - -/* Finish parsing and do the IF, XIF, and WHILE commands */ - -#ifndef NOSPL - -/* C H K V A R -- Check (if it's a) Variable */ - - -#ifdef OLDCHKVAR -/* - Crude and disgusting, but needed for OS/2, DOS, and Windows, where filenames - have backslashes in them. How do we know if a backslash in a filename is a - directory separator, or if it's a Kermit backslash? This routine does a - rough syntax check of the next few characters and if it looks like it MIGHT - be a variable, then it tries to evaluate it, and if the result is not empty, - we say it's a variable, although sometimes it might not be -- some cases are - truly ambiguous. For example there might a DOS directory called \%a, and - we also have a variable with the same name. This is all for the sake of not - having to tell PC users that they have to double all backslashes in file - and directory names. -*/ -#else -/* - Somewhat less crude & disgusting. The previous method was nondeterministic - and (worse) it interfered with macro argument passing. So now we only - check the syntax of backslash-items to see if they are variables, but we - do NOT check their values. -*/ -#endif /* OLDCHKVAR */ -/* - Call with a string pointer pointing at the backslash of the purported - variable. Returns 1 if it has the syntax of a variable, 0 if not. -*/ -int -chkvar(s) char *s; { - int z = 0; /* Return code - assume failure. */ - if (!s) s = ""; /* Watch our for null pointers. */ - if (!*s) return(0); /* Empty arg so not a variable. */ - if (*s == CMDQ) { /* Object begins with backslash. */ - char c; - c = s[1]; /* Character following backslash. */ - if (c) { - int t = 0; - if (c == CMDQ) /* Quoted backslash */ - return(1); - c = (char) (islower(c) ? toupper(c) : c); /* Otherwise... */ - if (c == '%') { /* Simple variable */ -#ifdef OLDCHKVAR - t = 1; -#else - return(1); -#endif /* OLDCHKVAR */ - } else if (c == '&') { /* Array */ - if (!s[2]) return(0); - if (s[3] == '[') - t = ckindex("]",s,4,0,1); -#ifndef OLDCHKVAR - return((t > 0) ? 1 : 0); -#endif /* OLDCHKVAR */ - } else if (c == '$' || /* Environment variable */ - c == 'V' || /* Built-in variable */ - c == 'M') { /* Macro name */ - t = (s[2] == '('); -#ifndef OLDCHKVAR - return((t > 0) ? 1 : 0); -#endif /* OLDCHKVAR */ - } else if (c == 'F') { /* Function reference */ - /* Don't actually call it - it might have side effects */ - int x; - if ((x = ckindex("(",s,3,0,1))) /* Just check syntax */ - if ((x = ckindex(")",s,x,0,1))) - z = 1; - /* Insert a better syntax check here if necessary */ - } -#ifdef OLDCHKVAR - if (t) { - t = 255; /* This lets us test \v(xxx) */ - lp = line; /* and even \f...(xxx) */ - zzstring(s,&lp,&t); /* Evaluate it, whatever it is. */ - t = strlen(line); /* Get its length. */ - debug(F111,"chkvar",line,t); - z = t > 0; /* If length > 0, it's defined */ - } -#endif /* OLDCHKVAR */ - } - } - return(z); -} - -/* B O O L E X P -- Evaluate a Boolean expression */ - -#define BOOLLEN 1024 -static char boolval[BOOLLEN]; - -int -boolexp(cx) int cx; { - int x, y, z; char *s, *p; - int parens = 0, pcount = 0, ecount = 0; - char *q, *bx; - struct FDB kw, nu; -#ifdef FNFLOAT - struct FDB fl; - CKFLOAT f1 = 0.0, f2 = 0.0; - int f1flag = 0, f2flag = 0; -#endif /* FNFLOAT */ -#ifdef OS2 - extern int keymac; -#endif /* OS2 */ - - not = 0; /* Flag for whether "NOT" was seen */ - z = 0; /* Initial IF condition */ - ifargs = 0; /* Count of IF condition words */ - bx = boolval; /* Initialize boolean value */ - *bx = NUL; - - ifagain: - cmfdbi(&kw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "Number, numeric-valued variable, Boolean expression, or keyword", - "", /* default */ - "", /* addtl string data */ - nif, /* addtl numeric data 1: tbl size */ - 0, /* addtl numeric data 2: 4 = silent */ - xxstring, /* Processing function */ - iftab, /* Keyword table */ - &nu /* Pointer to next FDB */ - ); - cmfdbi(&nu, /* 2nd FDB - An integer */ - _CMNUM, /* fcode */ - "", /* hlpmsg */ - "", /* Default */ - "", /* addtl string data */ - 0, - 0, - xxstring, - NULL, -#ifdef FNFLOAT - &fl -#else - NULL -#endif /* FNFLOAT */ - ); -#ifdef FNFLOAT - cmfdbi(&fl, /* A floating-point number */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); -#endif /* FNFLOAT */ - x = cmfdb(&kw); /* Parse a keyword or a number */ - debug(F111,"boolval cmfdb","",x); - if (x < 0) { - if (x == -3) - x = -2; - return(x); - } - debug(F111,"boolval switch","",cmresult.fcode); - switch (cmresult.fcode) { /* What did we get? */ -#ifdef FNFLOAT - case _CMFLD: /* A "field" */ - if (isfloat(cmresult.sresult,0)) { /* A floating-point number? */ - f1 = floatval; /* Yes, get its value */ - f1flag = 1; /* remember we did this */ - ifc = 9999; /* Set special "if-code" */ - } else - return(-2); -#endif /* FNFLOAT */ - case _CMNUM: /* A number... */ - ifc = 9999; /* Set special "if-code" */ - break; - case _CMKEY: /* A keyword */ - ifc = cmresult.nresult; /* Get if-code */ - break; - default: - return(-2); - } - switch (ifc) { /* set z = 1 for true, 0 for false */ - case 9999: /* Number */ -#ifdef FNFLOAT - if (f1flag) { - z = (f1 == 0.0) ? 0 : 1; - } else -#endif /* FNFLOAT */ - z = (cmresult.nresult == 0) ? 0 : 1; - break; - case XXIFLP: /* Left paren */ - if (pcount == 0 && ifargs > 0) - return(-2); - parens = 1; - pcount++; - ifargs++; - *bx++ = '('; - goto ifagain; - case XXIFRP: /* Right paren */ - if (!parens) - return(-2); - if (--pcount < 0) - return(-2); - ifargs++; - *bx++ = ')'; - *bx = NUL; - if (pcount == 0) - goto ifend; - goto ifagain; - case XXIFAN: /* AND (&&) */ - ifargs++; - if (!ecount) - return(-2); - *bx++ = '&'; - goto ifagain; - case XXIFOR: /* OR (||) */ - ifargs++; - if (!ecount) - return(-2); - *bx++ = '|'; - goto ifagain; - case XXIFNO: /* IF NOT [ NOT [ NOT ... ] ] */ - if (bx > boolval) { /* evala() doesn't like cascaded */ - if (*(bx-1) == '!') { /* unary operators... */ - *(bx-1) = NUL; /* So here, two wrongs make a right. */ - bx--; - } else { - *bx++ = '!'; - } - } else { - *bx++ = '!'; - } - ifargs++; - goto ifagain; - case XXIFTR: /* IF TRUE */ - z = 1; - debug(F101,"if true","",z); - ifargs += 1; - break; - case XXIFNT: /* IF FALSE */ - z = 0; - debug(F101,"if true","",z); - ifargs += 1; - break; - case XXIFSU: /* IF SUCCESS */ - z = ( success != 0 ) ? 1 : 0; - debug(F101,"if success","",z); - ifargs += 1; - break; - case XXIFFA: /* IF FAILURE */ - z = ( success == 0 ) ? 1 : 0; - debug(F101,"if failure","",z); - ifargs += 1; - break; - - case XXIFDE: /* IF DEFINED */ - if ((x = cmfld("Macro or variable name","",&s,NULL)) < 0) - return((x == -3) ? -2 : x); - - if (*s == CMDQ) { - char * lp; - char line[256]; - int t, x; - if (*(s+1) == 'f' || *(s+1) == 'F') { /* Built-in function */ - extern struct keytab fnctab[]; - extern int nfuncs; - ckstrncpy(line,s+2,256); - if (line[0]) { - lp = ckstrchr(line,'('); - if (lp) *lp = NUL; - x = lookup(fnctab,line,nfuncs,&t); - z = x > -1; - } - debug(F111,"if defined function",line,z); - } else if (*(s+1) == 'v' || *(s+1) == 'V') { /* 8.0.200 */ - extern struct keytab vartab[]; - extern int nvars; - z = 0; - if (*(s+2) == '(') { - ckstrncpy(line,s+3,256); - if (line[0]) { - lp = ckstrchr(line,')'); - if (lp) *lp = NUL; - x = lookup(vartab,line,nvars,&t); - z = x > -1; - if (z) { /* 8.0.203 */ - int t; /* It must have a value to succeed */ - t = 255; /* as in C-Kermit 6.0 and 7.0 */ - lp = line; /* (this was broken in 8.0.200-201) */ - zzstring(s,&lp,&t); - t = strlen(line); - z = line[0] ? 1 : 0; - } - } - } - debug(F111,"if defined variable",line,z); - } else { - z = chkvar(s); /* Starts with backslash */ - if (z > 0) { /* Yes... */ - t = 255; /* than buffer so if zzstring fails */ - lp = line; /* check for that -- overflow means */ - line[0] = NUL; /* the quantity is defined. */ - x = zzstring(s,&lp,&t); - if ((x < 0 && t != 255) || !line[0]) - z = 0; - debug(F111,"if defined zzstring",line,z); - debug(F101,"if defined zzstring t","",t); - } - } - } else { - z = (mxlook(mactab,s,nmac) > -1); /* Look for exact match */ - } - debug(F111,"if defined final",s,z); - ifargs += 2; - break; - - case XXIFDC: { /* IF DECLARED */ - char * lp; - char line[32]; - int j, k, t, x; - if ((x = cmfld("Array name","",&s,NULL)) < 0) - return((x == -3) ? -2 : x); - if (*s == CMDQ) { - if (*(s+1) != '&') { - t = 31; - lp = line; - line[0] = NUL; - x = zzstring(s,&lp,&t); - s = line; - } - } - z = 0; - if ((x = arraybounds(s,&j,&k)) > -1) { - if (a_ptr[x]) { - if (j < 1) - z = 1; - else if (j <= a_dim[x]) - z = 1; - if (z == 1 && k > a_dim[x]) - z = 0; - } - } - break; - } - case XXIFBG: /* IF BACKGROUND */ - case XXIFFG: /* IF FOREGROUND */ - bgchk(); /* Check background status */ - if (ifc == XXIFFG) /* Foreground */ - z = pflag ? 1 : 0; - else z = pflag ? 0 : 1; /* Background */ - ifargs += 1; - break; - - case XXIFCO: /* IF COUNT */ - z = ( --count[cmdlvl] > 0 ); - if (cx == XXWHI) count[cmdlvl] += 2; /* Don't ask... */ - debug(F101,"if count","",z); - ifargs += 1; - break; - - case XXIFEX: /* IF EXIST */ -#ifdef CK_TMPDIR - case XXIFDI: /* IF DIRECTORY */ -#endif /* CK_TMPDIR */ - case XXIFAB: /* IF ABSOLUTE */ - if ((x = cmfld( - ((ifc == XXIFDI) ? "Directory name" : "File"), - "",&s, -#ifdef OS2 - NULL /* This allows \'s in filenames */ -#else - xxstring -#endif /* OS2 */ - )) < 0) { - if (x == -3) { - extern int cmflgs; - if (cmflgs == 1) { - printf("?File or directory name required\n"); - return(-9); - } - } else return(x); - } - s = brstrip(s); - if (ifc == XXIFAB) { - z = isabsolute(s); - } else if (ifc == XXIFEX) { - z = (zgetfs(s) > -1L); - debug(F101,"if exist 1","",z); -#ifdef OS2 - if (!z) { /* File not found. */ - int t; /* Try expanding variables */ - t = LINBUFSIZ-1; /* and looking again. */ - lp = line; - zzstring(s,&lp,&t); - s = line; - z = ( zchki(s) > -1L ); - debug(F101,"if exist 2","",z); - } -#endif /* OS2 */ -#ifdef CK_TMPDIR - } else { -#ifdef VMS - z = (zchki(s) == -2) -#else -/* Because this doesn't catch $DISK1:[FOO]BLAH.DIR;1 */ - z = isdir(s) -#ifdef OS2 - || (isalpha(s[0]) && s[1] == ':' && s[2] == NUL) -#endif /* OS2 */ -#endif /* VMS */ - ; - debug(F101,"if directory 1","",z); - - if (!z) { /* File not found. */ - int t; /* Try expanding variables */ - t = LINBUFSIZ-1; /* and looking again. */ - lp = line; - zzstring(s,&lp,&t); - s = line; - z = isdir(s) -#ifdef OS2 - || (isalpha(s[0]) && s[1] == ':' && s[2] == NUL) -#endif /* OS2 */ - ; - debug(F101,"if directory 2","",z); - } -#endif /* CK_TMPDIR */ - } - ifargs += 2; - break; - - case XXIFEQ: /* IF EQUAL (string comparison) */ - case XXIFLL: /* IF Lexically Less Than */ - case XXIFLG: /* If Lexically Greater Than */ - if ((x = cmfld("first word or variable name","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Text required\n"); - return(-9); - } else return(x); - } - s = brstrip(s); /* Strip braces */ - x = (int)strlen(s); - if (x > LINBUFSIZ-1) { - printf("?IF: strings too long\n"); - return(-2); - } - lp = line; /* lp points to first string */ - ckstrncpy(line,s,LINBUFSIZ); - if ((y = cmfld("second word or variable name","",&s,xxstring)) < 0) { - if (y == -3) { - printf("?Text required\n"); - return(-9); - } else return(y); - } - s = brstrip(s); - y = (int)strlen(s); - if (x + y + 2 > LINBUFSIZ) { - printf("?IF: strings too long\n"); - return(-2); - } - tp = lp + x + 2; /* tp points to second string */ - strcpy(tp,s); /* safe (checked) */ - x = ckstrcmp(lp,tp,-1,inpcas[cmdlvl]); /* Use longest length */ - switch (ifc) { - case XXIFEQ: /* IF EQUAL (string comparison) */ - z = (x == 0); - break; - case XXIFLL: /* IF Lexically Less Than */ - z = (x < 0); - break; - case XXIFLG: /* If Lexically Greater Than */ - z = (x > 0); - break; - } - debug(F101,"IF EQ result","",z); - ifargs += 3; - break; - - case XXIFVE: /* IF VERSION */ - case XXIFAE: /* IF (arithmetically) = */ - case XXIFNQ: /* IF != (not arithmetically equal) */ - case XXIFLT: /* IF < */ - case XXIFLE: /* IF <= */ - case XXIFGE: /* IF >= */ - case XXIFGT: { /* IF > */ - - /* Really should use longs here... */ - /* But cmnum parses ints. */ - int xx, n1 = 0, n2 = 0; - if (ifc == XXIFVE) { - n1 = (int) vernum; - } else { - x = cmfld("first number or variable name","",&s,xxstring); - if (x == -3) { - printf("?Quantity required\n"); - return(-9); - } - if (x < 0) return(x); - debug(F101,"xxifgt cmfld","",x); - ckstrncpy(line,s,LINBUFSIZ); - lp = brstrip(line); - debug(F110,"xxifgt exp1",lp,0); - -/* The following bit is for compatibility with old versions of MS-DOS Kermit */ - - if (!ckstrcmp(lp,"count",5,0)) { - n1 = count[cmdlvl]; - } else if (!ckstrcmp(lp,"version",7,0)) { - n1 = (int) vernum; - } else if (!ckstrcmp(lp,"argc",4,0)) { - n1 = (int) macargc[maclvl]; - } else { - -/* End of compatibility bit */ - -#ifdef FNFLOAT - if (isfloat(lp,0) > 1) { /* Allow floating-point comparisons */ - f1 = floatval; - f1flag = 1; - } else -#endif /* FNFLOAT */ - if (chknum(lp)) { - n1 = atoi(lp); - } else { /* Check for arithmetic expression */ - q = evala(lp); /* cmnum() does this but ... */ - if (chknum(q)) /* we're not using cmnum(). */ - n1 = atoi(q); - else - return(-2); - } - } - } - y = cmfld("number or variable name","",&s,xxstring); - if (y == -3) { - printf("?Quantity required\n"); - return(-9); - } - if (y < 0) return(y); - s = brstrip(s); - if (!*s) return(-2); - if (ifc == XXIFVE) { - tp = line; - } else { - x = (int)strlen(lp); - tp = line + x + 2; - } - ckstrncpy(tp,s,LINBUFSIZ-x-2); - debug(F110,"xxifgt exp2",tp,0); - if (!ckstrcmp(tp,"count",5,0)) { - n2 = count[cmdlvl]; - } else if (!ckstrcmp(tp,"version",7,0)) { - n2 = (int) vernum; - } else if (!ckstrcmp(tp,"argc",4,0)) { - n2 = (int) macargc[maclvl]; - } else { -#ifdef FNFLOAT - if (isfloat(tp,0) > 1) { - f2 = floatval; - f2flag = 1; - } else -#endif /* FNFLOAT */ - if (chknum(tp)) { - n2 = atoi(tp); - } else { - q = evala(tp); - if (chknum(q)) - n2 = atoi(q); - else - return(-2); - } - } - xx = (ifc == XXIFVE) ? XXIFGE : ifc; - -#ifdef FNFLOAT - if (f1flag && !f2flag) { - f2 = (CKFLOAT)n2; - f2flag = 1; - } - if (f2flag && !f1flag) - f1 = (CKFLOAT)n1; - if (f1flag) - z = ((f1 < f2 && xx == XXIFLT) - || (f1 != f2 && xx == XXIFNQ) - || (f1 <= f2 && xx == XXIFLE) - || (f1 == f2 && xx == XXIFAE) - || (f1 >= f2 && xx == XXIFGE) - || (f1 > f2 && xx == XXIFGT)); - else -#endif /* FNFLOAT */ - z = ((n1 < n2 && xx == XXIFLT) - || (n1 != n2 && xx == XXIFNQ) - || (n1 <= n2 && xx == XXIFLE) - || (n1 == n2 && xx == XXIFAE) - || (n1 >= n2 && xx == XXIFGE) - || (n1 > n2 && xx == XXIFGT)); - debug(F101,"xxifge z","",z); - if (ifc == XXIFVE) - ifargs += 2; - else - ifargs += 3; - break; - } - - case XXIFNU: /* IF NUMERIC */ - x = cmfld("variable name or constant","",&s,NULL); - if (x == -3) { - extern int cmflgs; - if (cmflgs == 1) { - printf("?Quantity required\n"); - return(-9); - } - } else if (x < 0) - return(x); - x = LINBUFSIZ-1; - lp = line; - zzstring(s,&lp,&x); - lp = line; - debug(F110,"xxifnu quantity",lp,0); - z = chknum(lp); -#ifdef COMMENT -/* - This works, but it's not wise -- IF NUMERIC is mostly used to see if a - string really does contain only numeric characters. If they want to force - evaluation, they can use \feval() on the argument string. -*/ - if (!z) { /* Not a number */ - x_ifnum = 1; /* Avoid "eval" error messages */ - q = evala(lp); /* Maybe it's an expression */ - z = chknum(q); /* that evaluates to a number */ - x_ifnum = 0; /* Put eval messages back to normal */ - if (z) debug(F110,"xxifnu exp",lp,0); - } -#endif /* COMMENT */ - debug(F101,"xxifnu chknum","",z); - ifargs += 2; - break; - -#ifdef ZFCDAT - case XXIFNE: { /* IF NEWER */ - char d1[20], * d2; /* Buffers for 2 dates */ - if ((z = cmifi("First file","",&s,&y,xxstring)) < 0) - return(z); - ckstrncpy(d1,zfcdat(s),20); - if ((z = cmifi("Second file","",&s,&y,xxstring)) < 0) - return(z); - d2 = zfcdat(s); - if ((int)strlen(d1) != 17 || (int)strlen(d2) != 17) { - printf("?Failure to get file date\n"); - return(-9); - } - debug(F110,"xxifnewer d1",d1,0); - debug(F110,"xxifnewer d2",d2,0); - z = (strcmp(d1,d2) > 0) ? 1 : 0; - debug(F101,"xxifnewer","",z); - ifargs += 2; - break; - } -#endif /* ZFCDAT */ - -#ifdef CK_IFRO - case XXIFRO: /* REMOTE-ONLY advisory */ - ifargs++; -#ifdef NOLOCAL - z = 1; -#else - z = remonly; -#endif /* NOLOCAL */ - break; -#endif /* CK_IFRO */ - - case XXIFAL: /* ALARM */ - ifargs++; - debug(F101,"IF ALARM ck_alarm","",ck_alarm); - debug(F110,"IF ALARM alrm_date",alrm_date,0); - debug(F110,"IF ALARM alrm_time",alrm_time,0); - - if (ck_alarm < 1L || alrm_date[0] < '0' || alrm_time[0] < '0') { - z = 0; /* ALARM not SET */ - break; /* so IF ALARM fails */ - } - /* Get current date and time */ - ckstrncpy(tmpbuf,ckcvtdate("",1),TMPBUFSIZ); - s = tmpbuf; - s[8] = NUL; - z = (int) strncmp(tmpbuf,alrm_date,8); /* Compare dates */ - debug(F101,"IF ALARM date z","",z); - if (z == 0) { /* Dates are the same */ - /* Compare times */ - z = (tod2sec(tmpbuf+9) >= atol(alrm_time)) ? 1 : -1; - debug(F101,"IF ALARM time z","",z); - } - tmpbuf[0] = NUL; /* z >= 0 if alarm is passed */ - z = ((z >= 0) ? 1 : 0); /* z < 0 otherwise */ - debug(F101,"IF ALARM final z","",z); - break; - - case XXIFOP: /* IF OPEN */ - if ((x = cmkey(iotab,niot,"file or log","",xxstring)) < 0) - return(x); - if (x == 9999 || x == ZSTDIO) { - bgchk(); /* Check background status */ - z = pflag ? 1 : 0; - } else if (x == 8888) { - z = local ? ttchk() > -1 : 0; -#ifdef CKLOGDIAL - } else if (x == 7777) { - extern int dialog; - z = dialog ? 1 : 0; -#endif /* CKLOGDIAL */ - } else - z = (chkfn(x) > 0) ? 1 : 0; - ifargs += 1; - break; - - case XXIFSD: /* Started-From-Dialer */ -#ifdef OS2 - z = StartedFromDialer; -#else - z = 0; -#endif /* OS2 */ - break; - - case XXIFTM: /* Terminal-Macro */ -#ifdef OS2 - z = cmdstk[cmdlvl].ccflgs & CF_KMAC; -#else - z = 0; -#endif /* OS2 */ - break; - - case XXIFEM: /* Emulation is active */ -#ifdef OS2 - z = 1; -#else - z = 0; -#endif /* OS2 */ - break; - - case XXIFIK: /* Running as IKSD? */ - z = inserver; - break; - - case XXIFTA: /* Connection is TAPI */ - z = 0; -#ifndef NODIAL -#ifdef CK_TAPI - if (local && !network && tttapi) - z = 1; -#endif /* CK_TAPI */ -#endif /* NODIAL */ - break; - - case XXIFMA: /* IF MATCH */ - x = cmfld("String or variable","",&s,xxstring); - if (x == -3) { - extern int cmflgs; - if (cmflgs == 1) { - printf("?String required\n"); - return(-9); - } - } else if (x < 0) - return(x); - ckstrncpy(line,s,LINBUFSIZ); - s = brstrip(line); - debug(F110,"xxifma string",line,0); - x = cmfld("Pattern","",&p,xxstring); - if (x == -3) { - extern int cmflgs; - if (cmflgs == 1) { - printf("?Pattern required\n"); - return(-9); - } - } else if (x < 0) - return(x); - ckstrncpy(tmpbuf,p,TMPBUFSIZ); - p = brstrip(tmpbuf); - debug(F110,"xxifma pattern",tmpbuf,0); - z = ckmatch(p,s,inpcas[cmdlvl],1); - break; - - case XXIFFL: { /* IF FLAG */ - extern int ooflag; - z = ooflag; - break; - } - case XXIFAV: { /* IF AVAILABLE */ - if ((x = cmkey(availtab,availtabn,"","",xxstring)) < 0) - return(x); - switch (x) { - case AV_KRB4: - z = ck_krb4_is_installed(); - break; - case AV_KRB5: - z = ck_krb5_is_installed(); - break; - case AV_SRP: - z = ck_srp_is_installed(); - break; - case AV_SSL: - z = ck_ssleay_is_installed(); - break; - case AV_NTLM: - z = ck_ntlm_is_installed(); - break; - case AV_CRYPTO: - z = ck_crypt_is_installed(); - break; - case AV_SSH: - z = ck_ssh_is_installed(); - break; - default: - z = 0; - } - break; - } - case XXIFAT: /* IF ASKTIMEOUT */ - z = asktimedout; - break; - - case XXIFRD: /* IF READABLE */ - case XXIFWR: /* IF WRITEABLE */ - if ((x = cmfld("File or directory name", - "", - &s, -#ifdef OS2 - NULL /* This allows \'s in filenames */ -#else - xxstring -#endif /* OS2 */ - )) < 0) { - if (x == -3) { - extern int cmflgs; - if (cmflgs == 1) { - printf("?File or directory name required\n"); - return(-9); - } - } else return(x); - } - s = brstrip(s); -/* - zchk[io]() do not do what we want here for directories, so we set - a global flag telling it to behave specially in this case. Othewise - we'd have to change the API and change all ck?fio.c modules accordingly. -*/ - y = 0; /* Try-again control */ -#ifdef OS2 - ifrdagain: -#endif /* OS2 */ - if (ifc == XXIFRD) { /* IF READABLE */ - zchkid = 1; - z = zchki(s) > -1; - zchkid = 0; - } else if (ifc == XXIFWR) { /* IF WRITEABLE */ - zchkod = 1; - z = zchko(s) > -1; - zchkod = 0; - } -#ifdef OS2 - if (!z && !y) { /* File not found. */ - int t; /* Try expanding variables */ - t = LINBUFSIZ-1; /* and looking again. */ - lp = line; - zzstring(s,&lp,&t); - s = line; - z = zchko(s) > -1; - y++; - goto ifrdagain; - } -#endif /* OS2 */ - ifargs += 2; - break; - case XXIFQU: /* IF QUIET */ - z = quiet ? 1 : 0; - debug(F101,"if quiet","",z); - ifargs += 1; - break; - - case XXIFWI: /* WILD */ - if ((x = cmfld("File specification","",&s,xxstring)) < 0) return(x); - z = iswild(s); - break; - - case XXIFCK: /* C-KERMIT */ -#ifdef OS2 - z = 0; -#else - z = 1; -#endif /* OS2 */ - break; - - case XXIFK9: /* K-95 */ -#ifdef OS2 - z = 1; -#else - z = 0; -#endif /* OS2 */ - break; - - case XXIFGU: /* GUI */ -#ifdef KUI - z = 1; -#else - z = 0; -#endif /* KUI */ - break; - - case XXIFMS: /* MS-KERMIT */ - z = 0; - break; - - case XXIFLO: /* IF LOCAL */ - z = local ? 1 : 0; - break; - - case XXIFCM: { /* IF COMMAND */ - extern struct keytab cmdtab[]; - extern int ncmd; - if ((x = cmfld("Word","",&s,xxstring)) < 0) - return(x); - z = lookup(cmdtab,s,ncmd,&y); - z = (z == -2 || z > -1) ? 1 : 0; - break; - } -#ifdef CKFLOAT - case XXIFFP: /* IF FLOAT */ - if ((x = cmfld("Number","",&s,xxstring)) < 0) - if (x != -3) /* e.g. empty variable */ - return(x); - z = isfloat(s,0); - break; -#endif /* CKFLOAT */ - - case XXIFKB: /* KBHIT */ - z = conchk(); - if (z < 0) z = 0; - if (z > 1) z = 1; - break; - - case XXIFKG: { /* KERBANG */ - extern int cfilef; - z = (xcmdsrc == 0) ? 0 : cfilef; - break; - } - - default: /* Shouldn't happen */ - return(-2); - } /* end of switch */ - - if (z) - *bx++ = '1'; - else - *bx++ = '0'; - *bx = NUL; - if (bx > boolval + BOOLLEN - 2) { - printf("?Boolean expression too long"); - return(-9); - } - ecount++; /* Expression counter */ - debug(F101,"boolexp parens","",parens); - debug(F101,"boolexp pcount","",pcount); - if (parens && pcount > 0) - goto ifagain; - - ifend: /* No more - done */ - *bx = NUL; - z = atoi(evalx(boolval)); - debug(F111,"boolexp boolval",boolval,z); - return(z); -} - -/* D O I F -- Do the IF command */ - -int -doif(cx) int cx; { - int x, y, z; char *s, *p; - char *q; -#ifdef OS2 - extern int keymac; -#endif /* OS2 */ - - debug(F101,"doif cx","",cx); - - z = boolexp(cx); /* Evaluate the condition(s) */ - debug(F010,"doif cmdbuf",cmdbuf,0); - debug(F101,"doif boolexp","",z); - if (z < 0) - return(z); - - if (cx == XXIF) { /* Allow IF to have XIF semantics. */ - char * p; - p = cmpeek(); - if (!p) p = ""; - while (*p) { - if (*p == SP || *p == HT) - p++; - else - break; - } - if (*p == '{') - cx = XXIFX; - } - switch (cx) { /* Separate handling for IF and XIF */ - - case XXASSER: /* And ASSERT */ - if ((x = cmcfm()) < 0) - return(x); - return(success = z); - - case XXIF: /* This is IF... */ - ifcmd[cmdlvl] = 1; /* We just completed an IF command */ - debug(F101,"doif condition","",z); - if (z) { /* Condition is true */ - iftest[cmdlvl] = 1; /* Remember that IF succeeded */ - if (maclvl > -1) { /* In macro, */ - pushcmd(NULL); /* save rest of command. */ - } else if (tlevel > -1) { /* In take file, */ - debug(F100, "doif: pushing command", "", 0); - pushcmd(NULL); /* save rest of command. */ - } else { /* If interactive, */ - cmini(ckxech); /* just start a new command */ - printf("\n"); /* (like in MS-DOS Kermit) */ - if (pflag) prompt(xxstring); - } - } else { /* Condition is false */ - iftest[cmdlvl] = 0; /* Remember command failed. */ - if ((y = cmtxt("command to be ignored","",&s,NULL)) < 0) - return(y); /* Gobble up rest of line */ - } - return(0); - - case XXIFX: { /* This is XIF (Extended IF) */ - char *p; - char e[5]; - int i; - if ((y = cmtxt("Object command","",&s,NULL)) < 0) - return(y); /* Get object command. */ - p = s; - lp = line; - debug(F110,"doif THEN part",s,-54); - if (litcmd(&p,&lp,LINBUFSIZ - 1) < 0) { /* Quote THEN-part */ - return(-2); - } - debug(F111,"doif THEN part 2",line,z); - - while (*p == SP) p++; /* Strip trailing spaces */ - ifcmd[cmdlvl] = 0; /* Assume ELSE part in same line */ - iftest[cmdlvl] = z ? 1 : 0; - if (*p) { /* At end? */ - if (!z) { /* No, use ELSE-part, if any */ - for (i = 0; i < 4; i++) e[i] = *p++; - if (ckstrcmp(e,"else",4,0)) /* See if we have an ELSE */ - return(-2); /* Something else - error. */ - debug(F010,"doif ELSE line 1",p,0); - while (*p == SP) p++; /* Skip spaces */ - if (*p != '{') { /* Brace ELSE part if necessary */ - ckmakmsg(tmpbuf,TMPBUFSIZ,"{",p," }",NULL); - p = tmpbuf; - debug(F010,"doif ELSE line 2",p,0); - } - lp = line; /* Write over THEN part... */ - *lp = NUL; /* with ELSE part. */ - if (litcmd(&p,&lp,LINBUFSIZ - 2) < 0) { - return(-2); - } - while (*p == SP) p++; /* Strip trailing spaces */ - if (*p) return(-2); /* Should be nothing here. */ - debug(F010,"doif ELSE line 3",line,0); - } - } else { /* At end, treat like an IF command */ - if (!z) line[0] = NUL; /* Condition not true and no ELSE */ - ifcmd[cmdlvl] = 1; /* Allow ELSE on next line */ - debug(F101,"IF condition","",z); - } - if (line[0]) { - x = mlook(mactab,"_xif",nmac); /* Get index of "_xif" macro. */ - if (x < 0) { /* Not there? */ - addmmac("_xif",xif_def); /* Put it back. */ - if (mlook(mactab,"_xif",nmac) < 0) { /* Look it up again. */ - printf("?XIF macro gone!\n"); - return(success = 0); - } - } - dodo(x,line,cmdstk[cmdlvl].ccflgs | CF_IMAC); - } - return(0); - } - case XXWHI: { /* WHILE Command */ - p = cmdbuf; /* Capture IF condition */ - ifcond[0] = NUL; /* from command buffer */ - while (*p == SP) p++; - while (*p != SP) p++; - ifcp = ifcond; - ifcp += ckstrncpy(ifcp,"{ \\flit(if ( not ",IFCONDLEN); -#ifdef COMMENT -/* - This doesn't work because it breaks on the first left brace, which does - not necessarily start the command list, e.g. "while equal \%a {\35}". -*/ - while (*p != '{' && *p != NUL) *ifcp++ = *p++; - p = " ) goto _..bot) } "; - while (*ifcp++ = *p++) ; -#else -/* - The command parser sets cmbptr to the spot where it left off parsing in - the command buffer. -*/ - { - extern char * cmbptr; - if (cmbptr) { - while (p < cmbptr && *p != NUL) - *ifcp++ = *p++; - p = " ) goto _..bot) } "; - while ((*ifcp++ = *p++)) ; - } else { - printf("?Internal error parsing WHILE condition\n"); - return(-9); - } - } -#endif /* COMMENT */ - - debug(F110,"WHILE cmd",ifcond,0); - - if ((y = cmtxt("Object command","",&s,NULL)) < 0) - return(y); /* Get object command. */ - p = s; - lp = line; - if (litcmd(&p,&lp,LINBUFSIZ - 2) < 0) { /* Quote object command */ - return(-2); - } - debug(F101,"WHILE body",line,-54); - if (line[0]) { - char *p; - x = mlook(mactab,"_while",nmac); /* index of "_while" macro. */ - if (x < 0) { /* Not there? */ - addmmac("_while",whil_def); /* Put it back. */ - if (mlook(mactab,"_while",nmac) < 0) { /* Look it up again */ - printf("?WHILE macro definition gone!\n"); - return(success = 0); - } - } - p = malloc((int)strlen(ifcond) + (int)strlen(line) + 2); - if (p) { - strcpy(p,ifcond); /* safe (prechecked) */ - strcat(p,line); /* safe (prechecked) */ - debug(F010,"WHILE dodo",p,0); - dodo(x,p,cmdstk[cmdlvl].ccflgs | CF_IMAC); - free(p); - p = NULL; - } else { - printf("?Can't allocate storage for WHILE command"); - return(success = 0); - } - } - return(0); - } - default: - return(-2); - } -} -#endif /* NOSPL */ - -/* Set up a TAKE command file */ - -int -dotake(s) char *s; { -#ifndef NOSPL - extern int tra_cmd; -#endif /* NOSPL */ -#ifndef NOLOCAL -#ifdef OS2 - extern int term_io; - int term_io_sav = term_io; -#endif /* OS2 */ -#endif /* NOLOCAL */ - int slen; - - debug(F110,"dotake",s,0); - if (!s) s = ""; - if (!*s) return(success = 0); - slen = strlen(s); - debug(F101,"dotake len","",slen); - - if ((tfile[++tlevel] = fopen(s,"r")) == NULL) { - perror(s); - debug(F110,"dotake fail",s,0); - tlevel--; - return(success = 0); - } else { - tfline[tlevel] = 0; /* Line counter */ -#ifdef VMS - conres(); /* So Ctrl-C will work */ -#endif /* VMS */ -#ifndef NOLOCAL -#ifdef OS2 - term_io = 0; /* Disable Terminal Emulator I/O */ -#endif /* OS2 */ -#endif /* NOLOCAL */ -#ifndef NOSPL - cmdlvl++; /* Entering a new command level */ - debug(F111,"CMD +F",s,cmdlvl); - debug(F101,"dotake cmdlvl","",cmdlvl); - debug(F101,"dotake tlevel","",tlevel); - if (cmdlvl > CMDSTKL) { - debug(F100,"dotake stack overflow","",0); - cmdlvl--; - debug(F111,"CMD*-F",s,cmdlvl); - fclose(tfile[tlevel--]); - printf("?TAKE files and/or DO commands nested too deeply\n"); - return(success = 0); - } - if (tfnam[tlevel]) { /* Copy the filename */ - free(tfnam[tlevel]); - tfnam[tlevel] = NULL; - } - if ((tfnam[tlevel] = malloc(strlen(s) + 1))) { - strcpy(tfnam[tlevel],s); /* safe */ - } else { - printf("?Memory allocation failure\n"); - return(success = 0); - } - ifcmd[cmdlvl] = 0; /* Set variables for this cmd file */ - iftest[cmdlvl] = 0; - count[cmdlvl] = count[cmdlvl-1]; /* Inherit this */ - intime[cmdlvl] = intime[cmdlvl-1]; /* Inherit this */ - inpcas[cmdlvl] = inpcas[cmdlvl-1]; /* Inherit this */ - takerr[cmdlvl] = takerr[cmdlvl-1]; /* Inherit this */ - merror[cmdlvl] = merror[cmdlvl-1]; /* Inherit this */ - xquiet[cmdlvl] = quiet; - xcmdsrc = CMD_TF; - cmdstk[cmdlvl].src = CMD_TF; /* Say we're in a TAKE file */ - cmdstk[cmdlvl].lvl = tlevel; /* nested at this level */ - cmdstk[cmdlvl].ccflgs = cmdstk[cmdlvl-1].ccflgs; -#else - takerr[tlevel] = takerr[tlevel-1]; /* Inherit this */ -#endif /* NOSPL */ - } -#ifndef NOSPL - if (tra_cmd) - printf("[%d] +F: \"%s\"\n",cmdlvl,s); -#endif /* NOSPL */ -#ifndef NOLOCAL -#ifdef OS2 - term_io = term_io_sav; -#endif /* OS2 */ -#endif /* NOLOCAL */ - return(1); -} -#endif /* NOICP */ diff --git a/.pc/030_fix-if-else.patch/ckuusr.c b/.pc/030_fix-if-else.patch/ckuusr.c deleted file mode 100644 index 8545f89..0000000 --- a/.pc/030_fix-if-else.patch/ckuusr.c +++ /dev/null @@ -1,13121 +0,0 @@ -#ifdef SSHTEST -#define SSHBUILTIN -#endif /* SSHTEST */ - -#include "ckcsym.h" -char *userv = "User Interface 8.0.278, 12 Mar 2004"; - -/* C K U U S R -- "User Interface" for C-Kermit (Part 1) */ - -/* - Authors: - Frank da Cruz , - The Kermit Project, Columbia University, New York City - Jeffrey E Altman - Secure Endpoints Inc., New York City - - Copyright (C) 1985, 2004, - Trustees of Columbia University in the City of New York. - All rights reserved. See the C-Kermit COPYING.TXT file or the - copyright text in the ckcmai.c module for disclaimer and permissions. -*/ - -/* - Originally the entire user interface was in one module, ckuusr.c. Over - the years it has been split into many modules: ckuus2.c, ckuus3.c, ..., - ckuus7.c. ckuus2.c contains the HELP command parser and help-text strings; - ckuusy.c contains the UNIX-style command-line interface; ckuusx.c contains - routines needed by both the command-line interface and the interactive - command parser. -*/ - -/* - The ckuus*.c modules depend on the existence of C library features like - fopen, fgets, feof, (f)printf, argv/argc, etc. Other functions that are - likely to vary among different platforms -- like setting terminal modes or - interrupts -- are invoked via calls to functions that are defined in the - system- dependent modules, ck?[ft]io.c. The command line parser processes - any arguments found on the command line, as passed to main() via argv/argc. - The interactive parser uses the facilities of the cmd package (developed for - this program, but usable by any program). Any command parser may be - substituted for this one. The only requirements for the Kermit command - parser are these: - - . Set parameters via global variables like duplex, speed, ttname, etc. See - ckmain.c for the declarations and descriptions of these variables. - - . If a command can be executed without the use of Kermit protocol, then - execute the command directly and set the variable sstate to 0. Examples - include 'set' commands, local directory listings, the 'connect' command. - - . If a command requires the Kermit protocol, set the following variables: - - sstate string data - 'x' (enter server mode) (none) - 'r' (send a 'get' command) cmarg, cmarg2 - 'v' (enter receive mode) cmarg2 - 'g' (send a generic command) cmarg - 's' (send files) nfils, cmarg & cmarg2 OR cmlist - 'c' (send a remote host command) cmarg - - cmlist is an array of pointers to strings. - cmarg, cmarg2 are pointers to strings. - nfils is an integer. - - cmarg can be a filename string (possibly wild), or - a pointer to a prefabricated generic command string, or - a pointer to a host command string. - cmarg2 is an "as-name" - the name to send file(s) under, or - the name under which to store incoming file(s); must not be wild. - A null or empty value means to use the file's own name. - cmlist is a list of filenames, such as passed via argv. - nfils is an integer, interpreted as follows: - -1: filespec (possibly wild) in cmarg, must be expanded internally. - 0: send from stdin (standard input). - >0: number of files to send, from cmlist. - - The screen() function is used to update the screen during file transfer. - The tlog() function writes to a transaction log. - The debug() function writes to a debugging log. - The intmsg() and chkint() functions provide the user i/o for interrupting - file transfers. -*/ - -/* Includes */ - -#ifdef MULTINET -#define MULTINET_OLD_STYLE /* Leave select prototype undefined */ -#endif /* MULTINET */ - -#include "ckcdeb.h" -#include "ckcasc.h" -#include "ckcker.h" -#include "ckcnet.h" /* Network symbols */ -#include "ckuusr.h" -#include "ckcxla.h" - -int g_fncact = -1; /* Needed for NOICP builds */ -int noinit = 0; /* Flag for skipping init file */ -int nscanfile = SCANFILEBUF; - -int rcdactive = 0; /* RCD active */ -int keepallchars = 0; /* See cmfld() */ - -int locus = 1; /* Current LOCUS is LOCAL */ -#ifdef OS2 -int autolocus = 2; /* Automatic LOCUS switching: ASK */ -#else /* OS2 */ -int autolocus = 1; /* Automatic LOCUS switching enabled */ -#endif /* OS2 */ - -#ifndef NOICP -#ifdef CKLEARN -#ifdef VMS -#include /* For CKLEARN */ -#endif /* VMS */ -#endif /* CKLEARN */ -#ifdef OS2 -#ifndef NT -#define INCL_NOPM -#define INCL_VIO /* Needed for ckocon.h */ -#include -#undef COMMENT -#else -#define APIRET ULONG -#include -#include -#include "cknwin.h" -#include "ckntap.h" /* CK_TAPI definition */ -#endif /* NT */ -#include "ckowin.h" -#include "ckocon.h" -extern int tcp_avail; -extern bool viewonly; -extern int k95stdout; -extern int tt_scroll; -#ifndef NOTERM -extern tt_status[VNUM]; -#endif /* NOTERM */ -int display_demo = 1; -#include "ckossh.h" -#ifdef KUI -#include "ikui.h" -#endif /* KUI */ -#endif /* OS2 */ - -int optlines = 0; -int didsetlin = 0; - -#ifdef NEWFTP -extern int ftpget, ftpisopen(), doftpres(); -_PROTOTYP(int doftptyp,(int)); -#endif /* NEWFTP */ - -#ifdef VMS -extern int batch; -#endif /* VMS */ - -#ifdef datageneral -#include -#define fgets(stringbuf,max,fd) dg_fgets(stringbuf,max,fd) -#endif /* datageneral */ - -extern int xcmdsrc, hints, cmflgs, whyclosed; - -char * hlptok = NULL; - -#ifdef CK_TTGWSIZ /* Whether to use more-prompting */ -int xaskmore = 1; /* Momentary setting */ -int saveask = 1; /* Permanent setting */ -#else -int xaskmore = 0; -int saveask = 0; -#endif /* CK_TTGWSIZ */ - -#ifndef NOCSETS -extern int nfilc; -extern struct keytab fcstab[]; -extern int fcharset; -#endif /* NOCSETS */ - -char * g_pswd = NULL; -int g_pcpt = -1; -int g_pflg = -1; - -extern int cmd_rows, cmd_cols; - -#ifdef CKROOT -extern int ckrooterr; -#endif /* CKROOT */ - -extern int inserver, filepeek; - -#ifdef CKLEARN -FILE * learnfp = NULL; -char * learnfile = NULL; -int learning = 0; -#endif /* CKLEARN */ - -#ifndef NOXFER -extern int atcapr, atdiso, nfils, moving, protocol, sendmode, epktflg, size, - sndsrc, server, displa, fncnv, fnspath, fnrpath, xfermode, urpsiz, - spsizf, spsiz, spsizr, spmax, wslotr, prefixing, fncact, reliable, - setreliable; - -#ifdef IKSDCONF -extern int iksdcf; -#endif /* IKSDCONF */ - -#ifdef CK_LOGIN -extern int isguest; -#endif /* CK_LOGIN */ - -extern long sendstart; - -extern char *cmarg, *cmarg2, **cmlist, *dftty; - -extern struct keytab fntab[]; extern int nfntab; -extern struct ck_p ptab[NPROTOS]; - -int sndcmd = 0; /* Last command was a SEND-class command. */ - -int g_xfermode = -1; -int g_proto = -1; -int g_urpsiz = -1; -int g_spsizf = -1; -int g_spsiz = -1; -int g_spsizr = -1; -int g_spmax = -1; -int g_wslotr = -1; -int g_prefixing = -1; -int g_fncnv = -1; -int g_fnspath = -1; -int g_fnrpath = -1; -int g_fnact = -1; -int g_displa = -1; -int g_spath = -1; -int g_rpath = -1; -char * g_sfilter = NULL; -char * g_rfilter = NULL; - -extern int patterns; -#ifdef PATTERNS -extern char *txtpatterns[], *binpatterns[]; -int g_patterns = -1; -#endif /* PATTERNS */ -int g_skipbup = -1; - -#ifdef PIPESEND -extern int usepipes, pipesend; -extern char * sndfilter; -#endif /* PIPESEND */ - -#ifndef NOSPL -extern int sndxlo, sndxhi, sndxin; -#endif /* NOSPL */ - -extern char fspec[]; /* Most recent filespec */ -extern int fspeclen; /* Length of fspec[] buffer */ - -#ifndef NOFRILLS -extern int rmailf; /* MAIL command items */ -extern char optbuf[]; -#endif /* NOFRILLS */ - -extern int - en_cpy, en_cwd, en_del, en_dir, en_fin, en_get, en_bye, en_mai, en_pri, - en_hos, en_ren, en_sen, en_spa, en_set, en_typ, en_who, en_ret, en_xit, - en_mkd, en_rmd, en_asg; - -#ifndef NOMSEND /* Multiple SEND */ -extern char *msfiles[]; -int filesinlist = 0; /* And ADD ... */ -extern struct filelist * filehead; -extern struct filelist * filetail; -extern struct filelist * filenext; -extern int addlist; -#endif /* NOMSEND */ - -static struct keytab addtab[] = { -#ifdef PATTERNS - { "binary-patterns", ADD_BIN, 0 }, -#endif /* PATTERNS */ -#ifndef NOMSEND - { "send-list", ADD_SND, 0 }, -#endif /* NOMSEND */ -#ifdef PATTERNS - { "text-patterns", ADD_TXT, 0 }, -#endif /* PATTERNS */ - { "", 0, 0 } -}; -static int naddtab = sizeof(addtab)/sizeof(struct keytab) - 1; - -#ifndef NOCSETS -struct keytab assoctab[] = { - { "file-character-set", ASSOC_FC, 0 }, - { "transfer-character-set", ASSOC_TC, 0 }, - { "xfer-character-set", ASSOC_TC, CM_INV } -}; -static int nassoc = sizeof(assoctab)/sizeof(struct keytab); -extern int afcset[MAXFCSETS+1]; /* Character-set associations */ -extern int axcset[MAXTCSETS+1]; -#endif /* NOCSETS */ - -#ifndef ADDCMD -#ifndef NOMSEND -#define ADDCMD -#endif /* NOMSEND */ -#ifndef ADDCMD -#ifdef PATTERNS -#define ADDCMD -#endif /* PATTERNS */ -#endif /* ADDCMD */ -#endif /* ADDCMD */ -#endif /* NOXFER */ - -/* External Kermit Variables, see ckmain.c for description. */ - -extern xx_strp xxstring; -extern long xvernum; - -extern int local, xitsta, binary, msgflg, escape, duplex, quiet, tlevel, - pflag, zincnt, ckxech, carrier, what, nopush, haveline, bye_active; -#ifdef TNCODE -extern int debses; -extern char tn_msg[]; -#endif /* TNCODE */ - -int sleepcan = 1; -int g_binary = -1; -int g_recursive = -1; -int g_matchdot = -1; -extern int nolinks; - -extern long vernum; -extern char *versio, *copyright[]; -extern char *ckxsys; -#ifndef NOHELP -extern char *introtxt[]; -extern char *newstxt[]; -#endif /* NOHELP */ - -#ifndef OS2 -#ifndef UNIX -extern char *PWDCMD; -#endif /* UNIX */ -extern char *WHOCMD; -#endif /* OS2 */ - -extern char ttname[]; - -extern CHAR sstate; - -extern int network; /* Have active network connection */ -extern int nettype; /* Type of network */ -extern int ttnproto; /* NET_TCPB protocol */ - -#ifndef NODIAL -extern int dialsta, dialatmo, dialcon, dialcq; /* DIAL status, etc. */ -#endif /* NODIAL */ - -#ifdef CK_APC -extern int apcactive, apcstatus; -#endif /* CK_APC */ - -#ifndef NOPUSH -#ifndef NOFRILLS -extern char editor[]; -extern char editopts[]; -extern char editfile[]; -#endif /* NOFRILLS */ -#endif /* NOPUSH */ - -#ifdef BROWSER -extern char browser[]; /* Web browser application */ -extern char browsopts[]; /* Web browser options */ -extern char browsurl[]; /* Most recent URL */ -#endif /* BROWSER */ -#ifndef NOFTP -char ftpapp[CKMAXPATH+1] = { NUL, NUL }; /* ftp executable */ -char ftpopts[128] = { NUL, NUL }; /* ftp command-line options */ -#endif /* NOFTP */ -extern struct keytab onoff[]; /* On/Off keyword table */ - -#ifdef CK_TMPDIR -int f_tmpdir = 0; /* Directory changed temporarily */ -char savdir[TMPDIRLEN]; /* For saving current directory */ -#endif /* CK_TMPDIR */ - -int activecmd = -1; /* Keyword index of active command */ -int doconx = -1; /* CONNECT-class command active */ -int ooflag = 0; /* User-settable on/off flag */ - -int rcflag = 0; /* Pointer to home directory string */ -int repars, /* Reparse needed */ - techo = 0; /* Take echo */ -int secho = 1; /* SCRIPT echo */ - -int xitwarn = /* Warn about open connection on exit */ -#ifdef NOWARN -0 -#else -1 -#endif /* NOWARN */ -; - -struct keytab onoffsw[] = { - { "/off", 0, 0 }, - { "/on", 1, 0 } -}; - -#ifdef CKEXEC -struct keytab redirsw[] = { - { "/redirect", 1, 0 } -}; -#endif /* CKEXEC */ - -#ifndef NOXMIT -/* Variables for TRANSMIT command */ - -int xmitx = 1; /* Whether to echo during TRANSMIT */ -int xmitf = 0; /* Character to fill empty lines */ -int xmitl = 0; /* 0 = Don't send linefeed too */ -int xmitp = LF; /* Host line prompt */ -int xmits = 0; /* Use shift-in/shift-out, 0 = no */ -int xmitw = 0; /* Milliseconds to pause during TRANSMIT */ -int xmitt = 1; /* Seconds to wait for each char to echo */ -int xmita = 1; /* Action upon timeout */ - -#define XMI_BIN 1 -#define XMI_TXT 2 -#define XMI_CMD 3 -#define XMI_TRA 4 -#define XMI_VRB 5 -#define XMI_QUI 6 -#define XMI_NOW 7 -#define XMI_NOE 8 - -static struct keytab xmitsw[] = { /* TRANSMIT command options */ - { "/binary", XMI_BIN, 0 }, -#ifdef PIPESEND - { "/command", XMI_CMD, CM_INV|CM_PSH }, -#endif /* PIPESEND */ - { "/noecho", XMI_NOE, 0 }, - { "/nowait", XMI_NOW, 0 }, -#ifdef PIPESEND - { "/pipe", XMI_CMD, 0 }, -#endif /* PIPESEND */ -#ifdef COMMENT - { "/quiet", XMI_QUI, 0 }, -#endif /* COMMENT */ - { "/text", XMI_TXT, 0 }, - { "/transparent", XMI_TRA, 0 }, -#ifdef COMMENT - { "/verbose", XMI_VRB, 0 }, -#endif /* COMMENT */ - { "", 0, 0 } -}; -#define NXMITSW sizeof(xmitsw)/sizeof(struct keytab) - 1 -static int nxmitsw = NXMITSW; - -#endif /* NOXMIT */ - -/* Declarations from ck?fio.c module */ - -extern char *SPACMD, *SPACM2; /* SPACE commands */ - -/* Command-oriented items */ - -#ifdef DCMDBUF -extern char *cmdbuf; /* Command buffers */ -extern char *atmbuf; -extern char *line; /* Character buffer for anything */ -extern char *tmpbuf; /* Short temporary string buffer */ -extern int *ifcmd; -extern int *intime; -extern int *inpcas; -#else -extern char cmdbuf[]; /* Command buffers */ -extern char atmbuf[]; -extern char line[]; /* Character buffer for anything */ -extern char tmpbuf[]; /* Temporary buffer */ -extern int ifcmd[]; -extern int intime[]; -extern int inpcas[]; -#endif /* DCMDBUF */ - -#ifndef NOSPL -extern char * prstring[]; -#endif /* NOSPL */ - -char *lp; /* Pointer to line buffer */ - -#ifndef NOSPL -int unkmacro = 0; /* Flag for in ON_UNKNOWN_COMMAND */ -int oldeval = 0; -char evalbuf[33]; /* EVALUATE result */ -extern char * inpbuf; /* Buffer for INPUT and REINPUT */ -char *inpbp; /* And pointer to same */ -extern char lblbuf[]; /* Buffer for labels */ -int m_found; /* MINPUT result */ -int i_active = 0; /* INPUT command is active */ -char *ms[MINPMAX]; /* Pointers to MINPUT strings */ -static int mp[MINPMAX]; /* and flags */ -extern int fndiags, fnerror, fnsuccess; /* Function diagnostics */ -#ifndef NOSEXP -char * lastsexp = NULL; /* S-Expressions */ -char * sexpval = NULL; -int sexpecho = SET_AUTO; -#endif /* NOSEXP */ -#endif /* NOSPL */ - -char psave[PROMPTL] = { NUL }; /* For saving & restoring prompt */ - -extern int success; /* Command success/failure flag */ -extern int cmdlvl; /* Current position in command stack */ - -#ifndef NOSPL -int /* SET INPUT parameters. */ -/* Note, INPUT TIMEOUT, intime[], is on the command-level stack. */ - inbufsize = 0, /* INPUT buffer size */ - indef = 1, /* default timeout, seconds */ - inecho = 1, /* 1 = echo on */ - inautodl = 0, /* INPUT autodownload */ - inintr = 1, /* INPUT interrupion allowed */ - innomatch = 0, /* INPUT /NOMATCH */ - insilence = 0; /* 0 = no silence constraint */ - -#ifdef CKFLOAT -CKFLOAT inscale = 1.0; /* Timeout scale factor */ -#endif /* CKFLOAT */ - -#ifdef OS2 -int interm = 1; /* Terminal emulator displays input */ -#endif /* OS2 */ -int maclvl = -1; /* Macro nesting level */ -int mecho = 0; /* Macro echo, 0 = don't */ -char varnam[6]; /* For variable names */ -extern int macargc[]; /* ARGC from macro invocation */ - -extern char *m_arg[MACLEVEL][NARGS]; /* Stack of macro arguments */ -extern char *mrval[]; - -extern char **a_ptr[]; /* Array pointers */ -extern int a_dim[]; /* Array dimensions */ -extern int a_link[]; - -#ifdef DCMDBUF -extern struct cmdptr *cmdstk; /* The command stack itself */ -#else -extern struct cmdptr cmdstk[]; /* The command stack itself */ -#endif /* DCMDBUF */ - -long ck_alarm = 0; /* SET ALARM value */ -char alrm_date[24] = { ' ',' ',' ',' ',' ',' ',' ',' ',' ' }; -char alrm_time[24] = { ' ',' ',' ',' ',' ',' ',' ' }; - -#define INPSW_NOM 1 -struct keytab inputsw[] = { - { "/nomatch", INPSW_NOM, 0 } -}; -static int ninputsw = sizeof(inputsw)/sizeof(struct keytab); - -#endif /* NOSPL */ - -static int x, y, z = 0; /* Local workers */ -static char *s; - -#ifdef CK_MINPUT -static char c1chars[] = { /* C1 control chars escept NUL */ - 001,002,003,004,005,006,007,010,011,012,013,014,015,016,017,020, - 021,022,023,024,025,026,027,030,031,032,033,034,035,036,037 -}; -#endif /* CK_MINPUT */ - -#define xsystem(s) zsyscmd(s) - -/* Top-Level Interactive Command Keyword Table */ -/* Keywords must be in lowercase and in alphabetical order. */ - -struct keytab cmdtab[] = { -#ifndef NOPUSH - { "!", XXSHE, CM_INV|CM_PSH }, /* Shell escape */ -#else - { "!", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NOPUSH */ - { "#", XXCOM, CM_INV }, /* Comment */ -#ifndef NOSPL - { "(", XXSEXP,CM_INV }, /* S-Expression */ - { ".", XXDEF, CM_INV }, /* Assignment */ - { ":", XXLBL, CM_INV }, /* Label */ -#endif /* NOSPL */ -#ifdef CK_REDIR -#ifndef NOPUSH - { "<", XXFUN, CM_INV|CM_PSH }, /* REDIRECT */ -#else - { "<", XXNOTAV, CM_INV|CM_PSH }, /* REDIRECT */ -#endif /* NOPUSH */ -#endif /* CK_REDIR */ -#ifndef NOPUSH - { "@", XXSHE, CM_INV|CM_PSH }, /* DCL escape */ -#else - { "@", XXNOTAV, CM_INV|CM_PSH }, /* DCL escape */ -#endif /* NOPUSH */ - -#ifdef CK_RECALL - { "^", XXREDO,CM_INV|CM_NOR }, /* Synonym for REDO */ -#endif /* CK_RECALL */ -#ifndef NOSPL - { "_asg", XXASX, CM_INV }, /* Used internally by FOR, etc */ - { "_assign", XXASX, CM_INV }, /* Used internally by FOR, etc */ - { "_decrement", XX_DECR, CM_INV }, - { "_define", XXDFX, CM_INV }, /* Used internally by FOR, etc */ - { "_evaluate", XX_EVAL, CM_INV }, - { "_forward", XXXFWD, CM_INV }, /* Used internally by SWITCH */ - { "_getargs", XXGTA, CM_INV }, /* Used internally by FOR, etc */ - { "_increment", XX_INCR, CM_INV }, - { "_putargs", XXPTA, CM_INV }, /* Used internally by FOR, etc */ - { "_undefine", XXUNDFX, CM_INV }, -#endif /* NOSPL */ - - { "about", XXVER, CM_INV }, /* Synonym for VERSION */ -#ifndef NOSPL -#ifdef NEWFTP - { "account", XXACCT, CM_INV }, /* (FTP) Account */ -#endif /* NEWFTP */ -#ifdef ADDCMD - { "add", XXADD, 0 }, /* ADD */ -#endif /* ADDCMD */ -#ifndef NODIAL - { "answer", XXANSW, CM_LOC }, /* ANSWER the phone */ -#else - { "answer", XXNOTAV, CM_INV|CM_LOC }, /* ANSWER the phone */ -#endif /* NODIAL */ - { "apc", XXAPC, 0 }, /* Application Program Command */ -#ifndef NOSPL - { "array", XXARRAY, 0 }, /* Array operations */ -#endif /* NOSPL */ - { "ascii", XXASC, CM_INV }, /* == SET FILE TYPE TEXT */ - { "asg", XXASS, CM_INV }, /* Invisible synonym for ASSIGN */ - { "ask", XXASK, 0 }, /* ASK for text, assign to variable */ - { "askq", XXASKQ,0 }, /* ASK quietly (no echo) */ -#ifndef NOSPL - { "ass", XXASS, CM_INV|CM_ABR }, /* ASSIGN */ - { "assert", XXASSER, CM_INV }, /* ASSERT */ - { "assign", XXASS, 0 }, /* ASSIGN */ -#endif /* NOSPL */ -#ifndef NOXFER -#ifndef NOCSETS - { "associate", XXASSOC, 0 }, /* ASSOCIATE */ -#else - { "associate", XXNOTAV, CM_INV }, /* ASSOCIATE */ -#endif /* NOCSETS */ -#endif /* NOXFER */ -#ifdef CK_KERBEROS -#ifdef CK_AUTHENTICATION - { "authenticate",XXAUTH, 0 }, /* Authentication */ -#else - { "authenticate",XXAUTH, CM_INV }, -#endif /* CK_AUTHENTICATION */ -#endif /* CK_KERBEROS */ -#endif /* NOSPL */ -#ifndef NOFRILLS - { "back", XXBACK, 0 }, /* BACK to previous directory */ -#else - { "back", XXNOTAV,CM_INV }, -#endif /* NOFRILLS */ - { "beep", XXBEEP,CM_INV }, /* BEEP */ -#ifndef NOXFER - { "binary", XXBIN, CM_INV }, /* == SET FILE TYPE BINARY */ -#endif /* NOXFER */ -#ifndef NOFRILLS - { "bug", XXBUG, CM_INV }, /* BUG report instructions */ -#else - { "bug", XXNOTAV, CM_INV }, -#endif /* NOFRILLS */ -#ifdef BROWSER - { "browse", XXBROWS, CM_PSH|CM_LOC }, /* BROWSE (start browser) */ -#else - { "browse", XXNOTAV, CM_INV|CM_PSH|CM_LOC }, -#endif /* BROWSER */ -#ifndef NOXFER - { "bye", XXBYE, 0 }, /* BYE to remote server */ -#endif /* NOXFER */ -#ifndef NOLOCAL - { "c", XXCON, CM_INV|CM_ABR|CM_LOC }, /* (CONNECT) */ -#endif /* NOLOCAL */ -#ifndef NOFRILLS - { "cat", XXCAT, CM_INV }, /* Invisible synonym for TYPE */ -#endif /* NOFRILLS */ -#ifndef NOSPL - -#ifndef NOXFER - { "cautious", XXCAU, CM_INV }, -#endif /* NOXFER */ - -#endif /* NOSPL */ - - { "cd", XXCWD, 0 }, /* Change Directory */ - { "cdup", XXCDUP, CM_INV }, /* Change Directory Up */ - -#ifndef NOXFER -#ifdef PIPESEND - { "cget", XXCGET, CM_INV|CM_PSH }, /* CGET */ -#else - { "cget", XXNOTAV, CM_INV|CM_PSH }, /* CGET */ -#endif /* PIPESEND */ -#endif /* NOXFER */ - { "ch", XXCHK, CM_INV|CM_ABR }, - { "check", XXCHK, 0 }, /* CHECK for a feature */ -#ifdef CK_PERMS -#ifdef UNIX - { "chmod", XXCHMOD, 0 }, /* CHMOD */ -#else - { "chmod", XXNOTAV, CM_INV }, -#endif /* UNIX */ -#else - { "chmod", XXNOTAV, CM_INV }, -#endif /* CK_PERMS */ -#ifdef CKROOT - { "chroot", XXCHRT, CM_INV }, /* CHROOT */ -#endif /* CKROOT */ - { "ckermit", XXKERMI, CM_INV }, /* CKERMIT (like KERMIT) */ - { "cl", XXCLO, CM_ABR|CM_INV }, -#ifndef NOFRILLS - { "clear", XXCLE, 0 }, /* CLEAR input and/or device buffer */ -#else - { "clear", XXNOTAV, CM_INV }, -#endif /* NOFRILLS */ - { "close", XXCLO, 0 }, /* CLOSE a log or other file */ - { "cls", XXCLS, CM_INV }, /* Clear Screen (CLS) */ - { "comment", XXCOM, CM_INV }, /* Introduce a comment */ -#ifndef NOLOCAL - { "connect", XXCON, CM_LOC }, /* Begin terminal connection */ -#else - { "connect", XXNOTAV, CM_LOC }, -#endif /* NOLOCAL */ - { "continue", XXCONT, CM_INV }, /* CONTINUE */ -#ifndef NOFRILLS -#ifdef ZCOPY - { "co", XXCPY, CM_INV|CM_ABR }, - { "cop", XXCPY, CM_INV|CM_ABR }, - { "copy", XXCPY, 0 }, /* COPY a file */ -#else - { "copy", XXNOTAV, CM_INV }, -#endif /* ZCOPY */ - { "copyright", XXCPR, CM_INV }, /* COPYRIGHT */ -#ifdef ZCOPY - { "cp", XXCPY, CM_INV }, /* COPY a file */ -#endif /* ZCOPY */ -#ifndef NOLOCAL -#ifndef OS2 - { "cq", XXCQ, CM_INV|CM_LOC }, /* CQ (connect quietly) */ -#endif /* OS2 */ -#endif /* NOLOCAL */ -#ifndef NOXFER -#ifdef PIPESEND - { "creceive", XXCREC,CM_INV|CM_PSH }, /* RECEIVE to a command */ - { "csend", XXCSEN,CM_INV|CM_PSH }, /* SEND from command */ -#else - { "creceive", XXNOTAV,CM_INV|CM_PSH }, - { "csend", XXNOTAV,CM_INV|CM_PSH }, -#endif /* PIPESEND */ -#endif /* NOXFER */ -#endif /* NOFRILLS */ - - { "cwd", XXCWD, CM_INV }, /* Traditional synonym for cd */ - -#ifndef NOSPL - { "date", XXDATE, 0 }, /* DATE */ - { "dcl", XXDCL, CM_INV }, /* DECLARE an array (see ARRAY) */ - { "debug", XXDEBUG, CM_INV }, - { "declare", XXDCL, CM_INV }, /* DECLARE an array (see ARRAY) */ - { "decrement", XXDEC, 0 }, /* DECREMENT a numeric variable */ - { "define", XXDEF, 0 }, /* DEFINE a macro or variable */ -#else - { "date", XXNOTAV, CM_INV }, - { "dcl", XXNOTAV, CM_INV }, - { "declare", XXNOTAV, CM_INV }, - { "decrement", XXNOTAV, CM_INV }, - { "define", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOFRILLS - { "delete", XXDEL, 0 }, /* DELETE a file */ -#else - { "delete", XXNOTAV, CM_INV }, -#endif /* NOFRILLS */ - -#ifndef NODIAL - { "dial", XXDIAL, CM_LOC }, /* DIAL a phone number */ -#else - { "dial", XXNOTAV, CM_INV|CM_LOC }, -#endif /* NODIAL */ - -#ifdef NT - { "dialer", XXDIALER, CM_INV }, /* K95 Dialer */ -#endif /* NT */ - - { "directory", XXDIR, 0 }, /* DIRECTORY of files */ - -#ifndef NOFRILLS -#ifndef NOSERVER - { "disable", XXDIS, 0 }, /* DISABLE a server function */ -#else - { "disable", XXNOTAV, CM_INV }, -#endif /* NOSERVER */ -#endif /* NOFRILLS */ - -#ifndef NOSPL - { "do", XXDO, 0 }, /* DO (execute) a macro */ -#else - { "do", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - - { "e", XXEXI, CM_INV|CM_ABR }, - -#ifndef NOFRILLS -#ifndef NOXFER - { "e-packet", XXERR, CM_INV }, /* Send an Error-Packet */ -#endif /* NOXFER */ -#endif /* NOFRILLS */ - - { "echo", XXECH, 0 }, /* ECHO text */ - -#ifndef NOFRILLS -#ifndef NOPUSH - { "edit", XXEDIT, CM_PSH }, /* EDIT */ -#else - { "edit", XXNOTAV, CM_INV|CM_PSH }, /* EDIT */ -#endif /* NOPUSH */ -#endif /* NOFRILLS */ - - { "eightbit", XXEIGHT, CM_INV }, /* EIGHTBIT */ - -#ifndef NOSPL - { "else", XXELS, CM_INV }, /* ELSE part of IF statement */ -#else - { "else", XXNOTAV, CM_INV }, /* ELSE part of IF statement */ -#endif /* NOSPL */ - -#ifndef NOSERVER -#ifndef NOFRILLS - { "enable", XXENA, 0 }, /* ENABLE a server function */ -#else - { "enable", XXNOTAV, CM_INV }, -#endif /* NOFRILLS */ -#endif /* NOSERVER */ - -#ifndef NOSPL - { "end", XXEND, 0 }, /* END command file or macro */ -#else - { "end", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - - { "erase", XXDEL, CM_INV }, /* Synonym for DELETE */ - -#ifndef NOSPL - { "evaluate", XXEVAL, 0 }, /* EVALUATE */ -#else - { "evaluate", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - - { "ex", XXEXI, CM_INV|CM_ABR }, /* Let "ex" still be EXIT */ - -#ifdef CKEXEC - { "exec", XXEXEC, CM_INV|CM_LOC }, /* exec() */ -#else - { "exec", XXNOTAV, CM_INV|CM_LOC }, -#endif /* CKEXEC */ - - { "exit", XXEXI, 0 }, /* EXIT from C-Kermit */ - { "extended-options", XXXOPTS,CM_INV|CM_HLP }, /* Extended-Options */ - -#ifdef OS2 - { "extproc", XXCOM, CM_INV }, /* Dummy command for OS/2 */ -#endif /* OS2 */ - -#ifndef NOXFER - { "f", XXFIN, CM_INV|CM_ABR }, /* Invisible abbrev for FIN */ -#endif /* NOXFER */ - -#ifndef NOSPL - { "fail", XXFAIL, CM_INV }, /* FAIL */ - -#ifndef NOXFER - { "fast", XXFAST, CM_INV }, -#endif /* NOXFER */ - -#ifdef CKCHANNELIO - { "fclose", XXF_CL, CM_INV }, /* FCLOSE */ - { "fcount", XXF_CO, CM_INV }, /* FCOUNT */ - { "fflush", XXF_FL, CM_INV }, /* FFLUSH */ -#endif /* CKCHANNELIO */ - -#ifndef NOXFER - { "fi", XXFIN, CM_INV|CM_ABR }, /* FINISH */ -#endif /* NOXFER */ - -#ifdef CKCHANNELIO - { "file", XXFILE, 0 }, /* FILE */ -#endif /* CKCHANNELIO */ -#endif /* NOSPL */ - -#ifndef NOXFER - { "fin", XXFIN, CM_INV|CM_ABR }, /* FINISH */ -#endif /* NOXFER */ - -#ifndef UNIXOROSK - { "find", XXGREP, 0 }, /* FIND (grep) */ -#else - { "find", XXGREP,CM_INV }, -#endif /* UNIXOROSK */ - -#ifndef NOXFER - { "finish", XXFIN, 0 }, /* FINISH */ -#endif /* NOXFER */ - -#ifdef TCPSOCKET - { "firewall", XXFIREW, CM_INV|CM_HLP }, -#endif /* TCPSOCKET */ - -#ifdef CKCHANNELIO - { "flist", XXF_LI, CM_INV }, /* FLIST */ - { "fopen", XXF_OP, CM_INV }, /* FOPEN */ -#endif /* CKCHANNELIO */ - -#ifndef NOSPL - { "fo", XXFOR, CM_INV|CM_ABR }, /* Invisible abbrev for... */ - { "for", XXFOR, 0 }, /* FOR loop */ - { "forward", XXFWD, CM_INV }, /* FORWARD */ -#endif /* NOSPL */ -#ifndef NOFRILLS - { "fot", XXDIR, CM_INV }, /* "fot" = "dir" (for Chris) */ -#endif /* NOFRILLS */ - -#ifdef CKCHANNELIO - { "fread", XXF_RE, CM_INV }, /* FREAD */ - { "frewind", XXF_RW, CM_INV }, /* FREWIND */ - { "fseek", XXF_SE, CM_INV }, /* FSEEK */ - { "fstatus", XXF_ST, CM_INV }, /* FSTATUS */ -#endif /* CKCHANNELIO */ - -#ifdef TCPSOCKET -#ifndef NOFTP -#ifdef SYSFTP -#ifndef NOPUSH - { "ftp", XXFTP, CM_INV|CM_PSH|CM_LOC }, /* System FTP */ -#else - { "ftp", XXNOTAV, CM_INV|CM_PSH|CM_LOC }, -#endif /* NOPUSH */ -#else /* SYSFTP */ - { "ftp", XXFTP, 0 }, /* Built-in FTP */ -#endif /* SYSFTP */ -#else /* NOFTP */ - { "ftp", XXNOTAV, CM_INV }, /* No FTP */ -#endif /* NOFTP */ -#endif /* TCPSOCKET */ - -#ifndef NOSPL - { "function", XXFUNC, CM_INV|CM_HLP }, /* (for HELP FUNCTION) */ -#endif /* NOSPL */ - -#ifdef CKCHANNELIO - { "fwrite", XXF_WR, CM_INV }, /* FWRITE */ -#endif /* CKCHANNELIO */ - -#ifndef NOXFER - { "g", XXGET, CM_INV|CM_ABR }, /* Invisible abbrev for GET */ -#ifndef NOSPL - { "ge", XXGET, CM_INV|CM_ABR }, /* Ditto */ -#endif /* NOSPL */ - { "get", XXGET, 0 }, /* GET */ -#endif /* NOXFER */ -#ifndef NOSPL - { "getc", XXGETC, 0 }, /* GETC */ -#ifdef OS2 - { "getkeycode", XXGETK, 0 }, /* GETKEYCODE */ -#endif /* OS2 */ -#ifndef NOFRILLS - { "getok", XXGOK, 0 }, /* GETOK (ask for Yes/No/OK) */ -#endif /* NOFRILLS */ -#endif /* NOSPL */ -#ifndef NOSPL - { "goto", XXGOTO,0 }, /* GOTO label in take file or macro */ -#endif /* NOSPL */ -#ifdef UNIXOROSK - { "grep", XXGREP,0 }, /* GREP (find) */ -#else - { "grep", XXGREP,CM_INV }, /* GREP (find) */ -#endif /* UNIXOROSK */ - { "h", XXHLP, CM_INV|CM_ABR }, /* Invisible synonym for HELP */ - { "he", XXHLP, CM_INV|CM_ABR }, /* Invisible synonym for HELP */ -#ifndef NOFRILLS - { "head", XXHEAD, 0 }, -#endif /* NOFRILLS */ -#ifndef NOLOCAL - { "hangup", XXHAN, CM_LOC }, /* HANGUP the connection */ -#endif /* NOLOCAL */ - { "HELP", XXHLP, 0 }, /* Display HELP text */ -#ifndef NOHTTP -#ifdef TCPSOCKET - { "http", XXHTTP, 0 }, /* HTTP operations */ -#endif /* TCPSOCKET */ -#endif /* NOHTTP */ -#ifndef NOSPL - { "i", XXINP, CM_INV|CM_ABR }, /* Invisible synonym for INPUT */ - { "if", XXIF, 0 }, /* IF ( condition ) command */ -#ifdef TCPSOCKET - { "iksd", XXIKSD, CM_INV }, /* Make connection to IKSD */ -#else - { "iksd", XXNOTAV, CM_INV }, -#endif /* TCPSOCKET */ - { "in", XXINP, CM_INV|CM_ABR }, /* Invisible synonym for INPUT */ - { "increment", XXINC, 0 }, /* Increment a numeric variable */ - { "input", XXINP, 0 }, /* INPUT text from comm device */ -#endif /* NOSPL */ - -#ifndef NOHELP - { "int", XXINT, CM_INV|CM_ABR }, - { "intr", XXINT, CM_INV|CM_ABR }, - { "INTRO", XXINT, 0 }, - { "introduction",XXINT, CM_INV }, /* Print introductory text */ -#else - { "intro", XXNOTAV, CM_INV }, - { "introduction",XXNOTAV, CM_INV }, -#endif /* NOHELP */ - -#ifdef OS2 - { "k95", XXKERMI, CM_INV }, /* Hmmm what's this... */ -#endif /* OS2 */ - -#ifndef NOSPL - { "kcd", XXKCD, 0 }, -#endif /* NOSPL */ - - { "kermit", XXKERMI, CM_INV }, - -#ifdef OS2 -#ifndef NOKVERBS - { "kverb", XXKVRB, CM_INV|CM_HLP }, /* Keyboard verb */ -#endif /* NOKVERBS */ -#endif /* OS2 */ - -#ifndef NOFRILLS - { "l", XXLOG, CM_INV|CM_ABR }, /* Invisible synonym for log */ -#endif /* NOFRILLS */ - - { "lcd", XXLCWD, CM_INV }, - { "lcdup", XXLCDU, CM_INV }, - { "lcwd", XXLCWD, CM_INV }, - { "ldelete", XXLDEL, CM_INV }, - { "ldirectory", XXLDIR, CM_INV }, - -#ifdef CKLEARN - { "learn", XXLEARN, 0 }, /* LEARN - automatic script writing */ -#else - { "learn", XXNOTAV, CM_INV }, -#endif /* CKLEARN */ - - { "li", XXLNOUT, CM_INV|CM_ABR }, - { "LICENSE", XXCPR, 0 }, /* LICENSE */ - -#ifndef NOSPL - { "lineout", XXLNOUT, 0 }, /* LINEOUT = OUTPUT + eol */ -#endif /* NOSPL */ - -#ifdef NT - { "link", XXLINK, 0 }, /* LINK source destination */ -#endif /* NT */ - - { "lmkdir", XXLMKD, CM_INV }, - -#ifndef NOFRILLS - { "lo", XXLOG, CM_INV|CM_ABR }, /* Invisible synonym for log */ -#endif /* NOFRILLS */ - -#ifndef NOSPL - { "local", XXLOCAL, CM_INV }, /* LOCAL variable declaration */ -#else - { "local", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - - { "log", XXLOG, 0 }, /* Open a log file */ - - { "login", XXLOGIN, 0 }, /* (REMOTE) LOGIN to server or IKSD */ - { "logout", XXLOGOUT, 0 }, /* LOGOUT from server or IKSD */ - -#ifndef NOFRILLS -#ifndef NODIAL - { "lookup", XXLOOK, 0 }, /* LOOKUP */ -#else - { "lookup", XXNOTAV, CM_INV }, -#endif /* NODIAL */ - - { "lpwd", XXLPWD, CM_INV }, - { "lrename", XXLREN, CM_INV }, - { "lrmdir", XXLRMD, CM_INV }, - -#ifdef UNIXOROSK - { "ls", XXLS, CM_INV|CM_PSH }, /* UNIX ls command */ -#else - { "ls", XXDIR, CM_INV }, /* Invisible synonym for DIR */ -#endif /* UNIXOROSK */ -#ifndef NOXFER - { "mail", XXMAI, 0 }, /* Send a file as e-mail */ -#endif /* NOXFER */ -#ifndef NOHELP - { "manual", XXMAN, CM_PSH }, /* MAN(UAL) */ -#else - { "manual", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NOHELP */ -#endif /* NOFRILLS */ -#ifdef CK_MKDIR - { "md", XXMKDIR, CM_INV }, /* Synonym for MKDIR */ -#endif /* CK_MKDIR */ -#ifdef CK_MINPUT - { "minput", XXMINP, 0 }, /* MINPUT */ -#else - { "minput", XXNOTAV, CM_INV }, -#endif /* CK_MINPUT */ -#ifndef NOMSEND - { "mget", XXMGET, 0 }, /* MGET */ -#else - { "mget", XXNOTAV, CM_INV }, -#endif /* NOMSEND */ -#ifdef CK_MKDIR - { "mkdir", XXMKDIR, 0 }, /* MKDIR */ -#else - { "mkdir", XXNOTAV, CM_INV }, -#endif /* CK_MKDIR */ - -#ifndef NOXFER -#ifndef NOMSEND - { "mmove", XXMMOVE, 0 }, /* MMOVE */ -#else - { "mmove", XXNOTAV, CM_INV }, -#endif /* NOMSEND */ -#endif /* NOXFER */ - -#ifndef NOFRILLS - { "more", XXMORE, CM_INV }, /* MORE */ -#endif /* NOFRILLS */ - -#ifndef NOXFER - { "move", XXMOVE, 0 }, /* MOVE */ -#endif /* NOXFER */ - -#ifndef NOSPL - { "mpause", XXMSL, CM_INV }, /* Millisecond sleep */ -#else - { "mpause", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOXFER -#ifndef NOMSEND - { "mput", XXMSE, CM_INV }, /* MPUT = MSEND */ - { "ms", XXMSE, CM_INV|CM_ABR }, - { "msend", XXMSE, 0 }, /* Multiple SEND */ -#else - { "mput", XXNOTAV, CM_INV }, - { "msend", XXNOTAV, CM_INV }, -#endif /* NOMSEND */ -#endif /* NOXFER */ -#ifndef NOSPL - { "msleep", XXMSL, 0 }, /* Millisecond sleep */ -#else - { "msleep", XXNOTAV, CM_INV }, -#endif /* NOSPL */ -#ifndef NOFRILLS - { "mv", XXREN, CM_INV }, /* Synonym for rename */ -#endif /* NOFRILLS */ -#ifndef NOHELP - { "news", XXNEW, CM_INV }, /* Display NEWS of new features */ -#else - { "news", XXNOTAV, CM_INV }, -#endif /* NOHELP */ - { "nolocal", XXNLCL, CM_INV }, /* Disable SET LINE / SET HOST */ - { "nopush", XXNPSH, CM_INV }, /* Disable PUSH command/features */ -#ifdef OS2 - { "noscroll", XXNSCR, CM_INV }, /* Disable scroll operations */ -#endif /* OS2 */ -#ifndef NOSPL - { "o", XXOUT, CM_INV|CM_ABR }, /* Invisible synonym for OUTPUT */ - { "open", XXOPE, 0 }, /* OPEN file for reading or writing */ -#else - { "open", XXOPE, CM_INV }, /* OPEN */ -#endif /* NOSPL */ -#ifndef NOHELP - { "options", XXOPTS,CM_INV|CM_HLP }, /* Options */ -#endif /* NOHELP */ - { "orientation", XXORIE, 0 }, -#ifndef NOSPL - { "output", XXOUT, 0 }, /* OUTPUT text to comm device */ -#else - { "output", XXNOTAV, CM_INV }, -#endif /* NOSPL */ -#ifdef ANYX25 -#ifndef IBMX25 - { "pad", XXPAD, CM_LOC }, /* X.3 PAD commands */ -#endif /* IBMX25 */ -#endif /* ANYX25 */ - -#ifdef NEWFTP - { "passive", XXPASV, CM_INV }, /* (FTP) PASSIVE */ -#endif /* NEWFTP */ - -#ifndef NOHELP - { "patterns", XXPAT,CM_INV|CM_HLP }, /* Pattern syntax */ -#endif /* NOHELP */ - -#ifndef NOSPL - { "pause", XXPAU, 0 }, /* Sleep for specified interval */ -#else - { "pause", XXNOTAV, CM_INV }, -#endif /* NOSPL */ -#ifndef NODIAL - { "pdial", XXPDIA, CM_LOC }, /* PDIAL (partial dial) */ -#else - { "pdial", XXNOTAV, CM_INV|CM_LOC }, -#endif /* NODIAL */ -#ifdef TCPSOCKET -#ifndef NOPUSH - { "ping", XXPNG, CM_INV|CM_PSH|CM_LOC }, /* PING */ -#else - { "ping", XXNOTAV, CM_INV|CM_PSH|CM_LOC }, -#endif /* NOPUSH */ -#endif /* TCPSOCKET */ -#ifdef NETCMD -#ifndef NOPUSH - { "pipe", XXPIPE, CM_PSH }, /* PIPE */ -#else - { "pipe", XXNOTAV, CM_INV|CM_PSH }, /* PIPE */ -#endif /* NOPUSH */ -#endif /* NETCMD */ - -#ifndef NOSPL - { "pop", XXEND, CM_INV }, /* Invisible synonym for END */ -#endif /* NOSPL */ -#ifndef NOFRILLS - { "print", XXPRI, 0 }, /* PRINT a file locally */ -#endif /* NOFRILLS */ - - { "prompt", XXPROMP, CM_INV }, /* Go interactive (from script) */ - -#ifndef NOXFER -#ifdef CK_RESEND - { "psend", XXPSEN, CM_INV }, /* PSEND */ -#else - { "psend", XXNOTAV, CM_INV }, -#endif /* CK_RESEND */ -#endif /* NOXFER */ - -#ifdef NETPTY - { "pty", XXPTY, CM_PSH }, /* PTY */ -#else - { "pty", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NETPTY */ - -#ifndef NOPUSH - { "pu", XXSHE, CM_INV|CM_ABR|CM_PSH }, /* PU = PUSH */ -#endif /* NOPUSH */ - -#ifdef CKPURGE - { "purge", XXPURGE, 0 }, /* PURGE (real) */ -#else -#ifdef VMS - { "purge", XXPURGE, 0 }, /* PURGE (fake) */ -#else - { "purge", XXNOTAV, CM_INV }, -#endif /* VMS */ -#endif /* CKPURGE */ - -#ifndef NOPUSH - { "push", XXSHE, CM_PSH }, /* PUSH command (like RUN, !) */ -#else - { "push", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NOPUSH */ - -#ifndef NOXFER - { "put", XXSEN, CM_INV }, /* PUT = SEND */ -#endif /* NOXFER */ - - { "pwd", XXPWD, 0 }, /* Print Working Directory */ - { "q", XXQUI, CM_INV|CM_ABR }, /* Invisible synonym for QUIT */ - -#ifndef NOXFER - { "query", XXRQUE,CM_INV }, /* (= REMOTE QUERY) */ -#endif /* NOXFER */ - - { "quit", XXQUI, 0 }, /* QUIT from program = EXIT */ - -#ifndef NOXFER - { "r", XXREC, CM_INV|CM_ABR }, /* Inv synonym for RECEIVE */ -#endif /* NOXFER */ - -#ifndef NOXFER - { "rasg", XXRASG, CM_INV }, /* REMOTE ASSIGN */ - { "rassign", XXRASG, CM_INV }, /* ditto */ - { "rcd", XXRCWD, CM_INV }, /* REMOTE CD */ - { "rcdup", XXRCDUP,CM_INV }, /* REMOTE CD */ - { "rcopy", XXRCPY, CM_INV }, /* REMOTE COPY */ - { "rcwd", XXRCWD, CM_INV }, /* REMOTE CWD */ - { "rdelete", XXRDEL, CM_INV }, /* REMOTE DELETE */ - { "rdirectory", XXRDIR, CM_INV }, /* REMODE DIRECTORY */ -#endif /* NOXFER */ - -#ifndef NOSPL - { "read", XXREA, 0 }, /* READ a line from a file */ -#else - { "read", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOXFER - { "receive", XXREC, 0 }, /* RECEIVE files */ -#endif /* NOXFER */ - -#ifndef NODIAL - { "red", XXRED, CM_INV|CM_ABR|CM_LOC }, /* Inv syn for REDIAL */ - { "redi", XXRED, CM_INV|CM_ABR|CM_LOC }, /* ditto */ - { "redial", XXRED, CM_LOC }, /* REDIAL last DIAL number */ -#else - { "red", XXNOTAV, CM_INV|CM_LOC }, - { "redi", XXNOTAV, CM_INV|CM_LOC }, - { "redial", XXNOTAV, CM_INV|CM_LOC }, -#endif /* NODIAL */ - -#ifdef CK_REDIR -#ifdef OS2 -#ifndef NOPUSH - { "redirect", XXFUN, CM_INV|CM_PSH }, /* REDIRECT */ -#else - { "redirect", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NOPUSH */ -#else /* OS2 */ -#ifndef NOPUSH - { "redirect", XXFUN, CM_PSH }, /* REDIRECT */ -#else - { "redirect", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NOPUSH */ -#endif /* OS2 */ -#endif /* CK_REDIR */ - -#ifdef CK_RECALL - { "redo", XXREDO, CM_NOR }, /* REDO */ -#else - { "redo", XXNOTAV, CM_INV }, -#endif /* CK_RECALL */ - -#ifndef NOXFER -#ifdef CK_RESEND - { "reget", XXREGET, 0 }, /* REGET */ -#else - { "reget", XXNOTAV, CM_INV }, -#endif /* CK_RESEND */ -#endif /* NOXFER */ - -#ifndef NOSPL - { "reinput", XXREI, CM_INV }, /* REINPUT (from INPUT buffer) */ -#else - { "reinput", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOXFER -#ifdef ADDCMD - { "rem", XXREM, CM_INV|CM_ABR }, - { "remo", XXREM, CM_INV|CM_ABR }, -#endif /* ADDCMD */ - { "remote", XXREM, 0 }, /* Send REMOTE command to server */ -#endif /* NOXFER */ - -#ifdef ADDCMD - { "remove", XXREMV,0 }, /* REMOVE (something from a list) */ -#else - { "remove", XXNOTAV, CM_INV }, -#endif /* ADDCMD */ - -#ifndef NOFRILLS -#ifndef NORENAME - { "rename", XXREN, 0 }, /* RENAME a local file */ -#else - { "rename", XXNOTAV, CM_INV }, -#endif /* NORENAME */ - { "replay", XXTYP, CM_INV }, /* REPLAY (for now, just type) */ -#endif /* NOFRILLS */ - -#ifndef NOXFER -#ifdef CK_RESEND - { "res", XXRSEN, CM_INV|CM_ABR }, /* RESEND */ - { "rese", XXRSEN, CM_INV|CM_ABR }, /* RESEND */ - { "resend", XXRSEN, 0 }, /* RESEND */ -#else - { "res", XXNOTAV, CM_INV }, - { "rese", XXNOTAV, CM_INV }, - { "resend", XXNOTAV, CM_INV }, -#endif /* CK_RESEND */ -#endif /* NOXFER */ - - { "reset", XXRESET, CM_INV }, /* RESET */ - -#ifdef CK_RESEND -#ifndef NOSPL - { "ret", XXRET, CM_INV|CM_ABR }, -#endif /* NOSPL */ -#endif /* CK_RESEND */ - -#ifndef NOXFER - { "retrieve", XXRETR, CM_INV }, /* RETRIEVE */ -#endif /* NOXFER */ - -#ifndef NOSPL - { "return", XXRET, 0 }, /* RETURN from a function */ -#else - { "return", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOXFER - { "rexit", XXRXIT, CM_INV }, /* REMOTE EXIT */ -#endif /* NOXFER */ - -#ifdef CK_REXX -#ifndef NOPUSH - { "rexx", XXREXX, CM_PSH }, /* Execute a Rexx command */ -#else - { "rexx", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NOPUSH */ -#endif /* CK_REXX */ - -#ifndef NOXFER - { "rhelp", XXRHLP, CM_INV }, /* REMOTE HELP */ - { "rhost", XXRHOS, CM_INV }, /* REMOTE HOST */ - { "rkermit", XXRKER, CM_INV }, /* REMOTE KERMIT */ -#endif /* NOXFER */ - -#ifdef TCPSOCKET - { "rlogin", XXRLOG, CM_LOC }, /* Make an Rlogin connection */ -#else - { "rlogin", XXNOTAV, CM_INV|CM_LOC }, -#endif /* TCPSOCKET */ - -#ifndef NOFRILLS - { "rm", XXDEL, CM_INV }, /* Invisible synonym for delete */ -#endif /* NOFRILLS */ - -#ifdef CK_MKDIR - { "rmdir", XXRMDIR, 0 }, /* RMDIR */ -#else - { "rmdir", XXNOTAV, CM_INV }, -#endif /* CK_MKDIR */ - -#ifndef NOXFER - { "rmkdir", XXRMKD, CM_INV }, /* REMOTE MKDIR */ -#ifndef NOSPL - { "robust", XXROB, CM_INV }, -#else - { "robust", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - { "rprint", XXRPRI, CM_INV }, /* REMOTE PRINT */ - { "rpwd", XXRPWD, CM_INV }, /* REMOTE PWD */ - { "rquery", XXRQUE, CM_INV }, /* REMOTE QUERY */ -#endif /* NOXFER */ - -#ifdef CK_RECALL - { "rr", XXREDO, CM_INV|CM_NOR }, -#endif /* CK_RECALL */ - -#ifndef NOXFER - { "rrename", XXRREN, CM_INV }, /* REMOTE RENAME */ - { "rrmdir", XXRRMD, CM_INV }, /* REMOTE REMDIR */ - { "rset", XXRSET, CM_INV }, /* REMOTE SET */ - { "rspace", XXRSPA, CM_INV }, /* REMOTE SPACE */ - { "rtype", XXRTYP, CM_INV }, /* REMOTE TYPE */ -#endif /* NOXFER */ - -#ifndef NOPUSH - { "run", XXSHE, CM_PSH }, /* RUN a program or command */ -#else - { "run", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NOPUSH */ - -#ifndef NOXFER - { "rwho", XXRWHO, CM_INV }, /* REMOTE WHO */ - { "s", XXSEN, CM_INV|CM_ABR }, /* Invisible synonym for send */ -#endif /* NOXFER */ - -#ifndef NOSETKEY -#ifdef OS2 - { "save", XXSAVE, 0 }, /* SAVE something */ -#else - { "save", XXSAVE, CM_INV }, -#endif /* OS2 */ -#else - { "save", XXNOTAV, CM_INV }, -#endif /* NOSETKEY */ - -#ifndef NOSCRIPT - { "sc", XXLOGI, CM_INV|CM_ABR|CM_LOC }, - { "scr", XXLOGI, CM_INV|CM_ABR|CM_LOC }, -#endif /* NOSCRIPT */ - { "screen", XXSCRN, 0 }, /* SCREEN actions */ -#ifndef NOSCRIPT - { "script", XXLOGI, CM_LOC }, /* Expect-Send-style script line */ -#else - { "script", XXNOTAV, CM_INV|CM_LOC }, -#endif /* NOSCRIPT */ - - { "search", XXGREP,CM_INV }, /* Synonym for GREP and FIND */ - -#ifndef NOXFER - { "send", XXSEN, 0 }, /* Send (a) file(s) */ -#ifndef NOSERVER - { "server", XXSER, 0 }, /* Be a SERVER */ -#else - { "server", XXNOTAV, CM_INV }, -#endif /* NOSERVER */ -#endif /* NOXFER */ - - { "set", XXSET, 0 }, /* SET parameters */ - -#ifndef NOSPL -#ifndef NOSEXP - { "sexpression", XXSEXP, CM_INV|CM_HLP }, /* SEXPR */ -#endif /* NOSEXP */ - -#ifdef SFTP_BUILTIN - { "sftp", XXSFTP, 0 }, /* SFTP */ -#endif /* SFTP_BUILTIN */ - -#ifndef NOSHOW - { "sh", XXSHO, CM_INV|CM_ABR }, /* SHOW parameters */ -#endif /* NOSHOW */ - { "shift", XXSHIFT, 0 }, /* SHIFT args */ -#else - { "shift", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOSHOW - { "show", XXSHO, 0 }, /* SHOW parameters */ -#else - { "show", XXNOTAV, CM_INV }, -#endif /* NOSHOW */ - -#ifdef NEWFTP - { "site", XXSITE, CM_INV }, /* (FTP) SITE */ -#endif /* NEWFTP */ - -#ifdef SSHBUILTIN - { "skermit", XXSKRM, 0 }, /* SKERMIT */ -#endif /* SSHBUILTIN */ - -#ifndef NOSPL -#ifndef NOFRILLS - { "sleep", XXPAU, CM_INV }, /* SLEEP for specified interval */ -#endif /* NOFRILLS */ -#endif /* NOSPL */ - -#ifndef NOSPL - { "sort", XXSORT, CM_INV }, /* (see ARRAY) */ -#else - { "sort", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef MAC -#ifndef NOFRILLS - { "sp", XXSPA, CM_INV|CM_ABR }, - { "spa", XXSPA, CM_INV|CM_ABR }, -#endif /* NOFRILLS */ - { "space", XXSPA, 0 }, /* Show available disk SPACE */ -#endif /* MAC */ - -#ifndef NOFRILLS -#ifndef NOPUSH - { "spawn", XXSHE, CM_INV|CM_PSH }, /* Synonym for PUSH, RUN */ -#else - { "spawn", XXNOTAV, CM_INV|CM_PSH }, /* Synonym for PUSH, RUN */ -#endif /* NOPUSH */ -#endif /* NOFRILLS */ - -#ifdef ANYSSH - { "ssh", XXSSH, 0 }, -#endif /* ANYSSH */ - -#ifndef NOXFER - { "sta", XXSTA, CM_INV|CM_ABR }, - { "stat", XXSTA, CM_INV|CM_ABR }, - { "statistics", XXSTA, 0 }, /* Display file transfer stats */ -#endif /* NOXFER */ - - { "status", XXSTATUS,0 }, /* Show status of previous command */ - -#ifndef NOSPL - { "stop", XXSTO, 0 }, /* STOP all take files and macros */ - { "succeed", XXSUCC, CM_INV }, /* SUCCEED */ -#else - { "stop", XXNOTAV, CM_INV }, - { "succeed", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOFRILLS - { "SUPPORT", XXBUG, 0 }, /* Tech support instructions */ -#else - { "support", XXNOTAV, CM_INV }, -#endif /* NOFRILLS */ - -#ifndef NOJC - { "suspend", XXSUS, CM_PSH }, /* SUSPEND C-Kermit (UNIX only) */ -#else - { "suspend", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NOJC */ - -#ifndef NOSPL - { "switch", XXSWIT, 0 }, /* SWITCH */ -#else - { "switch", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifdef CK_TAPI - { "ta", XXTAK, CM_INV|CM_ABR }, /* (because of TAPI) */ -#endif /* CK_TAPI */ - -#ifndef NOFRILLS - { "tail", XXTAIL, 0 }, /* Display end of a local file */ -#endif /* NOFRILLS */ - - { "take", XXTAK, 0 }, /* TAKE commands from a file */ - -#ifdef CK_TAPI - { "tapi", XXTAPI, CM_LOC }, /* Microsoft TAPI commands */ -#else - { "tapi", XXNOTAV, CM_INV|CM_LOC }, -#endif /* CK_TAPI */ - -#ifndef NOFRILLS -#ifdef TCPSOCKET - { "tel", XXTEL, CM_INV|CM_ABR|CM_LOC }, - { "telnet", XXTEL, CM_LOC }, /* TELNET (TCP/IP only) */ - { "telopt", XXTELOP, CM_INV }, /* TELOPT (ditto) */ -#else - { "tel", XXNOTAV, CM_INV|CM_LOC }, - { "telnet", XXNOTAV, CM_INV|CM_LOC }, - { "telopt", XXNOTAV, CM_INV }, -#endif /* TCPSOCKET */ -#ifdef OS2 - { "terminal", XXTERM, CM_INV|CM_LOC }, /* == SET TERMINAL TYPE */ -#else - { "terminal", XXTERM, CM_INV }, -#endif /* OS2 */ -#endif /* NOFRILLS */ -#ifndef NOXFER - { "text", XXASC, CM_INV }, /* == SET FILE TYPE TEXT */ -#endif /* NOXFER */ - -#ifndef NOSPL - { "trace", XXTRACE, 0 }, /* TRACE */ -#else - { "trace", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOCSETS - { "translate", XXXLA, 0 }, /* TRANSLATE local file char sets */ -#else - { "translate", XXNOTAV, CM_INV }, -#endif /* NOCSETS */ - -#ifndef NOXMIT - { "transmit", XXTRA, 0 }, /* Send (upload) a file, no protocol */ -#else - { "transmit", XXNOTAV, CM_INV }, -#endif /* NOXMIT */ - -#ifndef NOFRILLS - { "type", XXTYP, 0 }, /* Display a local file */ -#endif /* NOFRILLS */ - -#ifndef NOSPL - { "undcl", XXUNDCL, CM_INV }, - { "undeclare", XXUNDCL, 0 }, /* UNDECLARE an array */ - { "undefine", XXUNDEF, 0 }, /* UNDEFINE a variable or macro */ -#else - { "undcl", XXNOTAV, CM_INV }, - { "undeclare", XXNOTAV, CM_INV }, - { "undefine", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifdef NEWFTP - { "user", XXUSER, CM_INV }, /* (FTP) USER */ -#endif /* NEWFTP */ - - { "version", XXVER, 0 }, /* VERSION-number display */ - -#ifdef OS2 - { "viewonly", XXVIEW, CM_LOC }, /* VIEWONLY Terminal Mode */ -#endif /* OS2 */ - - { "void", XXVOID, 0 }, /* VOID */ - -#ifndef NOSPL - { "wait", XXWAI, 0 }, /* WAIT */ -#else - { "wait", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - - { "wermit", XXKERMI, CM_INV }, - -#ifndef NOXFER - { "where", XXWHERE, 0 }, /* WHERE (did my file go?) */ -#endif /* NOXFER */ - -#ifndef NOSPL - { "while", XXWHI, 0 }, /* WHILE loop */ -#else - { "while", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef OS2 -#ifndef MAC -#ifndef NOFRILLS - { "who", XXWHO, CM_PSH }, /* WHO's logged in? */ -#endif /* NOFRILLS */ -#endif /* MAC */ -#endif /* OS2 */ - -#ifndef NOHELP - { "wildcards", XXWILD,CM_INV|CM_HLP }, /* Wildcard syntax */ -#endif /* NOHELP */ - -#ifndef NOSPL - { "wr", XXWRI, CM_INV|CM_ABR }, - { "wri", XXWRI, CM_INV|CM_ABR }, - { "writ", XXWRI, CM_INV|CM_ABR }, - { "write", XXWRI, 0 }, /* WRITE characters to a file */ - { "write-line", XXWRL, CM_INV }, /* WRITE a line to a file */ - { "writeln", XXWRL, CM_INV }, /* Pascalisch synonym for write-line */ -#else - { "wr", XXNOTAV, CM_INV }, - { "wri", XXNOTAV, CM_INV }, - { "writ", XXNOTAV, CM_INV }, - { "write", XXNOTAV, CM_INV }, - { "write-line", XXNOTAV, CM_INV }, - { "writeln", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOFRILLS - { "xecho", XXXECH,0 }, /* XECHO */ -#endif /* NOFRILLS */ - -#ifndef NOSPL - { "xif", XXIFX, CM_INV }, /* Extended IF command (obsolete) */ -#else - { "xif", XXNOTAV, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOCSETS - { "xlate", XXXLA, CM_INV }, /* Synonym for TRANSLATE */ -#else - { "xlate", XXNOTAV, CM_INV }, -#endif /* NOCSETS */ - -#ifndef NOXMIT - { "xmit", XXTRA, CM_INV }, /* Synonym for TRANSMIT */ -#else - { "xmit", XXNOTAV, CM_INV }, -#endif /* NOXMIT */ - -#ifndef OS2 -#ifndef NOJC - { "z", XXSUS, CM_INV|CM_PSH }, /* Synonym for SUSPEND */ -#else - { "z", XXNOTAV, CM_INV|CM_PSH }, -#endif /* NOJC */ -#endif /* OS2 */ - -#ifndef NOSPL - { "{", XXMACRO, CM_INV }, /* Immediate macro */ -#endif /* NOSPL */ - { "", 0, 0 } -}; -int ncmd = (sizeof(cmdtab) / sizeof(struct keytab)) - 1; - -/* NOTE: Tokens must also be entered above into cmdtab[]. */ - -char toktab[] = { -#ifndef NOPUSH - '!', /* Shell escape */ -#endif /* NOPUSH */ - '#', /* Comment */ -#ifndef NOSPL - '(', /* S-Expression */ - '.', /* Assignment */ -#endif /* NOSPL */ - ';', /* Comment */ -#ifndef NOSPL - ':', /* Label */ -#endif /* NOSPL */ -#ifndef NOPUSH -#ifdef CK_REDIR - '<', /* REDIRECT */ -#endif /* CK_REDIR */ - '@', /* DCL escape */ -#endif /* NOPUSH */ -#ifdef CK_RECALL - '^', /* Command recall */ -#endif /* CK_RECALL */ -#ifndef NOSPL - '{', /* Immediate macro */ -#endif /* NOSPL */ - '\0' /* End of this string */ -}; -int xxdot = 0; /* Used with "." token */ - -struct keytab yesno[] = { /* Yes/No keyword table */ - { "no", 0, 0 }, - { "ok", 1, 0 }, - { "yes", 1, 0 } -}; -int nyesno = (sizeof(yesno) / sizeof(struct keytab)); - -/* Save keyword table */ - -struct keytab savtab[] = { -#ifdef OS2 - { "command", XSCMD, 0 }, -#else -#ifdef CK_RECALL - { "command", XSCMD, 0 }, -#endif /* CK_RECALL */ -#endif /* OS2 */ -#ifndef NOSETKEY - { "keymap", XSKEY, 0 }, -#endif /* NOSETKEY */ -#ifdef OS2 - { "terminal", XSTERM, 0 }, -#endif /* OS2 */ - { "", 0, 0 } -}; -int nsav = (sizeof(savtab) / sizeof(struct keytab)) - 1; - -/* Parameter keyword table */ - -struct keytab prmtab[] = { - { "alarm", XYALRM, 0 }, -#ifdef COMMENT /* SET ANSWER not implemented yet */ -#ifndef NODIAL - { "answer", XYANSWER,0 }, -#endif /* NODIAL */ -#endif /* COMMENT */ - { "ask-timer", XYTIMER, 0 }, -#ifndef NOXFER - { "attributes", XYATTR, 0 }, -#endif /* NOXFER */ -#ifdef CK_AUTHENTICATION - { "authentication", XYAUTH, 0 }, -#else /* CK_AUTHENTICATION */ -#ifdef CK_SSL - { "authentication", XYAUTH, 0 }, -#endif /* CK_SSL */ -#endif /* CK_AUTHENTICATION */ - { "b", XYBACK, CM_INV|CM_ABR|CM_PSH }, - { "ba", XYBACK, CM_INV|CM_ABR|CM_PSH }, -#ifdef VMS - { "background", XYBACK, CM_INV|CM_PSH }, - { "batch", XYBACK, CM_PSH }, -#else - { "background", XYBACK, CM_PSH }, - { "batch", XYBACK, CM_INV|CM_PSH }, -#endif /* VMS */ -#ifndef NOLOCAL - { "baud", XYSPEE, CM_INV|CM_LOC }, -#endif /* NOLOCAL */ - { "bell", XYBELL, 0 }, -#ifndef NOXFER - { "block-check", XYCHKT, 0 }, -#endif /* NOXFER */ -#ifdef OS2 -#ifdef BPRINT - { "bprinter", XYBDCP, CM_INV }, -#endif /* BPRINT */ -#endif /* OS2 */ -#ifdef BROWSER - { "browser", XYBROWSE,CM_PSH|CM_LOC }, -#endif /* BROWSER */ -#ifndef NOXFER -#ifdef DYNAMIC - { "buffers", XYBUF, 0 }, -#endif /* DYNAMIC */ -#endif /* NOXFER */ -#ifndef NOLOCAL -#ifndef MAC - { "carrier-watch", XYCARR, CM_LOC }, -#endif /* MAC */ -#endif /* NOLOCAL */ -#ifndef NOSPL - { "case", XYCASE, 0 }, -#endif /* NOSPL */ - { "cd", XYCD, 0 }, -#ifndef NOXFER - { "cl", XYCLEAR, CM_INV|CM_ABR }, - { "cle", XYCLEAR, CM_INV|CM_ABR }, - { "clea", XYCLEAR, CM_INV|CM_ABR }, - { "clear", XYCLEAR, CM_INV|CM_ABR }, - { "clear-channel", XYCLEAR, 0 }, - { "clearchannel", XYCLEAR, CM_INV }, -#endif /* NOXFER */ -#ifndef NOLOCAL - { "close-on-disconnect", XYDISC, CM_INV|CM_LOC }, -#endif /* NOLOCAL */ - { "cmd", XYCMD, CM_INV }, - { "command", XYCMD, 0 }, -#ifdef CK_SPEED - { "con", XYQCTL, CM_INV|CM_ABR }, -#endif /* CK_SPEED */ - { "console", XYCMD, CM_INV }, -#ifdef CK_SPEED - { "control-character",XYQCTL, 0 }, -#endif /* CK_SPEED */ -#ifndef NOSPL - { "count", XYCOUN, 0 }, -#endif /* NOSPL */ -#ifndef NOXFER - { "d", XYDELA, CM_INV|CM_ABR }, - { "de", XYDELA, CM_INV|CM_ABR }, -#endif /* NOXFER */ - { "debug", XYDEBU, 0 }, -#ifdef VMS - { "default", XYDFLT, 0 }, -#else -#ifndef MAC - { "default", XYDFLT, CM_INV }, -#endif /* MAC */ -#endif /* VMS */ -#ifndef NOXFER - { "delay", XYDELA, 0 }, - { "destination", XYDEST, 0 }, -#endif /* NOXFER */ -#ifndef NODIAL - { "di", XYDIAL, CM_INV|CM_ABR|CM_LOC }, - { "dia", XYDIAL, CM_INV|CM_ABR|CM_LOC }, - { "dial", XYDIAL, CM_LOC }, -#endif /* NODIAL */ -#ifdef OS2 - { "dialer", XYDLR, CM_INV }, -#endif /* OS2 */ -#ifndef NOLOCAL - { "disconnect", XYDISC, CM_LOC }, - { "duplex", XYDUPL, CM_LOC }, -#endif /* NOLOCAL */ -#ifndef NOPUSH -#ifndef NOFRILLS - { "editor", XYEDIT, CM_PSH }, -#endif /* NOFRILLS */ -#endif /* NOPUSH */ -#ifdef CK_CTRLZ - { "eof", XYEOF, CM_INV }, -#endif /* CK_CTRLZ */ -#ifndef NOLOCAL - { "escape-character", XYESC, CM_LOC }, -#endif /* NOLOCAL */ -#ifndef NOSPL - { "evaluate", XYEVAL, CM_INV }, -#endif /* NOSPL */ - { "exit", XYEXIT, 0 }, -#ifndef NOXFER - { "f-ack-bug", XYFACKB, CM_INV }, - { "f-ack-path", XYFACKP, CM_INV }, -#endif /* NOXFER */ - { "file", XYFILE, 0 }, - { "fl", XYFLOW, CM_INV|CM_ABR }, -#ifndef NOSPL - { "flag", XYFLAG, 0 }, -#endif /* NOSPL */ -#ifdef TCPSOCKET -#ifndef SYSFTP -#ifndef NOFTP - { "ft", XYFTPX, CM_INV|CM_ABR }, - { "ftp", XYFTPX, 0 }, -#endif /* NOFTP */ -#endif /* SYSFTP */ -#endif /* TCPSOCKET */ -#ifdef BROWSER - { "ftp-client", XYFTP, CM_PSH }, -#endif /* BROWSER */ - { "flow-control", XYFLOW, 0 }, -#ifndef NOSPL - { "function", XYFUNC, 0 }, -#endif /* NOSPL */ -#ifdef NEWFTP - { "get-put-remote", XYGPR, 0 }, -#endif /* NEWFTP */ -#ifdef KUI - { "gui", XYGUI, 0 }, -#endif /* KUI */ - { "handshake", XYHAND, 0 }, - { "hints", XYHINTS, 0 }, -#ifdef NETCONN - { "host", XYHOST, CM_LOC }, -#endif /* NETCONN */ -#ifndef NOSPL - { "i", XYINPU, CM_INV|CM_ABR }, -#endif /* NOSPL */ -#ifdef IKSD - { "iks", XYIKS, 0 }, -#else - { "iks", XYIKS, CM_INV }, -#endif /* IKSD */ -#ifndef NOSPL - { "in", XYINPU, CM_INV|CM_ABR }, -#endif /* NOSPL */ -#ifndef NOXFER - { "incomplete", XYIFD, CM_INV }, -#endif /* NOXFER */ -#ifndef NOSPL - { "input", XYINPU, 0 }, -#endif /* NOSPL */ -#ifndef NOSETKEY - { "key", XYKEY, 0 }, -#endif /* NOSETKEY */ - { "l", XYLINE, CM_INV|CM_ABR }, -#ifndef NOCSETS - { "language", XYLANG, 0 }, -#endif /* NOCSETS */ -#ifndef NOLOCAL - { "line", XYLINE, CM_LOC }, - { "local-echo", XYLCLE, CM_INV|CM_LOC }, -#endif /* NOLOCAL */ -#ifdef LOCUS - { "locus", XYLOCUS, 0 }, -#endif /* LOCUS */ -#ifndef NOSPL - { "login", XYLOGIN, CM_LOC }, -#endif /* NOSPL */ -#ifndef NOSPL - { "macro", XYMACR, 0 }, -#endif /* NOSPL */ - { "match", XYMATCH, 0 }, -#ifdef COMMENT -#ifdef VMS - { "messages", XYMSGS, 0 }, -#endif /* VMS */ -#endif /* COMMENT */ -#ifndef NODIAL - { "modem", XYMODM, CM_LOC }, -#endif /* NODIAL */ -#ifndef NOLOCAL -#ifdef OS2MOUSE - { "mouse", XYMOUSE, 0 }, -#endif /* OS2MOUSE */ -#endif /* NOLOCAL */ -#ifdef OS2 - { "mskermit", XYMSK, 0 }, -#endif /* OS2 */ -#ifdef NETCONN - { "network", XYNET, CM_LOC }, -#endif /* NETCONN */ -#ifndef NOSPL - { "output", XYOUTP, 0 }, -#endif /* NOSPL */ - { "options", XYOPTS, 0 }, - { "pause", XYSLEEP, CM_INV }, -#ifdef ANYX25 -#ifndef IBMX25 - { "pad", XYPAD, CM_LOC }, -#endif /* IBMX25 */ -#endif /* ANYX25 */ - { "parity", XYPARI, 0 }, -#ifndef NOLOCAL -#ifdef OS2 - { "port", XYLINE, CM_LOC }, -#else - { "port", XYLINE, CM_INV|CM_LOC }, -#endif /* OS2 */ -#endif /* NOLOCAL */ -#ifndef NOFRILLS - { "pr", XYPROM, CM_INV|CM_ABR }, - { "printer", XYPRTR, 0 }, -#endif /* NOFRILLS */ -#ifdef OS2 - { "priority", XYPRTY, 0 }, -#endif /* OS2 */ -#ifdef CK_SPEED - { "prefixing", XYPREFIX, 0 }, -#endif /* CK_SPEED */ -#ifndef NOFRILLS - { "prompt", XYPROM, 0 }, -#endif /* NOFRILLS */ -#ifndef NOXFER - { "protocol", XYPROTO, 0 }, -#endif /* NOXFER */ - { "q", XYQUIE, CM_INV|CM_ABR }, -#ifndef NOXFER - { "q8flag", XYQ8FLG, CM_INV }, -#endif /* NOXFER */ -#ifdef QNX - { "qnx-port-lock", XYQNXPL, 0 }, -#else - { "qnx-port-lock", XYQNXPL, CM_INV }, -#endif /* QNX */ - { "quiet", XYQUIE, 0 }, -#ifndef NOXFER - { "rec", XYRECV, CM_INV|CM_ABR }, - { "receive", XYRECV, 0 }, - { "recv", XYRECV, CM_INV }, -#endif /* NOXFER */ - { "reliable", XYRELY, 0 }, -#ifndef NOXFER - { "repeat", XYREPT, 0 }, - { "retry-limit", XYRETR, 0 }, -#endif /* NOXFER */ -#ifdef CKROOT - { "root", XYROOT, 0 }, -#endif /* CKROOT */ -#ifndef NOSCRIPT - { "script", XYSCRI, CM_LOC }, -#endif /* NOSCRIPT */ -#ifndef NOXFER - { "send", XYSEND, 0 }, -#ifndef NOLOCAL -#ifndef NOSERVER - { "ser", XYSERV, CM_INV|CM_ABR }, -#endif /* NOSERVER */ -#endif /* NOXFER */ - { "serial", XYSERIAL,CM_LOC }, -#endif /* NOLOCAL */ -#ifndef NOSERVER - { "server", XYSERV, 0 }, -#endif /* NOSERVER */ -#ifdef SESLIMIT -#ifndef NOLOCAL - { "session-l", XYSESS, CM_INV|CM_ABR }, -#endif /* NOLOCAL */ - { "session-limit", XYLIMIT, CM_INV|CM_LOC }, /* Session Limit */ -#endif /* SESLIMIT */ - -#ifndef NOLOCAL - { "session-log", XYSESS, CM_LOC }, -#endif /* NOLOCAL */ - -#ifndef NOSPL -#ifndef NOSEXP - { "sexpression", XYSEXP, CM_INV }, -#endif /* NOSEXP */ -#endif /* NOSPL */ - - { "sleep", XYSLEEP, 0 }, - -#ifndef NOLOCAL - { "speed", XYSPEE, CM_LOC }, -#endif /* NOLOCAL */ - -#ifdef ANYSSH - { "ssh", XYSSH, 0 }, -#endif /* ANYSSH */ - -#ifndef NOSPL - { "startup-file", XYSTARTUP, CM_INV }, -#endif /* NOSPL */ - -#ifndef NOLOCAL -#ifdef HWPARITY - { "stop-bits", XYSTOP, CM_LOC }, -#else -#ifdef TN_COMPORT - { "stop-bits", XYSTOP, CM_LOC }, -#endif /* TN_COMPORT */ -#endif /* HWPARITY */ -#endif /* NOLOCAL */ - -#ifndef NOXFER -#ifdef STREAMING - { "streaming", XYSTREAM, 0 }, -#endif /* STREAMING */ -#endif /* NOXFER */ - -#ifndef NOJC - { "suspend", XYSUSP, CM_PSH }, -#endif /* NOJC */ -#ifdef CKSYSLOG - { "syslog", XYSYSL, CM_INV }, -#endif /* CKSYSLOG */ - { "take", XYTAKE, 0 }, - -#ifdef CK_TAPI - { "tapi", XYTAPI, CM_LOC }, -#endif /* CK_TAPI */ - -#ifndef NOTCPOPTS -#ifdef TCPSOCKET - { "tcp", XYTCP, CM_LOC }, -#endif /* TCPSOCKET */ -#endif /* NOTCPOPTS */ - -#ifdef TNCODE - { "tel", XYTEL, CM_INV|CM_ABR }, - { "telnet", XYTEL, 0 }, - { "telopt", XYTELOP, 0 }, -#endif /* TNCODE */ - -#ifndef NOSPL - { "temp-directory", XYTMPDIR,0 }, -#endif /* NOSPL */ - -#ifndef NOLOCAL - { "terminal", XYTERM, CM_LOC }, -#endif /* NOLOCAL */ - -#ifdef OS2 - { "title", XYTITLE, CM_LOC }, -#endif /* OS2 */ -#ifdef TLOG - { "transaction-log", XYTLOG, 0 }, -#endif /* TLOG */ -#ifndef NOXFER - { "transfer", XYXFER, 0 }, -#endif /* NOXFER */ -#ifndef NOXMIT - { "transmit", XYXMIT, 0 }, -#endif /* NOXMIT */ -#ifndef NOXFER -#ifndef NOCSETS - { "unknown-char-set", XYUNCS, 0 }, -#endif /* NOCSETS */ -#endif /* NOXFER */ - { "wait", XYSLEEP, CM_INV }, -#ifndef NOPUSH -#ifdef UNIX - { "wildcard-expansion", XYWILD, 0 }, -#endif /* UNIX */ -#endif /* NOPUSH */ -#ifdef NT - { "w", XYWIND, CM_INV|CM_ABR }, - { "wi", XYWIND, CM_INV|CM_ABR }, - { "win", XYWIND, CM_INV|CM_ABR }, -#endif /* NT */ - { "window-size", XYWIND, 0 }, -#ifdef NT - { "win95", XYWIN95, 0 }, -#endif /* NT */ -#ifdef ANYX25 - { "x.25", XYX25, CM_LOC }, - { "x25", XYX25, CM_INV|CM_LOC }, -#endif /* ANYX25 */ - { "xfer", XYXFER, CM_INV }, -#ifndef NOXMIT - { "xmit", XYXMIT, CM_INV }, -#endif /* NOXMIT */ - { "", 0, 0 } -}; -int nprm = (sizeof(prmtab) / sizeof(struct keytab)) - 1; /* How many */ - -struct keytab scntab[] = { /* Screen commands */ - { "clear", SCN_CLR, 0 }, - { "cleol", SCN_CLE, 0 }, - { "move-to", SCN_MOV, 0 } -}; -int nscntab = (sizeof(scntab) / sizeof(struct keytab)); /* How many */ - -#ifdef ANYSSH /* SSH command table */ -#ifdef SSHBUILTIN -int ssh_pf_lcl_n = 0, - ssh_pf_rmt_n = 0; -struct ssh_pf ssh_pf_lcl[32] = { 0, NULL, 0 }; /* SSH Port Forwarding */ -struct ssh_pf ssh_pf_rmt[32] = { 0, NULL, 0 }; /* structs... */ -extern char * ssh_hst, * ssh_cmd, * ssh_prt; -extern int ssh_ver, ssh_xfw; -char * ssh_tmpuid = NULL, *ssh_tmpcmd = NULL, *ssh_tmpport = NULL, - * ssh_tmpstr = NULL; - -int - sshk_type = SSHKT_2D, /* SSH KEY CREATE /TYPE:x */ - sshk_bits = 1024, /* SSH KEY CREATE /BITS:n */ - sshk_din = SKDF_OSSH, /* SSH KEY DISPLAY /IN-FORMAT: */ - sshk_dout = SKDF_OSSH; /* SSH KEY DISPLAY /OUT-FORMAT: */ - -char - * sshk1_comment = NULL, /* SSH V1 COMMENT */ - * sshkp_old = NULL, /* Old key passphrase */ - * sshkp_new = NULL, /* New key passphrase */ - * sshkc_pass = NULL, /* KEY CREATE /PASS:xxx */ - * sshkc_comm = NULL, /* KEY CREATE /V1-RSA-COMMENT:xxx */ - * sshd_file = NULL, /* DISPLAY file */ - * sshk_file = NULL; /* SSH CREATE KEY file */ - -static struct keytab sshclr[] = { - { "local-port-forward", SSHC_LPF, 0 }, - { "remote-port-forward", SSHC_RPF, 0 }, - { "", 0, 0 } -}; -static int nsshclr = (sizeof(sshclr) / sizeof(struct keytab)) - 1; - -struct keytab sshopnsw[] = { - { "/command", SSHSW_CMD, CM_ARG }, - { "/password", SSHSW_PWD, CM_ARG }, - { "/subsystem", SSHSW_SUB, CM_ARG }, - { "/user", SSHSW_USR, CM_ARG }, - { "/version", SSHSW_VER, CM_ARG }, - { "/x11-forwarding", SSHSW_X11, CM_ARG }, - { "", 0, 0 } -}; -int nsshopnsw = (sizeof(sshopnsw) / sizeof(struct keytab)) - 1; - -static struct keytab sshkwtab[] = { - { "add", XSSH_ADD, 0 }, - { "agent", XSSH_AGT, 0 }, - { "clear", XSSH_CLR, 0 }, - { "forward-local-port", XSSH_FLP, CM_INV }, - { "forward-remote-port", XSSH_FRP, CM_INV }, - { "key", XSSH_KEY, 0 }, - { "open", XSSH_OPN, 0 }, - { "v2", XSSH_V2, 0 }, - { "", 0, 0 } -}; -static int nsshcmd = (sizeof(sshkwtab) / sizeof(struct keytab)) - 1; - -static struct keytab ssh2tab[] = { - { "rekey", XSSH2_RKE, 0 }, - { "", 0, 0 } -}; -static int nssh2tab = (sizeof(ssh2tab) / sizeof(struct keytab)); - -static struct keytab addfwd[] = { /* SET SSH ADD command table */ - { "local-port-forward", SSHF_LCL, 0 }, - { "remote-port-forward", SSHF_RMT, 0 }, - { "", 0, 0 } -}; -static int naddfwd = (sizeof(addfwd) / sizeof(struct keytab)) - 1; - -static struct keytab sshagent[] = { /* SET SSH AGENT command table */ - { "add", SSHA_ADD, 0 }, - { "delete", SSHA_DEL, 0 }, - { "list", SSHA_LST, 0 }, - { "", 0, 0 } -}; -static int nsshagent = (sizeof(sshagent) / sizeof(struct keytab)) - 1; - -static struct keytab sshagtsw[] = { /* SET SSH AGENT LIST switch table */ - { "/fingerprint", SSHASW_FP, 0 }, - { "", 0, 0 } -}; -static int nsshagtsw = (sizeof(sshagtsw) / sizeof(struct keytab)) - 1; - -static struct keytab sshkey[] = { /* SET SSH KEY command table */ - { "change-passphrase", SSHK_PASS, 0 }, - { "create", SSHK_CREA, 0 }, - { "display", SSHK_DISP, 0 }, - { "v1", SSHK_V1, 0 }, - { "", 0, 0 } -}; -static int nsshkey = (sizeof(sshkey) / sizeof(struct keytab)) - 1; - -static struct keytab sshkv1[] = { /* SET SSH KEY V1 command table */ - { "set-comment", 1, 0 } -}; - -static struct keytab sshkpsw[] = { /* SET SSH KEY PASSPHRASE table */ - { "/new-passphrase", 2, CM_ARG }, - { "/old-passphrase", 1, CM_ARG } -}; - -static struct keytab sshkcrea[] = { /* SSH KEY CREATE table */ - { "/bits", SSHKC_BI, CM_ARG }, - { "/passphrase", SSHKC_PP, CM_ARG }, - { "/type", SSHKC_TY, CM_ARG }, - { "/v1-rsa-comment", SSHKC_1R, CM_ARG } -}; -static int nsshkcrea = (sizeof(sshkcrea) / sizeof(struct keytab)); - -static struct keytab sshkcty[] = { /* SSH KEY CREATE /TYPE:xxx */ - { "srp", SSHKT_SRP, 0 }, - { "v1-rsa", SSHKT_1R, 0 }, - { "v2-dsa", SSHKT_2D, 0 }, - { "v2-rsa", SSHKT_2R, 0 } -}; -static int nsshkcty = (sizeof(sshkcty) / sizeof(struct keytab)); - -static struct keytab sshdswi[] = { /* SET SSH KEY DISPLAY /switches */ - { "/format", SSHKD_OUT, CM_ARG } -}; -static int nsshdswi = (sizeof(sshdswi) / sizeof(struct keytab)); - -#ifdef COMMENT -static struct keytab sshdifmt[] = { /* SSH KEY DISPLAY /IN-FORMAT: */ - { "openssh", SKDF_OSSH, 0 }, - { "ssh.com", SKDF_SSHC, 0 } -}; -static int nsshdifmt = (sizeof(sshdifmt) / sizeof(struct keytab)); -#endif /* COMMENT */ - -static struct keytab sshdofmt[] = { /* SSH KEY DISPLAY /IN-FORMAT: */ - { "fingerprint", SKDF_FING, 0 }, - { "ietf", SKDF_IETF, 0 }, - { "openssh", SKDF_OSSH, 0 }, - { "ssh.com", SKDF_SSHC, 0 } -}; -static int nsshdofmt = (sizeof(sshdofmt) / sizeof(struct keytab)); - -static struct keytab sshkermit[] = { /* SKERMIT */ - { "open", SKRM_OPN, 0 } -}; -static int nsshkermit = (sizeof(sshkermit) / sizeof(struct keytab)); - -struct keytab sshkrmopnsw[] = { - { "/password", SSHSW_PWD, CM_ARG }, - { "/user", SSHSW_USR, CM_ARG }, - { "/version", SSHSW_VER, CM_ARG }, - { "", 0, 0 } -}; -int nsshkrmopnsw = (sizeof(sshkrmopnsw) / sizeof(struct keytab)) - 1; -#endif /* SSHBUILTIN */ - -#ifdef SFTP_BUILTIN -static struct keytab sftpkwtab[] = { /* SFTP */ - { "cd", SFTP_CD, 0 }, - { "chgrp", SFTP_CHGRP, 0 }, - { "chmod", SFTP_CHMOD, 0 }, - { "chown", SFTP_CHOWN, 0 }, - { "delete", SFTP_RM, 0 }, - { "dir", SFTP_DIR, 0 }, - { "get", SFTP_GET, 0 }, - { "mkdir", SFTP_MKDIR, 0 }, - { "open", SFTP_OPN, 0 }, - { "put", SFTP_PUT, 0 }, - { "pwd", SFTP_PWD, 0 }, - { "rename", SFTP_REN, 0 }, - { "rm", SFTP_RM, CM_INV }, - { "rmdir", SFTP_RMDIR, 0 }, - { "symlink", SFTP_LINK, 0 }, - { "version", SFTP_VER, 0 } -}; -static int nsftpkwtab = (sizeof(sftpkwtab) / sizeof(struct keytab)); -#endif /* SFTP_BUILTIN */ -#endif /* ANYSSH */ - -#ifdef NETCONN -struct keytab netkey[] = { /* SET NETWORK table */ - { "directory", XYNET_D, 0 }, - { "type", XYNET_T, 0 } -}; -int nnetkey = (sizeof(netkey) / sizeof(struct keytab)); - -struct keytab netcmd[] = { -/* - These are the network types. -*/ -#ifdef NETCMD - { "command", NET_CMD, CM_INV }, /* Command */ -#endif /* NETCMD */ - -#ifdef DECNET /* DECnet / PATHWORKS */ - { "decnet", NET_DEC, 0 }, -#endif /* DECNET */ - -#ifdef NETDLL - { "dll", NET_DLL, CM_INV }, /* DLL to be loaded */ -#endif /* NETDLL */ - -#ifdef NETFILE - { "file", NET_FILE, CM_INV }, /* FILE (real crude) */ -#endif /* NETFILE */ - -#ifdef NPIPE /* Named Pipes */ - { "named-pipe", NET_PIPE, 0 }, -#endif /* NPIPE */ - -#ifdef CK_NETBIOS - { "netbios", NET_BIOS, 0 }, /* NETBIOS */ -#endif /* CK_NETBIOS */ - -#ifdef DECNET /* DECnet / PATHWORKS (alias) */ - { "pathworks", NET_DEC, CM_INV }, -#endif /* DECNET */ - -#ifdef NETCMD - { "pipe", NET_CMD, 0 }, /* Pipe */ -#endif /* NETCMD */ - -#ifdef NETPTY - { "pseudoterminal",NET_PTY, 0 }, /* Pseudoterminal */ -#endif /* NETPTY */ - -#ifdef NETPTY - { "pty", NET_PTY, CM_INV }, /* Inv syn for pseudoterm */ -#endif /* NETPTY */ - -#ifdef SSHBUILTIN - { "ssh", NET_SSH, 0 }, -#endif /* SSHBUILTIN */ - -#ifdef SUPERLAT - { "superlat", NET_SLAT, 0 }, /* Meridian Technologies' SuperLAT */ -#endif /* SUPERLAT */ - -#ifdef TCPSOCKET /* TCP/IP sockets library */ - { "tcp/ip", NET_TCPB, 0 }, -#endif /* TCPSOCKET */ -#ifdef SUPERLAT - { "tes32", NET_SLAT, 0 }, /* Emulux TES32 */ -#endif /* SUPERLAT */ -#ifdef ANYX25 /* X.25 */ -#ifdef SUNX25 - { "x", NET_SX25, CM_INV|CM_ABR }, - { "x.25", NET_SX25, 0 }, - { "x25", NET_SX25, CM_INV }, -#else -#ifdef STRATUSX25 - { "x", NET_VX25, CM_INV|CM_ABR }, - { "x.25", NET_VX25, 0 }, - { "x25", NET_VX25, CM_INV }, -#endif /* STRATUSX25 */ -#endif /* SUNX25 */ -#ifdef IBMX25 - { "x", NET_IX25, CM_INV|CM_ABR }, - { "x.25", NET_IX25, CM_INV }, - { "x25", NET_IX25, CM_INV }, -#endif /* IBMX25 */ -#ifdef HPX25 - { "x", NET_IX25, CM_INV|CM_ABR }, - { "x.25", NET_IX25, 0 }, - { "x25", NET_IX25, CM_INV }, -#endif /* HPX25 */ -#endif /* ANYX25 */ - { "", 0, 0 } -}; -int nnets = (sizeof(netcmd) / sizeof(struct keytab)); - -#ifndef NOTCPOPTS -#ifdef TCPSOCKET - -/* TCP options */ - -struct keytab tcpopt[] = { - { "address", XYTCP_ADDRESS, 0 }, -#ifdef CK_DNS_SRV - { "dns-service-records", XYTCP_DNS_SRV, 0 }, -#endif /* CK_DNS_SRV */ -#ifdef SO_DONTROUTE - { "dontroute", XYTCP_DONTROUTE, 0 }, -#endif /* SO_DONTROUTE */ -#ifndef NOHTTP - { "http-proxy", XYTCP_HTTP_PROXY, 0 }, -#endif /* NOHTTP */ -#ifdef SO_KEEPALIVE - { "keepalive", XYTCP_KEEPALIVE, 0 }, -#endif /* SO_KEEPALIVE */ -#ifdef SO_LINGER - { "linger", XYTCP_LINGER, 0 }, -#endif /* SO_LINGER */ -#ifdef TCP_NODELAY - { "nagle", XYTCP_NAGLE, CM_INV }, - { "nodelay", XYTCP_NODELAY, 0 }, -#endif /* TCP_NODELAY */ - { "reverse-dns-lookup", XYTCP_RDNS, 0 }, -#ifdef SO_RCVBUF - { "recvbuf", XYTCP_RECVBUF, 0 }, -#endif /* SO_RCVBUF */ -#ifdef SO_SNDBUF - { "sendbuf", XYTCP_SENDBUF, 0 }, -#endif /* SO_SNDBUF */ -#ifdef NT -#ifdef CK_SOCKS - { "socks-server", XYTCP_SOCKS_SVR, 0 }, -#endif /* CK_SOCKS */ -#endif /* NT */ -#ifdef VMS -#ifdef DEC_TCPIP - { "ucx-port-bug", XYTCP_UCX, 0 }, -#endif /* DEC_TCPIP */ -#endif /* VMS */ - { "",0,0 } -}; -int ntcpopt = (sizeof(tcpopt) / sizeof(struct keytab)); -#endif /* TCPSOCKET */ -#endif /* NOTCPOPTS */ -#endif /* NETCONN */ - -#ifdef OS2 -/* K95 Manual Chapter Table -- Keep these two tables in sync! */ - -static char * linktbl[] = { /* Internal links in k95.htm */ - "#top", /* 00 */ - "#what", /* 01 */ - "#install", /* 02 */ - "#start", /* 03 */ - "#dialer", /* 04 */ - "#entries", /* 05 */ - "#command", /* 06 */ - "#terminal", /* 07 */ - "#transfer", /* 08 */ - "#hostmode" /* 09 */ -}; - -static struct keytab chaptbl[] = { - { "Command-Screen", 6, 0 }, - { "Contents", 0, 0 }, - { "Dialer-Entries", 5, 0 }, - { "File-Transfer", 8, 0 }, - { "Getting-Started", 3, 0 }, - { "Host-Mode", 9, 0 }, - { "Installation", 2, 0 }, - { "Terminal-Emulation", 7, 0 }, - { "Using-The-Dialer", 4, 0 }, - { "What-Is-K95", 1, 0 }, - { "", 0, 0 } -}; -static int nchaptbl = (sizeof(chaptbl) / sizeof(struct keytab) - 1); -#endif /* OS2 */ - -#ifndef NOXFER -/* Remote Command Table */ - -struct keytab remcmd[] = { -#ifndef NOSPL - { "as", XZASG, CM_INV|CM_ABR }, - { "asg", XZASG, CM_INV }, - { "assign", XZASG, 0 }, -#endif /* NOSPL */ - { "cd", XZCWD, 0 }, - { "cdup", XZCDU, CM_INV }, - { "copy", XZCPY, 0 }, - { "cwd", XZCWD, CM_INV }, - { "delete", XZDEL, 0 }, - { "directory", XZDIR, 0 }, - { "e", XZXIT, CM_ABR|CM_INV }, - { "erase", XZDEL, CM_INV }, - { "exit", XZXIT, 0 }, - { "help", XZHLP, 0 }, -#ifndef NOPUSH - { "host", XZHOS, 0 }, -#endif /* NOPUSH */ -#ifndef NOFRILLS - { "kermit", XZKER, 0 }, - { "l", XZLGI, CM_ABR|CM_INV }, - { "lo", XZLGI, CM_ABR|CM_INV }, - { "log", XZLGI, CM_ABR|CM_INV }, - { "login", XZLGI, 0 }, - { "logout", XZLGO, 0 }, - { "mkdir", XZMKD, 0 }, - { "print", XZPRI, 0 }, -#endif /* NOFRILLS */ - { "pwd", XZPWD, 0 }, -#ifndef NOSPL - { "query", XZQUE, 0 }, -#endif /* NOSPL */ - { "rename", XZREN, 0 }, - { "rmdir", XZRMD, 0 }, - { "set", XZSET, 0 }, - { "space", XZSPA, 0 }, -#ifndef NOFRILLS - { "type", XZTYP, 0 }, - { "who", XZWHO, 0 }, -#endif /* NOFRILLS */ - { "", 0, 0} -}; -int nrmt = (sizeof(remcmd) / sizeof(struct keytab)) - 1; -#endif /* NOXFER */ - -struct keytab logtab[] = { -#ifdef CKLOGDIAL - { "connections", LOGM, CM_INV }, - { "cx", LOGM, 0 }, -#endif /* CKLOGDIAL */ -#ifdef DEBUG - { "debugging", LOGD, 0 }, -#endif /* DEBUG */ - { "packets", LOGP, 0 }, -#ifndef NOLOCAL - { "session", LOGS, 0 }, -#endif /* NOLOCAL */ -#ifdef TLOG - { "transactions", LOGT, 0 }, -#endif /* TLOG */ - { "", 0, 0 } -}; -int nlog = (sizeof(logtab) / sizeof(struct keytab)) - 1; - -struct keytab writab[] = { -#ifndef NOSPL - { "append-file", LOGW, CM_INV }, -#endif /* NOSPL */ - { "debug-log", LOGD, 0 }, - { "error", LOGE, 0 }, -#ifndef NOSPL - { "file", LOGW, 0 }, -#endif /* NOSPL */ - { "packet-log", LOGP, 0 }, - { "screen", LOGX, 0 }, -#ifndef NOLOCAL - { "session-log", LOGS, 0 }, -#endif /* NOLOCAL */ - { "sys$output", LOGX, CM_INV }, - { "t", LOGT, CM_ABR|CM_INV }, /* Because of a typo in */ - { "tr", LOGT, CM_ABR|CM_INV }, /* the book... */ - { "tra", LOGT, CM_ABR|CM_INV }, - { "tran", LOGT, CM_ABR|CM_INV }, - { "trans", LOGT, CM_ABR|CM_INV }, - { "transa", LOGT, CM_ABR|CM_INV }, - { "transac", LOGT, CM_ABR|CM_INV }, - { "transact", LOGT, CM_ABR|CM_INV }, - { "transacti", LOGT, CM_ABR|CM_INV }, - { "transactio", LOGT, CM_ABR|CM_INV }, - { "transaction", LOGT, CM_ABR|CM_INV }, - { "transaction-log", LOGT, 0 }, - { "transactions", LOGT, CM_INV } -}; -int nwri = (sizeof(writab) / sizeof(struct keytab)); - -#ifdef COMMENT /* INPUT switches not used yet... */ -static struct keytab inswtab[] = { -#ifdef COMMENT - { "/assign", IN_ASG, CM_ARG }, -#endif /* COMMENT */ - { "/autodownload", IN_ADL, CM_ARG }, - { "/case", IN_CAS, CM_ARG }, - { "/echo", IN_ECH, CM_ARG }, - { "/interrupts", IN_NOI, CM_ARG }, - { "/silence", IN_SIL, CM_ARG }, -#ifdef COMMENT - { "/pattern", IN_PAT, CM_ARG }, -#endif /* COMMENT */ - { "", 0, 0 } -}; -static int ninswtab = (sizeof(inswtab) / sizeof(struct keytab)) - 1; -#endif /* COMMENT */ - -static struct keytab clrtab[] = { /* Keywords for CLEAR command */ -#ifndef NOSPL - { "alarm", CLR_ALR, 0 }, -#ifdef CK_APC - { "apc", CLR_APC, 0 }, -#endif /* CK_APC */ -#ifdef PATTERNS - { "binary-patterns", CLR_BIN, 0 }, -#endif /* PATTERNS */ - { "both", CLR_DEV|CLR_INP, CM_INV }, -#endif /* NOSPL */ -#ifdef OS2 - { "command-screen", CLR_CMD, 0 }, -#endif /* OS2 */ -#ifndef NOSPL - { "device", CLR_DEV, CM_INV|CM_ABR }, - { "device-and-input", CLR_DEV|CLR_INP, 0 }, -#endif /* NOSPL */ - { "device-buffer", CLR_DEV, 0 }, -#ifndef NODIAL - { "dial-status", CLR_DIA, 0 }, -#endif /* NODIAL */ -#ifndef NOSPL - { "input-buffer", CLR_INP, 0 }, -#endif /* NOSPL */ - { "keyboard-buffer", CLR_KBD, 0 }, - { "send-list", CLR_SFL, 0 }, -#ifdef OS2 - { "scr", CLR_SCL, CM_INV|CM_ABR }, -#endif /* OS2 */ - { "screen", CLR_SCR, 0 }, -#ifdef OS2 - { "scrollback", CLR_SCL, CM_INV }, - { "terminal-screen", CLR_TRM, 0 }, -#endif /* OS2 */ -#ifdef PATTERNS - { "text-patterns", CLR_TXT, 0 }, -#endif /* PATTERNS */ - { "", 0, 0 } -}; -int nclear = (sizeof(clrtab) / sizeof(struct keytab)) - 1; - -struct keytab clstab[] = { /* Keywords for CLOSE command */ -#ifndef NOSPL - { "!read", LOGR, CM_INV }, - { "!write", LOGW, CM_INV }, -#ifndef NOPUSH -#endif /* NOPUSH */ -#endif /* NOSPL */ -#ifndef NOSPL - { "append-file", LOGW, CM_INV }, -#endif /* NOSPL */ -#ifndef NOLOCAL - { "connection", 9999, 0 }, -#endif /* NOLOCAL */ -#ifdef CKLOGDIAL - { "cx-log", LOGM, 0 }, -#endif /* CKLOGDIAL */ -#ifdef DEBUG - { "debug-log", LOGD, 0 }, -#endif /* DEBUG */ - { "host", 9999, CM_INV }, /* Synonym for CLOSE CONNECTION */ - { "line", 9999, CM_INV }, /* Synonym for CLOSE CONNECTION */ - { "p", LOGP, CM_INV|CM_ABR }, - { "packet-log", LOGP, 0 }, - { "port", 9999, CM_INV }, /* Synonym for CLOSE CONNECTION */ -#ifndef NOSPL - { "read-file", LOGR, 0 }, -#endif /* NOSPL */ -#ifndef NOLOCAL - { "session-log", LOGS, 0 }, -#endif /* NOLOCAL */ -#ifdef TLOG - { "t", LOGT, CM_ABR|CM_INV }, /* Because of a typo in */ - { "tr", LOGT, CM_ABR|CM_INV }, /* the book... */ - { "tra", LOGT, CM_ABR|CM_INV }, - { "tran", LOGT, CM_ABR|CM_INV }, - { "trans", LOGT, CM_ABR|CM_INV }, - { "transa", LOGT, CM_ABR|CM_INV }, - { "transac", LOGT, CM_ABR|CM_INV }, - { "transact", LOGT, CM_ABR|CM_INV }, - { "transacti", LOGT, CM_ABR|CM_INV }, - { "transactio", LOGT, CM_ABR|CM_INV }, - { "transaction", LOGT, CM_ABR|CM_INV }, - { "transaction-log", LOGT, 0 }, - { "transactions", LOGT, CM_INV }, -#endif /* TLOG */ -#ifndef NOSPL - { "write-file", LOGW, 0 }, -#endif /* NOSPL */ - { "", 0, 0 } -}; -int ncls = (sizeof(clstab) / sizeof(struct keytab)) - 1; - -/* SHOW command arguments */ - -#ifndef NOSHOW -struct keytab shotab[] = { -#ifndef NOSPL - { "alarm", SHALRM, 0 }, - { "arg", SHARG, CM_INV|CM_ABR }, - { "arguments", SHARG, 0 }, - { "args", SHARG, CM_INV }, - { "arrays", SHARR, 0 }, -#endif /* NOSPL */ - -#ifndef NOCSETS - { "associations", SHASSOC, 0 }, -#endif /* NOCSETS */ - -#ifndef NOXFER - { "attributes", SHATT, 0 }, -#endif /* NOXFER */ - -#ifdef CK_AUTHENTICATION - { "authentication", SHOAUTH, CM_INV }, -#endif /* CK_AUTHENTICATION */ - -#ifndef NOPUSH -#ifdef BROWSER - { "browser", SHBROWSE, CM_PSH|CM_LOC }, -#endif /* BROWSER */ -#endif /* NOPUSH */ - { "cd", SHCD, 0 }, - { "character-sets", SHCSE, 0 }, - { "cmd", SHCMD, CM_INV }, -#ifndef NOLOCAL - { "com", SHCOM, CM_INV|CM_ABR }, - { "comm", SHCOM, CM_INV|CM_ABR }, - { "communications", SHCOM, 0 }, -#endif /* NOLOCAL */ - { "command", SHCMD, 0 }, - { "connection", SHCONNX, 0 }, -#ifdef CK_SPEED - { "control-prefixing", SHCTL, 0 }, -#endif /* CK_SPEED */ -#ifdef CKLOGDIAL - { "cx", SHCONNX, CM_INV }, -#endif /* CKLOGDIAL */ -#ifndef NOSPL - { "count", SHCOU, 0 }, -#endif /* NOSPL */ - { "d", SHDIA, CM_INV|CM_ABR }, -#ifdef VMS - { "default", SHDFLT, 0 }, -#else - { "default", SHDFLT, CM_INV }, -#endif /* VMS */ -#ifndef NODIAL - { "dial", SHDIA, CM_LOC }, -#endif /* NODIAL */ - { "double/ignore",SHDBL, 0 }, -#ifndef NOPUSH -#ifndef NOFRILLS - { "editor", SHEDIT, CM_PSH }, -#endif /* NOFRILLS */ -#endif /* NOPUSH */ -#ifndef NOLOCAL - { "escape", SHESC, CM_LOC }, -#endif /* NOLOCAL */ - { "exit", SHEXI, 0 }, - { "extended-options", SHXOPT, CM_INV }, - { "features", SHFEA, 0 }, - { "file", SHFIL, 0 }, -#ifndef NOLOCAL - { "flow-control", SHOFLO, 0 }, -#endif /* NOLOCAL */ -#ifdef BROWSER - { "ftp", SHOFTP, CM_PSH|CM_LOC }, -#else -#ifndef NOFTP -#ifndef SYSFTP -#ifdef TCPSOCKET - { "ftp", SHOFTP, 0 }, /* (built-in ftp) */ -#endif /* TCPSOCKET */ -#endif /* SYSFTP */ -#endif /* NOFTP */ -#endif /* BROWSER */ -#ifndef NOSPL - { "functions", SHFUN, 0 }, - { "globals", SHVAR, 0 }, -#endif /* NOSPL */ -#ifdef KUI - { "gui", SHOGUI, 0 }, -#endif /* KUI */ -#ifdef CK_RECALL - { "history", SHHISTORY, 0 }, -#endif /* CK_RECALL */ - { "ignore/double",SHDBL, CM_INV }, - { "iksd", SHOIKS, CM_INV }, -#ifndef NOSPL - { "input", SHINP, 0 }, -#endif /* NOSPL */ -#ifndef NOSETKEY - { "k", SHKEY, CM_INV|CM_ABR }, - { "key", SHKEY, 0 }, -#ifndef NOKVERBS - { "kverbs", SHKVB, 0 }, -#endif /* NOKVERBS */ -#endif /* NOSETKEY */ -#ifdef CK_LABELED - { "labeled-file-info", SHLBL, 0 }, -#endif /* CK_LABELED */ -#ifndef NOCSETS - { "languages", SHLNG, 0 }, -#endif /* NOCSETS */ - { "logs", SHLOG, 0 }, -#ifndef NOSPL - { "macros", SHMAC, 0 }, -#endif /* NOSPL */ -#ifndef NODIAL - { "modem", SHMOD, CM_LOC }, -#else - { "modem-signals",SHCOM, CM_INV|CM_LOC }, -#endif /* NODIAL */ -#ifndef NOLOCAL -#ifdef OS2MOUSE - { "mouse", SHMOU, CM_LOC }, -#endif /* OS2MOUSE */ -#endif /* NOLOCAL */ -#ifdef NETCONN - { "network", SHNET, CM_LOC }, -#else - { "network", SHNET, CM_INV|CM_LOC }, -#endif /* NETCONN */ - { "options", SHOPTS, 0 }, -#ifndef NOSPL - { "output", SHOUTP, CM_INV }, -#endif /* NOSPL */ -#ifdef ANYX25 -#ifndef IBMX25 - { "pad", SHPAD, CM_LOC }, -#endif /* IBMX25 */ -#endif /* ANYX25 */ - { "parameters", SHPAR, CM_INV }, -#ifdef PATTERNS - { "patterns", SHOPAT, 0 }, -#endif /* PATTERNS */ - { "printer", SHPRT, 0 }, -#ifdef CK_SPEED - { "prefixing", SHCTL, CM_INV }, -#endif /* CK_SPEED */ -#ifndef NOXFER - { "protocol", SHPRO, 0 }, -#endif /* NOXFER */ -#ifndef NOSPL - { "scripts", SHSCR, CM_LOC }, -#endif /* NOSPL */ - { "send-list", SHSFL, 0 }, -#ifndef NOSERVER - { "server", SHSER, 0 }, -#endif /* NOSERVER */ -#ifndef NOSEXP - { "sexpression", SHSEXP, 0 }, -#endif /* NOSEXP */ -#ifdef ANYSSH - { "ssh", SHOSSH, 0 }, -#endif /* ANYSSH */ - { "stack", SHSTK, 0 }, - { "status", SHSTA, 0 }, -#ifdef STREAMING - { "streaming", SHOSTR, 0 }, -#endif /* STREAMING */ -#ifndef NOLOCAL -#ifdef OS2 - { "tabs", SHTAB, CM_INV|CM_LOC }, -#endif /* OS2 */ -#ifdef CK_TAPI - { "tapi", SHTAPI, CM_LOC }, - { "tapi-comm", SHTAPI_C, CM_INV|CM_LOC }, - { "tapi-location", SHTAPI_L, CM_INV|CM_LOC }, - { "tapi-modem", SHTAPI_M, CM_INV|CM_LOC }, -#endif /* CK_TAPI */ - { "tcp", SHTCP, CM_LOC }, -#ifdef TNCODE - { "tel", SHTEL, CM_INV|CM_ABR }, - { "telnet", SHTEL, 0 }, - { "telopt", SHTOPT, 0 }, -#endif /* TNCODE */ - { "terminal", SHTER, CM_LOC }, -#endif /* NOLOCAL */ -#ifndef NOXMIT - { "tr", SHXMI, CM_INV|CM_ABR }, - { "tra", SHXMI, CM_INV|CM_ABR }, - { "tran", SHXMI, CM_INV|CM_ABR }, - { "trans", SHXMI, CM_INV|CM_ABR }, -#endif /* NOXMIT */ -#ifndef NOXFER - { "transfer", SHOXFER, 0 }, -#endif /* NOXFER */ -#ifndef NOXMIT - { "transmit", SHXMI, 0 }, -#endif /* NOXMIT */ -#ifdef CK_TRIGGER - { "trigger", SHTRIG, CM_LOC }, -#endif /* CK_TRIGGER */ -#ifndef NOSETKEY -#ifndef NOKVERBS -#ifdef OS2 - { "udk", SHUDK, CM_LOC }, -#endif /* OS2 */ -#endif /* NOKVERBS */ -#endif /* NOSETKEY */ -#ifndef NOSPL - { "variables", SHBUI, 0 }, -#endif /* NOSPL */ -#ifndef NOFRILLS - { "versions", SHVER, 0 }, -#endif /* NOFRILLS */ -#ifdef OS2 - { "vscrn", SHVSCRN, CM_INV|CM_LOC }, -#endif /* OS2 */ - { "xfer", SHOXFER, CM_INV }, -#ifndef NOXMIT - { "xmit", SHXMI, CM_INV }, -#endif /* NOXMIT */ - { "", 0, 0 } -}; -int nsho = (sizeof(shotab) / sizeof(struct keytab)) - 1; -#endif /* NOSHOW */ - -#ifdef ANYX25 -#ifndef IBMX25 -struct keytab padtab[] = { /* PAD commands */ - { "clear", XYPADL, 0 }, - { "interrupt", XYPADI, 0 }, - { "reset", XYPADR, 0 }, - { "status", XYPADS, 0 } -}; -int npadc = (sizeof(padtab) / sizeof(struct keytab)); -#endif /* IBMX25 */ -#endif /* ANYX25 */ - -#ifndef NOSERVER -static struct keytab kmstab[] = { - { "both", 3, 0 }, - { "local", 1, 0 }, - { "remote", 2, 0 } -}; - -static struct keytab enatab[] = { /* ENABLE commands */ - { "all", EN_ALL, 0 }, -#ifndef NOSPL - { "as", EN_ASG, CM_INV|CM_ABR }, - { "asg", EN_ASG, CM_INV }, - { "assign", EN_ASG, 0 }, -#endif /* NOSPL */ -#ifndef datageneral - { "bye", EN_BYE, 0 }, -#endif /* datageneral */ - { "cd", EN_CWD, 0 }, -#ifdef ZCOPY - { "copy", EN_CPY, 0 }, -#endif /* ZCOPY */ - { "cwd", EN_CWD, CM_INV }, - { "delete", EN_DEL, 0 }, - { "directory", EN_DIR, 0 }, - { "enable", EN_ENA, CM_INV }, - { "exit", EN_XIT, 0 }, - { "finish", EN_FIN, 0 }, - { "get", EN_GET, 0 }, - { "host", EN_HOS, 0 }, - { "mail", EN_MAI, 0 }, - { "mkdir", EN_MKD, 0 }, - { "print", EN_PRI, 0 }, -#ifndef NOSPL - { "query", EN_QUE, 0 }, -#endif /* NOSPL */ - { "rename", EN_REN, 0 }, - { "retrieve", EN_RET, CM_INV }, - { "rmdir", EN_RMD, 0 }, - { "send", EN_SEN, 0 }, - { "set", EN_SET, 0 }, - { "space", EN_SPA, 0 }, - { "type", EN_TYP, 0 }, - { "who", EN_WHO, 0 } -}; -static int nena = (sizeof(enatab) / sizeof(struct keytab)); -#endif /* NOSERVER */ - -struct keytab txtbin[] = { - { "all", 2, 0 }, - { "binary", 1, 0 }, - { "text", 0, 0 } -}; - -#ifndef NOXFER -static struct keytab sndtab[] = { /* SEND command options */ - { "/after", SND_AFT, CM_ARG }, -#ifndef NOSPL - { "/array", SND_ARR, CM_ARG }, -#endif /* NOSPL */ - { "/as-name", SND_ASN, CM_ARG }, - { "/b", SND_BIN, CM_INV|CM_ABR }, - { "/before", SND_BEF, CM_ARG }, - { "/binary", SND_BIN, 0 }, -#ifdef CALIBRATE - { "/c", SND_CMD, CM_INV|CM_ABR }, - { "/calibrate", SND_CAL, CM_INV|CM_ARG }, -#endif /* CALIBRATE */ - { "/command", SND_CMD, CM_PSH }, - { "/delete", SND_DEL, 0 }, -#ifdef UNIXOROSK - { "/dotfiles", SND_DOT, 0 }, -#endif /* UNIXOROSK */ - { "/except", SND_EXC, CM_ARG }, -#ifdef PIPESEND - { "/filter", SND_FLT, CM_ARG|CM_PSH }, -#endif /* PIPESEND */ - { "/filenames", SND_NAM, CM_ARG }, -#ifdef CKSYMLINK - { "/followlinks", SND_LNK, 0 }, -#endif /* CKSYMLINK */ -#ifdef VMS - { "/image", SND_IMG, 0 }, -#else - { "/image", SND_BIN, CM_INV }, -#endif /* VMS */ -#ifdef CK_LABELED - { "/labeled", SND_LBL, 0 }, -#endif /* CK_LABELED */ - { "/larger-than", SND_LAR, CM_ARG }, - { "/listfile", SND_FIL, CM_ARG }, -#ifndef NOFRILLS - { "/mail", SND_MAI, CM_ARG }, -#endif /* NOFRILLS */ -#ifdef CK_TMPDIR - { "/move-to", SND_MOV, CM_ARG }, -#endif /* CK_TMPDIR */ - { "/nobackupfiles", SND_NOB, 0 }, -#ifdef UNIXOROSK - { "/nodotfiles", SND_NOD, 0 }, -#endif /* UNIXOROSK */ -#ifdef CKSYMLINK - { "/nofollowlinks", SND_NLK, 0 }, -#endif /* CKSYMLINK */ - { "/not-after", SND_NAF, CM_ARG }, - { "/not-before", SND_NBE, CM_ARG }, - { "/pathnames", SND_PTH, CM_ARG }, - { "/print", SND_PRI, CM_ARG }, -#ifdef CK_XYZ - { "/protocol", SND_PRO, CM_ARG }, -#else - { "/protocol", SND_PRO, CM_ARG|CM_INV }, -#endif /* CK_XYZ */ - { "/quiet", SND_SHH, 0 }, - { "/recover", SND_RES, 0 }, -#ifdef RECURSIVE -/* Systems where we do recursion */ - { "/recursive", SND_REC, 0 }, -#else -#ifdef VMS -/* Systems that do recursion themselves without our assistance */ -/* if we give them the right kind of wildcard */ - { "/recursive", SND_REC, 0 }, -#else -#ifdef datageneral - { "/recursive", SND_REC, 0 }, -#else - { "/recursive", SND_REC, CM_INV }, -#endif /* datageneral */ -#endif /* VMS */ -#endif /* RECURSIVE */ - { "/rename-to", SND_REN, CM_ARG }, - { "/since", SND_AFT, CM_INV|CM_ARG }, - { "/smaller-than", SND_SMA, CM_ARG }, - { "/starting-at", SND_STA, CM_ARG }, -#ifndef NOFRILLS - { "/su", SND_ASN, CM_ARG|CM_INV|CM_ABR }, - { "/sub", SND_ASN, CM_ARG|CM_INV|CM_ABR }, - { "/subject", SND_ASN, CM_ARG }, -#endif /* NOFRILLS */ -#ifdef RECURSIVE - { "/subdirectories", SND_REC, CM_INV }, -#endif /* RECURSIVE */ - { "/text", SND_TXT, 0 }, - { "/transparent", SND_XPA, 0 }, - { "/type", SND_TYP, CM_ARG } -}; -#define NSNDTAB sizeof(sndtab)/sizeof(struct keytab) -static int nsndtab = NSNDTAB; - -#ifndef NOMSEND -static struct keytab msndtab[] = { /* MSEND options */ - { "/after", SND_AFT, CM_ARG }, - { "/before", SND_BEF, CM_ARG }, - { "/binary", SND_BIN, 0 }, - { "/delete", SND_DEL, 0 }, - { "/except", SND_EXC, CM_ARG }, - { "/filenames", SND_NAM, CM_ARG }, -#ifdef CKSYMLINK - { "/followlinks", SND_LNK, 0 }, -#endif /* CKSYMLINK */ -#ifdef VMS - { "/image", SND_IMG, 0 }, -#else - { "/image", SND_BIN, CM_INV }, -#endif /* VMS */ -#ifdef CK_LABELED - { "/labeled", SND_LBL, 0 }, -#endif /* CK_LABELED */ - { "/larger-than", SND_LAR, CM_ARG }, - { "/list", SND_FIL, CM_ARG }, -#ifndef NOFRILLS - { "/mail", SND_MAI, CM_ARG }, -#endif /* NOFRILLS */ -#ifdef CK_TMPDIR - { "/move-to", SND_MOV, CM_ARG }, -#endif /* CK_TMPDIR */ -#ifdef CKSYMLINK - { "/nofollowlinks", SND_NLK, 0 }, -#endif /* CKSYMLINK */ - { "/not-after", SND_NAF, CM_ARG }, - { "/not-before", SND_NBE, CM_ARG }, - { "/pathnames", SND_PTH, CM_ARG }, - { "/print", SND_PRI, CM_ARG }, -#ifdef CK_XYZ - { "/protocol", SND_PRO, CM_ARG }, -#endif /* CK_XYZ */ - { "/quiet", SND_SHH, 0 }, - { "/recover", SND_RES, 0 }, - { "/rename-to", SND_REN, CM_ARG }, - { "/since", SND_AFT, CM_INV|CM_ARG }, - { "/smaller-than", SND_SMA, CM_ARG }, - { "/starting-at", SND_STA, CM_ARG }, -#ifndef NOFRILLS - { "/subject", SND_ASN, CM_ARG }, -#endif /* NOFRILLS */ - { "/text", SND_TXT, 0 }, - { "/transparent", SND_XPA, 0 }, - { "/type", SND_TYP, CM_ARG } -}; -#define NMSNDTAB sizeof(msndtab)/sizeof(struct keytab) -static int nmsndtab = NMSNDTAB; -#endif /* NOMSEND */ -#endif /* NOXFER */ - -/* CONNECT command switches */ - -#define CONN_II 0 /* Idle interval */ -#define CONN_IS 1 /* Idle string */ -#define CONN_IL 2 /* Idle limit */ -#define CONN_NV 3 /* Non-Verbose */ -#define CONN_TL 4 /* Time limit */ -#define CONN_TS 5 /* Trigger string */ -#define CONN_AS 6 /* Asynchronous */ -#define CONN_SY 7 /* Synchronous */ -#define CONN_MAX 7 /* Number of CONNECT switches */ - -#ifndef NOLOCAL -static struct keytab conntab[] = { -#ifdef OS2 - { "/asynchronous", CONN_AS, CM_INV }, -#endif /* OS2 */ -#ifdef XLIMITS - { "/idle-interval", CONN_II, CM_ARG }, - { "/idle-limit", CONN_IL, CM_ARG }, - { "/idle-string", CONN_IS, CM_ARG }, - { "/quietly", CONN_NV, CM_INV }, -#else - { "/quietly", CONN_NV, 0 }, -#endif /* XLIMITS */ -#ifdef OS2 - { "/synchronous", CONN_SY, CM_INV }, -#endif /* OS2 */ -#ifdef XLIMITS - { "/time-limit", CONN_TL, CM_ARG }, -#endif /* XLIMITS */ -#ifdef CK_TRIGGER - { "/trigger", CONN_TS, CM_ARG }, -#endif /* CK_TRIGGER */ - { "",0,0 } -}; -#define NCONNTAB sizeof(conntab)/sizeof(struct keytab) -static int nconntab = NCONNTAB; -#endif /* NOLOCAL */ - -#ifndef NOXFER -static struct keytab stattab[] = { /* STATISTICS command switches */ - { "/brief", 1, 0 }, - { "/verbose", 0, 0 } -}; -#endif /* NOXFER */ - -#ifndef NOSPL -#ifdef COMMENT -struct mtab mactab[MAC_MAX] = { /* Preinitialized macro table */ - { NULL, NULL, 0 } -}; -#else -struct mtab *mactab; /* Dynamically allocated macro table */ -#endif /* COMMENT */ -int nmac = 0; - -struct keytab mackey[MAC_MAX]; /* Macro names as command keywords */ -#endif /* NOSPL */ - -#ifndef NOSPL -#ifdef OS2 -struct keytab beeptab[] = { /* Beep options */ - { "error", BP_FAIL, 0 }, - { "information", BP_NOTE, 0 }, - { "warning", BP_WARN, 0 } -}; -int nbeeptab = sizeof(beeptab)/sizeof(struct keytab); - -/* CLEAR COMMMAND-SCREEN options */ - -#define CLR_C_ALL 0 -#define CLR_C_BOL 1 -#define CLR_C_BOS 2 -#define CLR_C_EOL 3 -#define CLR_C_EOS 4 -#define CLR_C_LIN 5 -#define CLR_C_SCR 6 - -struct keytab clrcmdtab[] = { - { "all", CLR_C_ALL, 0 }, - { "bol", CLR_C_BOL, 0 }, - { "bos", CLR_C_BOS, 0 }, - { "eol", CLR_C_EOL, 0 }, - { "eos", CLR_C_EOS, 0 }, - { "line", CLR_C_LIN, 0 }, - { "scrollback", CLR_C_SCR, 0 } -}; -int nclrcmd = sizeof(clrcmdtab)/sizeof(struct keytab); -#endif /* OS2 */ -#endif /* NOSPL */ - -#ifdef COMMENT -/* Not used at present */ -static struct keytab pagetab[] = { - { "/more", 1, CM_INV }, - { "/nopage", 0, 0 }, - { "/page", 1, 0 } -}; -int npagetab = sizeof(pagetab)/sizeof(struct keytab); -#endif /* COMMENT */ - -#define TYP_NOP 0 /* /NOPAGE */ -#define TYP_PAG 1 /* /PAGE */ -#define TYP_HEA 2 /* /HEAD:n */ -#define TYP_TAI 3 /* /TAIL:n */ -#define TYP_PAT 4 /* /MATCH:pattern */ -#define TYP_WID 5 /* /WIDTH:cols */ -#define TYP_COU 6 /* /COUNT */ -#define TYP_OUT 7 /* /OUTPUT:file */ -#define TYP_PFX 8 /* /PREFIX:string */ -#ifdef UNICODE -#define TYP_XIN 9 /* /TRANSLATE-FROM:charset */ -#define TYP_XUT 10 /* /TRANSLATE-TO:charset */ -#define TYP_XPA 11 /* /TRANSPARENT */ -#endif /* UNICODE */ -#ifdef KUI -#define TYP_GUI 12 /* /GUI:title */ -#define TYP_HIG 13 /* /HEIGHT:rows */ -#endif /* KUI */ -#define TYP_NUM 14 /* /NUMBER */ - -static struct keytab typetab[] = { /* TYPE command switches */ - { "/count", TYP_COU, 0 }, -#ifdef UNICODE - { "/character-set", TYP_XIN, CM_ARG }, -#endif /* UNICODE */ -#ifdef KUI - { "/gui", TYP_GUI, CM_ARG }, -#endif /* KUI */ - { "/head", TYP_HEA, CM_ARG }, -#ifdef KUI - { "/height", TYP_HIG, CM_ARG }, -#endif /* KUI */ - { "/match", TYP_PAT, CM_ARG }, -#ifdef CK_TTGWSIZ - { "/more", TYP_PAG, CM_INV }, - { "/nopage", TYP_NOP, 0 }, - { "/number", TYP_NUM, 0 }, - { "/output", TYP_OUT, CM_ARG }, - { "/page", TYP_PAG, 0 }, -#endif /* CK_TTGWSIZ */ - { "/prefix", TYP_PFX, CM_ARG }, - { "/tail", TYP_TAI, CM_ARG }, -#ifdef UNICODE - { "/translate-to", TYP_XUT, CM_ARG }, - { "/transparent", TYP_XPA, 0 }, -#endif /* UNICODE */ - { "/width", TYP_WID, CM_ARG }, -#ifdef UNICODE - { "/xlate-to", TYP_XUT, CM_INV|CM_ARG }, -#endif /* UNICODE */ - { "", 0, 0 } -}; -int ntypetab = sizeof(typetab)/sizeof(struct keytab) - 1; - -int typ_page = -1; /* TYPE /[NO]PAGE default */ -int typ_wid = -1; - -#ifndef NOSPL -#define TRA_ALL 999 /* TRACE command */ -#define TRA_ASG 0 -#define TRA_CMD 1 - -int tra_asg = 0; -int tra_cmd = 0; - -static struct keytab tracetab[] = { /* TRACE options */ - { "all", TRA_ALL, 0 }, - { "assignments", TRA_ASG, 0 }, - { "command-level", TRA_CMD, 0 } -}; -static int ntracetab = sizeof(tracetab)/sizeof(struct keytab); -#endif /* NOSPL */ - -#ifndef NOSHOW -VOID -showtypopts() { - printf(" TYPE "); - if (typ_page > -1) { - prtopt(&optlines,typ_page ? "/PAGE" : "/NOPAGE"); - } else - prtopt(&optlines,"(no options set)"); - if (typ_wid > -1) { - ckmakmsg(tmpbuf,TMPBUFSIZ,"/WIDTH:",ckitoa(typ_wid),NULL,NULL); - prtopt(&optlines,tmpbuf); - } - prtopt(&optlines,""); -} -#endif /* NOSHOW */ - -#ifdef LOCUS -/* isauto == 1 if locus is being switched automatically */ - -VOID -setlocus(x, isauto) int x, isauto; { - extern int quitting; - if (x) x = 1; - if (x && locus) return; - if (!x && !locus) return; - /* Get here if it actually needs to be changed */ -#ifdef OS2 - if (isauto && /* Automatically switching */ - !quitting && /* not exiting */ - autolocus == 2) { /* and AUTOLOCUS is set to ASK */ - char locmsg[300]; - ckmakmsg(locmsg,300, - "Switching Locus to ", - x ? "LOCAL" : "REMOTE", - " for file management commands\n" - "such as CD, DIRECTORY, DELETE, RENAME. Type HELP SET\n" - "LOCUS at the K-95> prompt for further info. Use the\n" -#ifdef KUI - "Actions menu or SET LOCUS command to disable automatic\n" - "Locus switching or to disable these queries.", -#else /* KUI */ - "SET LOCUS command to disable automatic locus switching\n" - "or to disable these queries.", -#endif /* KUI */ - NULL); - if (uq_ok(locmsg,"OK to switch Locus?",3,NULL,1)) { - locus = x; -#ifdef KUI - KuiSetProperty(KUI_LOCUS,x,0); -#endif /* KUI */ - return; - } - } else { -#endif /* OS2 */ - if (isauto && msgflg && !quitting) - printf("Switching LOCUS for file-management commands to %s.\n", - x ? "LOCAL" : "REMOTE" - ); - locus = x; -#ifdef OS2 -#ifdef KUI - KuiSetProperty(KUI_LOCUS,x,0); -#endif /* KUI */ - } -#endif /* OS2 */ -} - -VOID -setautolocus(x) int x; { - autolocus = x; -#ifdef KUI - KuiSetProperty(KUI_AUTO_LOCUS,x,0); -#endif /* KUI */ -} -#endif /* LOCUS */ - -int -settypopts() { /* Set TYPE option defaults */ - int xp = -1; - int c, getval; - while (1) { - if ((y = cmswi(typetab,ntypetab,"Switch","",xxstring)) < 0) { - if (y == -3) - break; - else - return(y); - } - c = cmgbrk(); - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - switch (y) { - case TYP_NOP: xp = 0; break; - case TYP_PAG: xp = 1; break; - case TYP_WID: - if (getval) - if ((x = cmnum("Column at which to truncate", - ckitoa(cmd_cols),10,&y,xxstring)) < 0) - return(x); - typ_wid = y; - break; - - default: - printf("?Sorry, this option can not be set\n"); - return(-9); - } - } - if ((x = cmcfm()) < 0) /* Get confirmation */ - return(x); - if (xp > -1) typ_page = xp; /* Confirmed, save defaults */ - return(success = 1); -} - -/* Forward declarations of functions local to this module */ - -#ifdef UNIX -_PROTOTYP (int douchmod, ( void ) ); -#endif /* UNIX */ -#ifdef CKPURGE -_PROTOTYP (int dopurge, ( void ) ); -#endif /* CKPURGE */ -#ifndef NOSPL -_PROTOTYP (int doundef, ( int ) ); -_PROTOTYP (int doask, ( int ) ); -_PROTOTYP (int dodef, ( int ) ); -_PROTOTYP (int doelse, ( void ) ); -_PROTOTYP (int dofor, ( void ) ); -_PROTOTYP (int doincr, ( int ) ); -#endif /* NOSPL */ -#ifndef NODIAL -_PROTOTYP (int dodial, ( int ) ); -#endif /* NODIAL */ -_PROTOTYP (int dodel, ( void ) ); -_PROTOTYP (int dopaus, ( int ) ); -#ifndef NOPUSH -#ifdef TCPSOCKET -_PROTOTYP (int doping, ( void ) ); -_PROTOTYP (int doftp, ( void ) ); -#endif /* TCPSOCKET */ -#endif /* NOPUSH */ -#ifndef NORENAME -#ifndef NOFRILLS -_PROTOTYP (int dorenam, ( void ) ); -#endif /* NOFRILLS */ -#endif /* NORENAME */ -#ifdef ZCOPY -_PROTOTYP (int docopy, ( void ) ); -#endif /* ZCOPY */ -#ifdef NT -_PROTOTYP (int dolink, ( void )); -#endif /* NT */ -#ifdef CK_REXX -_PROTOTYP (int dorexx, ( void ) ); -#endif /* CK_REXX */ - -#ifdef TNCODE -static struct keytab telcmd[] = { - { "abort", TN_ABORT, CM_INV }, /* Emotionally toned - don't show */ - { "ao", TN_AO, 0 }, - { "ayt", TN_AYT, 0 }, - { "break", BREAK, 0 }, - { "cancel",TN_ABORT, 0 }, - { "dmark", TN_DM, 0 }, - { "do", DO, 0 }, - { "dont", DONT, 0 }, - { "ec", TN_EC, 0 }, - { "el", TN_EL, 0 }, - { "eof", TN_EOF, 0 }, - { "eor", TN_EOR, 0 }, -#ifdef CK_KERBEROS -#ifdef KRB5 -#define TN_FWD 1 - { "forward", TN_FWD, CM_INV }, -#endif /* KRB5 */ -#endif /* CK_KERBEROS */ - { "ga", TN_GA, 0 }, - { "ip", TN_IP, 0 }, - { "nop", TN_NOP, 0 }, - { "sak", TN_SAK, CM_INV }, - { "sb", SB, 0 }, - { "se", SE, 0 }, - { "susp", TN_SUSP, 0 }, - { "will", WILL, 0 }, - { "wont", WONT, 0 } -}; -static int ntelcmd = (sizeof(telcmd) / sizeof(struct keytab)); - -static struct keytab tnopts[] = { -#ifdef CK_AUTHENTICATION - { "auth", TELOPT_AUTHENTICATION, 0 }, -#else - { "auth", TELOPT_AUTHENTICATION, CM_INV }, -#endif /* CK_AUTHENTICATION */ - { "binary", TELOPT_BINARY, 0 }, -#ifdef TN_COMPORT - { "c", TELOPT_COMPORT, CM_INV|CM_ABR}, - { "co", TELOPT_COMPORT, CM_INV|CM_ABR}, - { "com", TELOPT_COMPORT, CM_INV|CM_ABR}, - { "com-port-control", TELOPT_COMPORT, 0 }, - { "comport-control", TELOPT_COMPORT, CM_INV}, -#else /* TN_COMPORT */ - { "com-port-control", TELOPT_COMPORT, CM_INV }, - { "comport-control", TELOPT_COMPORT, CM_INV}, -#endif /* TN_COMPORT */ - { "echo", TELOPT_ECHO, 0 }, -#ifdef CK_ENCRYPTION - { "encrypt", TELOPT_ENCRYPTION, 0 }, -#else - { "encrypt", TELOPT_ENCRYPTION, CM_INV }, -#endif /* CK_ENCRYPTION */ -#ifdef CK_FORWARD_X - { "forward-x", TELOPT_FORWARD_X, 0 }, -#else - { "forward-x", TELOPT_FORWARD_X, CM_INV }, -#endif /* CK_FORWARD_X */ -#ifdef IKS_OPTION - { "kermit", TELOPT_KERMIT, 0 }, -#else - { "kermit", TELOPT_KERMIT, CM_INV }, -#endif /* IKS_OPTION */ - { "lflow", TELOPT_LFLOW, CM_INV }, - { "logout", TELOPT_LOGOUT, CM_INV }, -#ifdef CK_NAWS - { "naws", TELOPT_NAWS, 0 }, -#else - { "naws", TELOPT_NAWS, CM_INV }, -#endif /* CK_NAWS */ -#ifdef CK_ENVIRONMENT - { "new-environment", TELOPT_NEWENVIRON, 0 }, -#else - { "new-environment", TELOPT_NEWENVIRON, CM_INV }, -#endif /* CK_ENVIRONMENT */ - { "pragma-heartbeat",TELOPT_PRAGMA_HEARTBEAT, CM_INV }, - { "pragma-logon", TELOPT_PRAGMA_LOGON, CM_INV }, - { "pragma-sspi", TELOPT_SSPI_LOGON, CM_INV }, - { "sak", TELOPT_IBM_SAK, CM_INV }, -#ifdef CK_SNDLOC - { "send-location", TELOPT_SNDLOC, 0 }, -#else - { "send-location", TELOPT_SNDLOC, CM_INV }, -#endif /* CK_SNDLOC */ - { "sga", TELOPT_SGA, 0 }, -#ifdef CK_SSL - { "start-tls", TELOPT_START_TLS, 0 }, -#else - { "start-tls", TELOPT_START_TLS, CM_INV }, -#endif /* CK_SSL */ - { "ttype", TELOPT_TTYPE, 0 }, -#ifdef CK_ENVIRONMENT - { "xdisplay-location", TELOPT_XDISPLOC, 0 }, -#else - { "xdisplay-location", TELOPT_XDISPLOC, CM_INV }, -#endif /* CK_ENVIRONMENT */ - { "", 0, 0 } -}; -static int ntnopts = (sizeof(tnopts) / sizeof(struct keytab)) - 1; - -static struct keytab tnsbopts[] = { -#ifdef CK_NAWS - { "naws", TELOPT_NAWS, 0 }, -#endif /* CK_NAWS */ - { "", 0, 0 } -}; -static int ntnsbopts = (sizeof(tnsbopts) / sizeof(struct keytab)) - 1; -#endif /* TNCODE */ - -#ifdef TCPSOCKET -#ifndef NOPUSH -#ifdef SYSFTP -int -doftp() { /* (External) FTP command */ - char *p, *f; /* (See doxftp() for internal one) */ - int x; - - if (network) /* If we have a current connection */ - ckstrncpy(line,ttname,LINBUFSIZ); /* get the host name */ - else *line = '\0'; /* as default host */ - for (p = line; *p; p++) /* Remove ":service" from end. */ - if (*p == ':') { *p = '\0'; break; } - if ((x = cmtxt("IP host name or number", line, &s, xxstring)) < 0) - return(x); - if (nopush) { - printf("?Sorry, FTP command disabled\n"); - return(success = 0); - } -/* Construct FTP command */ -#ifdef VMS -#ifdef MULTINET /* TGV MultiNet */ - ckmakmsg(line,LINBUFSIZ,"multinet ftp ",s,NULL,NULL); -#else - ckmakmsg(line,LINBUFSIZ,"ftp ",s,NULL,NULL); -#endif /* MULTINET */ -#else /* Not VMS */ -#ifdef OS2ORUNIX -#ifndef NOFTP - f = ftpapp; - if (!f) f = ""; - if (!f[0]) f = "ftp"; - ckmakmsg(line,LINBUFSIZ,f," ",s,NULL); -#ifdef OS2 - p = line + strlen(ftpapp); - while (p != line) { - if (*p == '/') *p = '\\'; - p--; - } -#endif /* OS2 */ -#else /* NOFTP */ - ckmakmsg(line,LINBUFSIZ,"ftp ",s,NULL,NULL); -#endif /* NOFTP */ -#else /* OS2ORUNIX */ - ckmakmsg(line,LINBUFSIZ,"ftp ",s,NULL,NULL); -#endif /* OS2ORUNIX */ -#endif /* VMS */ - conres(); /* Make console normal */ -#ifdef DEC_TCPIP - printf("\n"); /* Prevent prompt-stomping */ -#endif /* DEC_TCPIP */ - x = zshcmd(line); - concb((char)escape); - return(success = x); -} -#endif /* SYSFTP */ - -int -doping() { /* PING command */ - char *p; /* just runs ping program */ - int x; - - if (network) /* If we have a current connection */ - ckstrncpy(line,ttname,LINBUFSIZ); /* get the host name */ - else *line = '\0'; /* as default host to be pinged. */ - for (p = line; *p; p++) /* Remove ":service" from end. */ - if (*p == ':') { *p = '\0'; break; } - if ((x = cmtxt("IP host name or number", line, &s, xxstring)) < 0) - return(x); - if (nopush) { - printf("?Sorry, PING command disabled\n"); - return(success = 0); - } - - /* Construct PING command */ -#ifdef VMS -#ifdef MULTINET /* TGV MultiNet */ - ckmakmsg(line,LINBUFSIZ,"multinet ping ",s," /num=1",NULL); -#else - ckmakmsg(line,LINBUFSIZ,"ping ",s," 56 1",NULL); /* Other VMS TCP/IP's */ -#endif /* MULTINET */ -#else /* Not VMS */ - ckmakmsg(line,LINBUFSIZ,"ping ",s,NULL,NULL); -#endif /* VMS */ - conres(); /* Make console normal */ -#ifdef DEC_TCPIP - printf("\n"); /* Prevent prompt-stomping */ -#endif /* DEC_TCPIP */ - x = zshcmd(line); - concb((char)escape); - return(success = x); -} -#endif /* NOPUSH */ -#endif /* TCPSOCKET */ - -static VOID -doend(x) int x; { -#ifndef NOSPL - /* Pop from all FOR/WHILE/XIF/SWITCH's */ - debug(F101,"doend maclvl 1","",maclvl); - while ((maclvl > 0) && - (m_arg[maclvl-1][0]) && - (cmdstk[cmdlvl].src == CMD_MD) && - (!strncmp(m_arg[maclvl-1][0],"_xif",4) || - !strncmp(m_arg[maclvl-1][0],"_for",4) || - !strncmp(m_arg[maclvl-1][0],"_whi",4) || - !strncmp(m_arg[maclvl-1][0],"_swi",4))) { - debug(F110,"END popping",m_arg[maclvl-1][0],0); - dogta(XXPTA); /* Put args back */ - popclvl(); /* Pop up two levels */ - popclvl(); - debug(F101,"doend maclvl 2","",maclvl); - } - if (maclvl > -1) { - if (mrval[maclvl]) /* Free previous retval if any */ - free(mrval[maclvl]); - mrval[maclvl] = malloc(16); /* Room for up to 15 digits */ - if (mrval[maclvl]) /* Record current retval */ - ckmakmsg(mrval[maclvl],16,ckitoa(x),NULL,NULL,NULL); - } -#endif /* NOSPL */ - popclvl(); /* Now pop out of macro or TAKE file */ -#ifndef NOSPL -#ifdef DEBUG - if (deblog) { - debug(F101,"END maclvl 3","",maclvl); - debug(F111,"END mrval[maclvl]",mrval[maclvl],maclvl); - debug(F111,"END mrval[maclvl+1]",mrval[maclvl+1],maclvl+1); - } -#endif /* DEBUG */ -#endif /* NOSPL */ -} - -#ifdef CKROOT -int -dochroot() { - if ((x = cmdir("Name of new root directory","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Directory name required\n"); - return(-9); - } - return(x); - } - ckstrncpy(line,s,LINBUFSIZ); - s = line; - if ((x = cmcfm()) < 0) return(x); - s = brstrip(s); - x = zsetroot(s); - if (x < 0) { - char * m = NULL; - switch (x) { - case -1: - case -2: m = "Not a directory"; break; - case -3: m = "Internal error"; break; - case -4: m = "Access denied"; break; - case -5: m = "Off limits"; break; - } - if (m) printf("%s: \"%s\"\n", m, s); - return(m ? -9 : -2); - } else { - nopush = 1; - return(success = 1); - } -} -#endif /* CKROOT */ - -#ifndef NOXFER -static char * asnbuf = NULL; /* As-name buffer pointer */ - -char sndxnam[] = { "_array_x_" }; /* (with replaceable x!) */ - -/* - The new SEND command, replacing BSEND, CSEND, PSEND, etc etc. - Call with cx = top-level keyword value. Returns: - < 0 On parse error. - 0 On other type of failure (e.g. requested operation not allowed). - 1 On success with sstate set to 's' so protocol will begin. -*/ - -/* D O X S E N D -- Parse SEND and related commands with switches */ - -int -doxsend(cx) int cx; { - int c, i, n, wild, confirmed = 0; /* Workers */ - int x, y; /* of the world... */ - int getval = 0; /* Whether to get switch value */ - extern char * snd_move; /* Directory to move sent files to */ - extern char * snd_rename; /* What to rename sent files to */ - extern char * filefile; /* File containing filenames to send */ - extern int xfiletype; /* Send only text (or binary) files */ - extern struct keytab pathtab[]; /* PATHNAMES option keywords */ - extern int npathtab; /* How many of them */ - extern int recursive; /* Recursive directory traversal */ - extern int rprintf; /* REMOTE PRINT flag */ - extern int fdispla; /* TRANSFER DISPLAY setting */ - extern int skipbup; /* Skip backup files when sending */ - struct stringint { /* Temporary array for switch values */ - char * sval; - int ival; - } pv[SND_MAX+1]; - struct FDB sf, sw, fl, cm; /* FDBs for each parse function */ - int mlist = 0; /* Flag for MSEND or MMOVE */ - char * m; /* For making help messages */ - extern struct keytab protos[]; /* File transfer protocols */ - extern int xfrxla, g_xfrxla, nprotos; - extern char sndbefore[], sndafter[], *sndexcept[]; /* Selection criteria */ - extern char sndnbefore[], sndnafter[]; - extern long sndsmaller, sndlarger, calibrate; -#ifndef NOSPL - int range[2]; /* Array range */ - char ** ap = NULL; /* Array pointer */ - int arrayx = -1; /* Array index */ -#endif /* NOSPL */ - -#ifdef NEWFTP - if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) { - if (cx == XXMAI) { - printf("?Sorry, No MAIL with FTP\n"); - return(-9); - } - return(doftpput(cx,0)); - } -#endif /* NEWFTP */ - - for (i = 0; i <= SND_MAX; i++) { /* Initialize switch values */ - pv[i].sval = NULL; /* to null pointers */ - pv[i].ival = -1; /* and -1 int values */ - } -#ifndef NOSPL - range[0] = -1; - range[1] = -1; - sndxin = -1; /* Array index */ -#endif /* NOSPL */ - sndarray = NULL; /* Array pointer */ - -#ifdef UNIXOROSK - g_matchdot = matchdot; /* Match dot files */ -#endif /* UNIXOROSK */ - g_recursive = recursive; /* Recursive sending */ - recursive = 0; /* Save global value, set local */ - debug(F101,"xsend entry fncnv","",fncnv); - - /* Preset switch values based on top-level command that called us */ - - switch (cx) { - case XXMSE: /* MSEND */ - mlist = 1; break; - case XXCSEN: /* CSEND */ - pv[SND_CMD].ival = 1; break; - case XXMMOVE: /* MMOVE */ - mlist = 1; - case XXMOVE: /* MOVE */ - pv[SND_DEL].ival = 1; break; - case XXRSEN: /* RESEND */ - pv[SND_BIN].ival = 1; /* Implies /BINARY */ - pv[SND_RES].ival = 1; break; - case XXMAI: /* MAIL */ - pv[SND_MAI].ival = 1; break; - } - - /* Set up chained parse functions... */ - - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "Filename, or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ -#ifdef NOMSEND - nsndtab, /* addtl numeric data 1: tbl size */ -#else - mlist ? nmsndtab : nsndtab, /* addtl numeric data 1: tbl size */ -#endif /* NOMSEND */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ -#ifdef NOMSEND - sndtab, /* Keyword table */ -#else - mlist ? msndtab : sndtab, -#endif /* NOMSEND */ - &sf /* Pointer to next FDB */ - ); - cmfdbi(&sf, /* 2nd FDB - file to send */ - _CMIFI, /* fcode */ - "File(s) to send", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nolinks, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - mlist ? &cm : &fl - ); - cmfdbi(&fl, /* 3rd FDB - command to send from */ - _CMFLD, /* fcode */ - "Command", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - &cm - ); - cmfdbi(&cm, /* 4th FDB - Confirmation */ - _CMCFM, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - NULL, - NULL, - NULL - ); - - while (1) { /* Parse 0 or more switches */ - x = cmfdb(&sw); /* Parse something */ - debug(F101,"xsend cmfdb","",x); - if (x < 0) /* Error */ - goto xsendx; /* or reparse needed */ - if (cmresult.fcode != _CMKEY) /* Break out if not a switch */ - break; -/* - They gave a switch, but let's see how they terminated it. - If they ended it with : or =, then we must parse a value. - If they ended it with anything else, then we must NOT parse a value. -*/ - c = cmgbrk(); /* Get break character */ - getval = (c == ':' || c == '='); /* to see how they ended the switch */ - if (getval && !(cmresult.kflags & CM_ARG)) { - printf("?This switch does not take arguments\n"); - x = -9; - goto xsendx; - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - x = -9; - goto xsendx; - } - n = cmresult.nresult; /* Numeric result = switch value */ - debug(F101,"xsend switch","",n); - - switch (n) { /* Process the switch */ - case SND_CMD: /* These take no args */ - if (nopush) { - printf("?Sorry, system command access is disabled\n"); - x = -9; - goto xsendx; - } -#ifdef PIPESEND - else if (sndfilter) { - printf( -"?Sorry, no SEND /COMMAND or CSEND when SEND FILTER selected\n"); - x = -9; - goto xsendx; - } -#endif /* PIPESEND */ - sw.hlpmsg = "Command, or switch"; /* Change help message */ - pv[n].ival = 1; /* Just set the flag */ - pv[SND_ARR].ival = 0; - break; - - case SND_REC: /* /RECURSIVE */ - recursive = 2; /* Set the real variable */ - pv[SND_PTH].ival = PATH_REL; /* Give them relative pathnames */ - pv[n].ival = 1; /* Just set the flag */ - break; - - case SND_RES: /* /RECOVER (resend) */ - pv[SND_ARR].ival = 0; - pv[SND_BIN].ival = 1; /* Implies /BINARY */ - case SND_NOB: /* /NOBACKUP */ - case SND_DEL: /* /DELETE */ - case SND_SHH: /* /QUIET */ - pv[n].ival = 1; /* Just set the flag */ - break; - -#ifdef UNIXOROSK -/* Like recursive, these are set immediately because they affect cmifi() */ - case SND_DOT: /* /DOTFILES */ - matchdot = 1; - break; - case SND_NOD: /* /NODOTFILES */ - matchdot = 0; - break; -#endif /* UNIXOROSK */ - - /* File transfer modes - each undoes the others */ - - case SND_BIN: /* Binary */ - case SND_TXT: /* Text */ - case SND_IMG: /* Image */ - case SND_LBL: /* Labeled */ - pv[SND_BIN].ival = 0; - pv[SND_TXT].ival = 0; - pv[SND_IMG].ival = 0; - pv[SND_LBL].ival = 0; - pv[n].ival = 1; - break; - -#ifdef CKSYMLINK - case SND_LNK: - case SND_NLK: - nolinks = (n == SND_NLK) ? 2 : 0; - cmfdbi(&sf, /* Redo cmifi() */ - _CMIFI, /* fcode */ - "File(s) to send", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nolinks, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - mlist ? &cm : &fl - ); - break; -#endif /* CKSYMLINK */ - - case SND_EXC: /* Excludes */ - if (!getval) break; - if ((x = cmfld("Pattern","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Pattern required\n"); - x = -9; - } - goto xsendx; - } - if (pv[n].sval) free(pv[n].sval); - y = strlen(s); - if (y > 256) { - printf("?Pattern too long - 256 max\n"); - x = -9; - goto xsendx; - } - pv[n].sval = malloc(y+1); - if (pv[n].sval) { - strcpy(pv[n].sval,s); /* safe */ - pv[n].ival = 1; - } - break; - - case SND_MOV: /* MOVE after */ - case SND_REN: /* RENAME after */ - if (!getval) break; - if ((x = cmfld(n == SND_MOV ? - "device and/or directory for source file after sending" : - "new name for source file after sending", - "", - &s, - n == SND_MOV ? xxstring : NULL - )) < 0) { - if (x == -3) { - printf("%s\n", n == SND_MOV ? - "?Destination required" : - "?New name required" - ); - x = -9; - } - goto xsendx; - } - if (pv[n].sval) free(pv[n].sval); - s = brstrip(s); - y = strlen(s); - if (y > 0) { - pv[n].sval = malloc(y+1); - if (pv[n].sval) { - strcpy(pv[n].sval,s); /* safe */ - pv[n].ival = 1; - } - } - break; - - case SND_SMA: /* Smaller / larger than */ - case SND_LAR: - if (!getval) break; - if ((x = cmnum("Size in bytes","0",10,&y,xxstring)) < 0) - goto xsendx; - pv[n].ival = y; - break; - - case SND_AFT: /* Send /AFTER:date-time */ - case SND_BEF: /* Send /BEFORE:date-time */ - case SND_NAF: /* Send /NOT-AFTER:date-time */ - case SND_NBE: /* Send /NOT-BEFORE:date-time */ - if (!getval) break; - if ((x = cmdate("File date-time","",&s,0,xxstring)) < 0) { - if (x == -3) { - printf("?Date-time required\n"); - x = -9; - } - goto xsendx; - } - if (pv[n].sval) free(pv[n].sval); - pv[n].sval = malloc((int)strlen(s)+1); - if (pv[n].sval) { - strcpy(pv[n].sval,s); /* safe */ - pv[n].ival = 1; - } - break; - - case SND_MAI: /* Send as mail (= MAIL) */ -#ifdef IKSD - if (inserver && !ENABLED(en_mai)) { - printf("?Sorry, sending files as mail is disabled\n"); - return(-9); - } -#endif /* IKSD */ - pv[n].ival = 1; - if (!getval) break; - if ((x = cmfld("e-mail address","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?address required\n"); - x = -9; - } - goto xsendx; - } - s = brstrip(s); - if (pv[n].sval) free(pv[n].sval); - pv[n].sval = malloc((int)strlen(s)+1); - if (pv[n].sval) - strcpy(pv[n].sval,s); /* safe */ - break; - - case SND_PRI: /* Send to be printed (REMOTE PRINT) */ -#ifdef IKSD - if (inserver && !ENABLED(en_mai)) { - printf("?Sorry, sending files for printing is disabled\n"); - return(-9); - } -#endif /* IKSD */ - pv[n].ival = 1; - if (!getval) break; - if ((x = cmfld("Print options","",&s,xxstring)) < 0) - if (x != -3) goto xsendx; - s = brstrip(s); - if (pv[n].sval) free(pv[n].sval); - pv[n].sval = malloc((int)strlen(s)+1); - if (pv[n].sval) - strcpy(pv[n].sval,s); /* safe */ - break; - - case SND_ASN: /* As-name */ - debug(F101,"xsend /as-name getval","",getval); - if (!getval) break; - if ((x = cmfld("Name to send under","",&s,NULL)) < 0) { - if (x == -3) { - printf("?name required\n"); - x = -9; - } - goto xsendx; - } - s = brstrip(s); - if ((y = strlen(s)) > 0) { - if (pv[n].sval) free(pv[n].sval); - pv[n].sval = malloc(y+1); - if (pv[n].sval) { - strcpy(pv[n].sval,s); /* safe */ - pv[n].ival = 1; - } - } - break; - - case SND_STA: /* Starting position (= PSEND) */ - if (!getval) break; - if ((x = cmnum("0-based position","0",10,&y,xxstring)) < 0) - goto xsendx; - pv[n].ival = y; - break; - - case SND_PRO: /* Protocol to use */ - if (!getval) break; - if ((x = cmkey(protos,nprotos,"File-transfer protocol","", - xxstring)) < 0) { - if (x == -3) { - printf("?name of protocol required\n"); - x = -9; - } - goto xsendx; - } - pv[n].ival = x; - break; - -#ifdef PIPESEND - case SND_FLT: /* Filter */ - debug(F101,"xsend /filter getval","",getval); - if (!getval) break; - if ((x = cmfld("Filter program to send through","",&s,NULL)) < 0) { - if (x == -3) - s = ""; - else - goto xsendx; - } - if (*s) s = brstrip(s); - y = strlen(s); - for (x = 0; x < y; x++) { /* Make sure they included "\v(...)" */ - if (s[x] != '\\') continue; - if (s[x+1] == 'v') break; - } - if (x == y) { - printf( - "?Filter must contain a replacement variable for filename.\n" - ); - x = -9; - goto xsendx; - } - pv[n].ival = 1; - if (pv[n].sval) { - free(pv[n].sval); - pv[n].sval = NULL; - } - if ((y = strlen(s)) > 0) { - if ((pv[n].sval = malloc(y+1))) - strcpy(pv[n].sval,s); /* safe */ - } - break; -#endif /* PIPESEND */ - - case SND_PTH: /* Pathnames */ - if (!getval) { - pv[n].ival = PATH_REL; - break; - } - if ((x = cmkey(pathtab,npathtab,"","absolute",xxstring)) < 0) - goto xsendx; - pv[n].ival = x; - break; - - case SND_NAM: /* Filenames */ - if (!getval) break; - if ((x = cmkey(fntab,nfntab,"","converted",xxstring)) < 0) - goto xsendx; - debug(F101,"xsend /filenames","",x); - pv[n].ival = x; - break; - -#ifdef CALIBRATE - case SND_CAL: /* /CALIBRATE */ - if (getval) { - if ((x = cmnum("number of Kbytes to send", - "1024",10,&y,xxstring)) < 0) - goto xsendx; - } else - y = 1024; - pv[n].ival = y; - pv[SND_ARR].ival = 0; - break; -#endif /* CALIBRATE */ - - case SND_FIL: /* Name of file containing filnames */ - if (!getval) break; - if ((x = cmifi("Name of file containing list of filenames", - "",&s,&y,xxstring)) < 0) { - if (x == -3) { - printf("?Filename required\n"); - x = -9; - } - goto xsendx; - } else if (y) { - printf("?Wildcards not allowed\n"); - x = -9; - goto xsendx; - } - if (pv[n].sval) - free(pv[n].sval); - if (s) if (*s) { - if ((pv[n].sval = malloc((int)strlen(s)+1))) { - strcpy(pv[n].sval,s); - pv[n].ival = 1; - pv[SND_ARR].ival = 0; - } - } - break; - -#ifndef NOSPL - case SND_ARR: /* SEND /ARRAY: */ - if (!getval) break; - ap = NULL; - if ((x = cmfld("Array name (a single letter will do)", - "", - &s, - NULL - )) < 0) { - if (x == -3) - break; - else - return(x); - } - if ((x = arraybounds(s,&(range[0]),&(range[1]))) < 0) { - printf("?Bad array: %s\n",s); - return(-9); - } - if (!(ap = a_ptr[x])) { - printf("?No such array: %s\n",s); - return(-9); - } - pv[n].ival = 1; - pv[SND_CMD].ival = 0; /* Undo any conflicting ones... */ - pv[SND_RES].ival = 0; - pv[SND_CAL].ival = 0; - pv[SND_FIL].ival = 0; - arrayx = x; - break; -#endif /* NOSPL */ - - case SND_XPA: /* /TRANSPARENT */ - pv[n].ival = 1; - break; - - case SND_TYP: /* Only files of given type */ - if (!getval) break; - if ((x = cmkey(txtbin,3,"","all",xxstring)) < 0) - goto xsendx; - pv[n].ival = (x == 2) ? -1 : x; - break; - - default: - printf("?Unexpected switch value - %d\n",cmresult.nresult); - x = -9; - goto xsendx; - } - } - debug(F101,"xsend cmresult fcode","",cmresult.fcode); - -#ifdef COMMENT - /* List switch parsing results in debug log */ - for (i = 0; i <= SND_MAX; i++) { - ckmakmsg(line,LINBUFSIZ,"xsend switch ",ckitoa(i),NULL,NULL); - debug(F111,line, pv[i].sval, pv[i].ival); - } -#endif /* COMMENT */ - -/* Now we have all switches, plus maybe a filename or command, or nothing */ - -#ifdef PIPESEND - if (protocol != PROTO_K && pv[SND_CMD].ival > 0) { - printf("?Sorry, %s works only with Kermit protocol\n", - (cx == XXCSEN) ? "CSEND" : "SEND /COMMAND"); - x = -9; - goto xsendx; - } - if (pv[SND_RES].ival > 0 || /* /RECOVER */ - pv[SND_STA].ival > 0) { /* or /STARTING */ - if (sndfilter || pv[SND_FLT].ival > 0) { - printf("?Sorry, no /RECOVER or /START if SEND FILTER selected\n"); - x = -9; - goto xsendx; - } - } -#endif /* PIPESEND */ - - cmarg = ""; - cmarg2 = ""; - line[0] = NUL; - s = line; - wild = 0; - - switch (cmresult.fcode) { /* How did we get out of switch loop */ - case _CMIFI: /* Input filename */ - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Name */ - if (pv[SND_ARR].ival > 0) - cmarg2 = line; - else - wild = cmresult.nresult; /* Wild flag */ - if (!recursive && !wild) - nolinks = 0; - break; - case _CMFLD: /* Field */ - /* Only allowed with /COMMAND and /ARRAY */ - if (pv[SND_CMD].ival < 1 && pv[SND_ARR].ival < 1) { -#ifdef CKROOT - if (ckrooterr) - printf("?Off limits: %s\n",cmresult.sresult); - else -#endif /* CKROOT */ - printf("?%s - \"%s\"\n", - iswild(cmresult.sresult) ? - "No files match" : "File not found", - cmresult.sresult - ); - x = -9; - goto xsendx; - } - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); - if (pv[SND_ARR].ival > 0) - cmarg2 = line; - break; - case _CMCFM: /* Confirmation */ - /* s = ""; */ - confirmed = 1; - break; - default: - printf("?Unexpected function code: %d\n",cmresult.fcode); - x = -9; - goto xsendx; - } - debug(F110,"xsend string",s,0); - debug(F101,"xsend confirmed","",confirmed); - - /* Save and change protocol and transfer mode */ - /* Global values are restored in main parse loop */ - - g_proto = protocol; /* Save current global protocol */ - g_urpsiz = urpsiz; - g_spsizf = spsizf; - g_spsiz = spsiz; - g_spsizr = spsizr; - g_spmax = spmax; - g_wslotr = wslotr; - g_prefixing = prefixing; - g_fncact = fncact; - g_fncnv = fncnv; - g_fnspath = fnspath; - g_fnrpath = fnrpath; - g_xfrxla = xfrxla; - - if (pv[SND_PRO].ival > -1) { /* Change according to switch */ - protocol = pv[SND_PRO].ival; - if (ptab[protocol].rpktlen > -1) /* copied from initproto() */ - urpsiz = ptab[protocol].rpktlen; - if (ptab[protocol].spktflg > -1) - spsizf = ptab[protocol].spktflg; - if (ptab[protocol].spktlen > -1) { - spsiz = ptab[protocol].spktlen; - if (spsizf) - spsizr = spmax = spsiz; - } - if (ptab[protocol].winsize > -1) - wslotr = ptab[protocol].winsize; - if (ptab[protocol].prefix > -1) - prefixing = ptab[protocol].prefix; - if (ptab[protocol].fnca > -1) - fncact = ptab[protocol].fnca; - if (ptab[protocol].fncn > -1) - fncnv = ptab[protocol].fncn; - if (ptab[protocol].fnsp > -1) - fnspath = ptab[protocol].fnsp; - if (ptab[protocol].fnrp > -1) - fnrpath = ptab[protocol].fnrp; - } - debug(F101,"xsend protocol","",protocol); - - if (pv[SND_NOB].ival > -1) { /* /NOBACKUP (skip backup file) */ - g_skipbup = skipbup; - skipbup = 1; - } - if (pv[SND_REC].ival > 0) /* /RECURSIVE */ - recursive = 2; - - if (pv[SND_TYP].ival > -1) { /* /TYPE */ - xfiletype = pv[SND_TYP].ival; - if (xfiletype == 2) - xfiletype = -1; - } - g_binary = binary; /* Save global transfer mode */ -#ifdef PATTERNS - g_patterns = patterns; /* Save FILE PATTERNS setting */ -#endif /* PATTERNS */ - if (pv[SND_BIN].ival > 0) { /* Change according to switch */ - /* If they said /BINARY they mean /BINARY */ - patterns = 0; /* So no pattern-based switching */ - g_xfermode = xfermode; /* or automatic transfer mode */ - xfermode = XMODE_M; - binary = XYFT_B; - debug(F101,"doxsend /BINARY xfermode","",xfermode); - } else if (pv[SND_TXT].ival > 0) { /* Ditto for /TEXT */ - patterns = 0; - g_xfermode = xfermode; - xfermode = XMODE_M; - binary = XYFT_T; - debug(F101,"doxsend /TEXT xfermode","",xfermode); - } else if (pv[SND_IMG].ival > 0) { -#ifdef VMS - binary = XYFT_I; -#else - binary = XYFT_B; -#endif /* VMS */ - } -#ifdef CK_LABELED - else if (pv[SND_LBL].ival > 0) { - binary = XYFT_L; - } -#endif /* CK_LABELED */ - debug(F101,"xsend binary","",binary); - - if (pv[SND_XPA].ival > 0) /* /TRANSPARENT */ - xfrxla = 0; /* Don't translate character sets */ - - /* Check for legal combinations of switches, filenames, etc */ - -#ifdef PIPESEND - if (pv[SND_CMD].ival > 0) { /* COMMAND - strip any braces */ - debug(F110,"SEND /COMMAND before stripping",s,0); - s = brstrip(s); - debug(F110,"SEND /COMMAND after stripping",s,0); - if (!*s) { - printf("?Sorry, a command to send from is required\n"); - x = -9; - goto xsendx; - } - cmarg = s; - } -#endif /* PIPESEND */ - -/* Set up /MOVE and /RENAME */ - - if (pv[SND_DEL].ival > 0 && - (pv[SND_MOV].ival > 0 || pv[SND_REN].ival > 0)) { - printf("?Sorry, /DELETE conflicts with /MOVE or /RENAME\n"); - x = -9; - goto xsendx; - } -#ifdef CK_TMPDIR - if (pv[SND_MOV].ival > 0) { - int len; - char * p = pv[SND_MOV].sval; -#ifdef CK_LOGIN - if (isguest) { - printf("?Sorry, /MOVE-TO not available to guests\n"); - x = -9; - goto xsendx; - } -#endif /* CK_LOGIN */ - len = strlen(p); - if (!isdir(p)) { /* Check directory */ -#ifdef CK_MKDIR - char * s = NULL; - s = (char *)malloc(len + 4); - if (s) { - strcpy(s,p); /* safe */ -#ifdef datageneral - if (s[len-1] != ':') { s[len++] = ':'; s[len] = NUL; } -#else - if (s[len-1] != '/') { s[len++] = '/'; s[len] = NUL; } -#endif /* datageneral */ - s[len++] = 'X'; - s[len] = NUL; - x = zmkdir(s); - free(s); - if (x < 0) { - printf("?Can't create \"%s\"\n",p); - x = -9; - goto xsendx; - } - } -#else - printf("?Directory \"%s\" not found\n",p); - x = -9; - goto xsendx; -#endif /* CK_MKDIR */ - } - zfnqfp(p,LINBUFSIZ,tmpbuf); - makestr(&snd_move,tmpbuf); - } -#endif /* CK_TMPDIR */ - - if (pv[SND_REN].ival > 0) { /* /RENAME */ - char * p = pv[SND_REN].sval; -#ifdef CK_LOGIN - if (isguest) { - printf("?Sorry, /RENAME-TO not available to guests\n"); - x = -9; - goto xsendx; - } -#endif /* CK_LOGIN */ - if (!p) p = ""; - if (!*p) { - printf("?New name required for /RENAME\n"); - x = -9; - goto xsendx; - } - p = brstrip(p); -#ifndef NOSPL - /* If name given is wild, rename string must contain variables */ - if (wild) { - char * s = tmpbuf; - x = TMPBUFSIZ; - zzstring(p,&s,&x); - if (!strcmp(tmpbuf,p)) { - printf( - "?/RENAME for file group must contain variables such as \\v(filename)\n" - ); - x = -9; - goto xsendx; - } - } -#endif /* NOSPL */ - makestr(&snd_rename,p); - } - -/* Handle /RECOVER and /START */ - -#ifdef CK_RESEND - if (pv[SND_RES].ival > 0 && binary != XYFT_B && !filepeek -#ifdef PATTERNS - && !patterns -#else -#ifdef VMS -/* VMS sets text/binary automatically later when it opens the file */ - && 0 -#endif /* VMS */ -#endif /* PATTERNS */ - ) { - printf("?Sorry, /BINARY required\n"); - x = -9; - goto xsendx; - } - if (pv[SND_STA].ival > 0) { /* /START */ - if (wild) { - printf("?Sorry, wildcards not permitted with /START\n"); - x = -9; - goto xsendx; - } - if (sizeof(int) < 4) { - printf("?Sorry, this command needs 32-bit integers\n"); - x = -9; - goto xsendx; - } -#ifdef CK_XYZ - if (protocol != PROTO_K) { - printf("?Sorry, SEND /START works only with Kermit protocol\n"); - x = -9; - goto xsendx; - } -#endif /* CK_XYZ */ - } -#ifdef CK_XYZ - if (pv[SND_RES].ival > 0) { - if (protocol != PROTO_K && protocol != PROTO_Z) { - printf( - "Sorry, /RECOVER is possible only with Kermit or ZMODEM protocol\n" - ); - x = -9; - goto xsendx; - } - } -#endif /* CK_XYZ */ -#endif /* CK_RESEND */ - - if (protocol == PROTO_K) { - if ((pv[SND_MAI].ival > 0 || /* MAIL */ - pv[SND_PRI].ival > 0 || /* PRINT */ - pv[SND_RES].ival > 0 /* RESEND */ - ) && - (!atdiso || !atcapr)) { /* Disposition attribute off? */ - printf("?Sorry, ATTRIBUTE DISPOSITION must be ON\n"); - x = -9; - goto xsendx; - } - } - -#ifdef CK_XYZ - if (wild && (protocol == PROTO_X || protocol == PROTO_XC)) { - printf( -"Sorry, you can only send one file at a time with XMODEM protocol\n" - ); - x = -9; - goto xsendx; - } -#endif /* CK_XYZ */ - - if (!confirmed) { /* CR not typed yet, get more fields */ - char *m; - if (mlist) { /* MSEND or MMOVE */ - nfils = 0; /* We already have the first one */ -#ifndef NOMSEND - msfiles[nfils++] = line; /* Store pointer */ - lp = line + (int)strlen(line) + 1; /* Point past it */ - debug(F111,"xsend msend",msfiles[nfils-1],nfils-1); - while (1) { /* Get more filenames */ - char *p; - if ((x = cmifi("Names of files to send, separated by spaces", - "", &s,&y,xxstring)) < 0) { - if (x != -3) - goto xsendx; - if ((x = cmcfm()) < 0) - goto xsendx; - break; - } - msfiles[nfils++] = lp; /* Got one, count it, point to it, */ - p = lp; /* remember pointer, */ - while ((*lp++ = *s++)) /* and copy it into buffer */ - if (lp > (line + LINBUFSIZ)) { /* Avoid memory leak */ - printf("?MSEND list too long\n"); - line[0] = NUL; - x = -9; - goto xsendx; - } - debug(F111,"xsend msend",msfiles[nfils-1],nfils-1); - if (nfils == 1) fspec[0] = NUL; /* Take care of \v(filespec) */ -#ifdef ZFNQFP - zfnqfp(p,TMPBUFSIZ,tmpbuf); - p = tmpbuf; -#endif /* ZFNQFP */ - if (((int)strlen(fspec) + (int)strlen(p) + 1) < fspeclen) { - strcat(fspec,p); /* safe */ - strcat(fspec," "); /* safe */ - } else -#ifdef COMMENT - printf("WARNING - \\v(filespec) buffer overflow\n"); -#else - debug(F101,"doxsend filespec buffer overflow","",0); -#endif /* COMMENT */ - } -#endif /* NOMSEND */ - } else { /* Regular SEND */ - char *p; int y; - nfils = -1; - if (pv[SND_MAI].ival > 0) - m = (pv[SND_MAI].sval) ? - "e-mail address (optional)" : - "e-mail address (required)"; - else if (pv[SND_PRI].ival > 0) - m = "printer options (optional)"; - else if (wild) - m = -"\nOptional as-name template containing replacement variables \ -like \\v(filename)"; - else - m = "Optional name to send it with"; - if ((x = cmtxt(m,"",&p,NULL)) < 0) - goto xsendx; - if (!p) p = ""; - if (*p) { /* If some text was given... */ - p = brstrip(p); /* Replace /AS-NAME: value if any */ - if ((y = strlen(p)) > 0) { - if (pv[SND_MAI].ival > 0) { - makestr(&pv[SND_MAI].sval, p); - } else { - if (pv[SND_ASN].sval) free(pv[SND_ASN].sval); - pv[SND_ASN].sval = malloc(y+1); - if (pv[SND_ASN].sval) { - strcpy(pv[SND_ASN].sval,p); /* safe */ - pv[SND_ASN].ival = 1; - } - } - } - } - } - } - /* Set cmarg2 from as-name, however we got it. */ - - if (pv[SND_ASN].ival > 0 && pv[SND_ASN].sval && !*cmarg2) { - int x; - x = strlen(line); - ckstrncpy(line+x+2,pv[SND_ASN].sval,LINBUFSIZ-x-1); - cmarg2 = line+x+2; - debug(F110,"doxsend cmarg2",cmarg2,0); - } - -#ifndef NOFRILLS - if ((pv[SND_MAI].ival > 0) && (pv[SND_PRI].ival > 0)) { - printf("Sorry, /MAIL and /PRINT are conflicting options\n"); - x = -9; - goto xsendx; - } - n = 0; /* /MAIL or /PRINT? */ - if (pv[SND_MAI].ival > 0) - n = SND_MAI; - else if (pv[SND_PRI].ival > 0) - n = SND_PRI; - if (n) { /* Yes... */ -#ifdef DEBUG - char * p; - if (n == SND_MAI) - p = "/MAIL"; - else - p = "/PRINT"; - debug(F111,"xsend",p,n); -#endif /* DEBUG */ -#ifdef CK_XYZ - if (protocol != PROTO_K) { - printf("Sorry, %s available only with Kermit protocol\n", - (n == SND_MAI) ? "/MAIL" : "/PRINT" - ); - x = -9; - goto xsendx; - } -#endif /* CK_XYZ */ - debug(F101,"xsend print/mail wild","",wild); - *optbuf = NUL; /* Wipe out any old options */ - s = pv[n].sval; /* mail address or print switch val */ - if (!s) s = ""; - debug(F110,"doxsend mail address or printer options",s,0); - if (n == SND_MAI && !*s) { - printf("?E-mail address required\n"); - x = -9; - goto xsendx; - } else if ((int)strlen(s) > 94) { /* Ensure legal size */ - printf("?%s too long\n", - (n == SND_MAI) ? - "E-mail address" : - "Print option string" - ); - x = -9; - goto xsendx; - } - ckstrncpy(optbuf,s,OPTBUFLEN); /* OK, copy to option buffer */ - cmarg = line; /* File to send */ - if (n == SND_MAI) { - debug(F110,"xsend mailing",cmarg,0); - debug(F110,"xsend address:",optbuf,0); - rmailf = 1; - } else { - debug(F110,"xsend printing",cmarg,0); - debug(F110,"xsend options",optbuf,0); - rprintf = 1; - } - } -#endif /* NOFRILLS */ - -#ifdef CALIBRATE - if (pv[SND_CAL].ival > 0) { /* Handle /CALIBRATE */ - if (confirmed) { - calibrate = pv[SND_CAL].ival * 1024L; - sndsrc = -9; - nfils = 1; - wild = 0; -#ifndef NOMSEND - addlist = 0; -#endif /* NOMSEND */ - ckstrncpy(line,"CALIBRATION",LINBUFSIZ); - s = cmarg = line; - if (!cmarg2) cmarg2 = ""; - debug(F110,"doxsend cmarg2 calibrate",cmarg2,0); - } else if (line[0]) { - calibrate = 0L; - pv[SND_CAL].ival = 0L; - } - } -#endif /* CALIBRATE */ - - if (pv[SND_FIL].ival > 0) { - if (confirmed && !calibrate) { - if (zopeni(ZMFILE,pv[SND_FIL].sval) < 1) { - debug(F110,"xsend can't open",pv[SND_FIL].sval,0); - printf("?Failure to open %s\n",filefile); - x = -9; - goto xsendx; - } - makestr(&filefile,pv[SND_FIL].sval); /* Open, remember name */ - debug(F110,"xsend opened",filefile,0); - wild = 1; - } - } - - /* SEND alone... */ - -#ifndef NOSPL - if (confirmed && pv[SND_ARR].ival > 0) { - if (!*cmarg2) { - sndxnam[7] = (char)((arrayx == 1) ? 64 : arrayx + ARRAYBASE); - cmarg2 = sndxnam; - } - cmarg = ""; - goto sendend; - } -#endif /* NOSPL */ - - if (confirmed && !line[0] && !filefile && !calibrate) { -#ifndef NOMSEND - if (filehead) { /* OK if we have a SEND-LIST */ - nfils = filesinlist; - sndsrc = nfils; /* Like MSEND */ - addlist = 1; /* But using a different list... */ - filenext = filehead; - goto sendend; - } -#endif /* NOMSEND */ - printf("?Filename required but not given\n"); - x = -9; - goto xsendx; - } - - /* Not send-list or array */ - -#ifndef NOMSEND - addlist = 0; /* Don't use SEND-LIST. */ - filenext = NULL; -#endif /* NOMSEND */ - - if (mlist) { /* MSEND or MMOVE */ -#ifndef NOMSEND - cmlist = msfiles; /* List of files to send */ - sndsrc = nfils; - cmarg2 = ""; - sendstart = 0L; -#endif /* NOMSEND */ -#ifdef PIPESEND - pipesend = 0; -#endif /* PIPESEND */ - } else if (filefile) { /* File contains list of filenames */ - s = ""; - cmarg = ""; - cmarg2 = ""; - line[0] = NUL; - nfils = 1; - sndsrc = 1; - - } else if (!calibrate && pv[SND_ARR].ival < 1 && pv[SND_CMD].ival < 1) { - - nfils = sndsrc = -1; /* Not MSEND, MMOVE, /LIST, or /ARRAY */ - if ( /* or /COMMAND */ - -#ifndef NOFRILLS - !rmailf && !rprintf /* Not MAIL or PRINT */ -#else - 1 -#endif /* NOFRILLS */ - ) { - int y = 1; - if (!wild) - y = zchki(s); - if (y < 0) { - printf("?Read access denied - \"%s\"\n", s); - x = -9; - goto xsendx; - } - if (s != line) /* We might already have done this. */ - ckstrncpy(line,s,LINBUFSIZ); /* Copy of string just parsed. */ - else - debug(F110,"doxsend line=s",line,0); - cmarg = line; /* File to send */ - } - zfnqfp(cmarg,fspeclen,fspec); - } - if (!mlist) { /* For all but MSEND... */ -#ifdef PIPESEND - if (pv[SND_CMD].ival > 0) /* /COMMAND sets pipesend flag */ - pipesend = 1; - debug(F101,"xsend /COMMAND pipesend","",pipesend); - if (pipesend && filefile) { - printf("?Invalid switch combination\n"); - x = -9; - goto xsendx; - } -#endif /* PIPESEND */ - -#ifndef NOSPL - /* If as-name given and filespec is wild, as-name must contain variables */ - debug(F111,"doxsend cmarg2 wild",cmarg2,wild); - if (wild && *cmarg2) { - char * s = tmpbuf; - x = TMPBUFSIZ; - zzstring(cmarg2,&s,&x); - if (!strcmp(tmpbuf,cmarg2)) { - printf( - "?As-name for file group must contain variables such as \\v(filename)\n" - ); - x = -9; - goto xsendx; - } - } -#endif /* NOSPL */ - - /* Strip braces from as-name */ - debug(F110,"xsend cmarg2 before stripping",cmarg2,0); - cmarg2 = brstrip(cmarg2); - debug(F110,"xsend filename",cmarg,0); - debug(F110,"xsend as-name",cmarg2,0); - - /* Copy as-name to a safe place */ - - if (asnbuf) { - free(asnbuf); - asnbuf = NULL; - } - if ((y = strlen(cmarg2)) > 0) { - asnbuf = (char *) malloc(y + 1); - if (asnbuf) { - strcpy(asnbuf,cmarg2); /* safe */ - cmarg2 = asnbuf; - } else cmarg2 = ""; - } - -#ifdef CK_RESEND - debug(F111,"xsend pv[SND_STA].ival","",pv[SND_STA].ival); - if (pv[SND_STA].ival > -1) { /* /START position */ - if (wild) { - printf("?/STARTING-AT may not be used with multiple files.\n"); - x = -9; - goto xsendx; - } else - sendstart = pv[SND_STA].ival; - } else - sendstart = 0L; - debug(F101,"xsend /STARTING","",sendstart); -#endif /* CK_RESEND */ - } - -sendend: /* Common successful exit */ - moving = 0; - if (pv[SND_SHH].ival > 0) { /* SEND /QUIET... */ - g_displa = fdispla; - fdispla = 0; - debug(F101,"xsend display","",fdispla); - } - -#ifndef NOSPL /* SEND /ARRAY... */ - if (pv[SND_ARR].ival > 0) { - if (!ap) { x = -2; goto xsendx; } /* (shouldn't happen) */ - if (range[0] == -1) /* If low end of range not specified */ - range[0] = 1; /* default to 1 */ - if (range[1] == -1) /* If high not specified */ - range[1] = a_dim[arrayx]; /* default to size of array */ - if ((range[0] < 0) || /* Check range */ - (range[0] > a_dim[arrayx]) || - (range[1] < range[0]) || - (range[1] > a_dim[arrayx])) { - printf("?Bad array range - [%d:%d]\n",range[0],range[1]); - x = -9; - goto xsendx; - } - sndarray = ap; /* Array pointer */ - sndxin = arrayx; /* Array index */ - sndxlo = range[0]; /* Array range */ - sndxhi = range[1]; - sndxnam[7] = (char)((sndxin == 1) ? 64 : sndxin + ARRAYBASE); - -#ifdef COMMENT - printf("SENDING FROM ARRAY: &%c[]...\n", /* debugging */ - (sndxin == 1) ? 64 : sndxin + ARRAYBASE); - printf("Lo=%d\nHi=%d\n", sndxlo, sndxhi); - printf("cmarg=[%s]\ncmarg2=[%s]\n", cmarg, cmarg2); - while ((x = agnbyte()) > -1) { - putchar((char)x); - } - return(1); -#endif /* COMMENT */ - } -#endif /* NOSPL */ - - if (pv[SND_ARR].ival < 1) { /* File selection & disposition... */ - - if (pv[SND_DEL].ival > 0) /* /DELETE was specified */ - moving = 1; - debug(F101,"xsend /DELETE","",moving); - if (pv[SND_AFT].ival > 0) /* Copy SEND criteria */ - ckstrncpy(sndafter,pv[SND_AFT].sval,19); - if (pv[SND_BEF].ival > 0) - ckstrncpy(sndbefore,pv[SND_BEF].sval,19); - if (pv[SND_NAF].ival > 0) - ckstrncpy(sndnafter,pv[SND_NAF].sval,19); - if (pv[SND_NBE].ival > 0) - ckstrncpy(sndnbefore,pv[SND_NBE].sval,19); - if (pv[SND_EXC].ival > 0) - makelist(pv[SND_EXC].sval,sndexcept,NSNDEXCEPT); - if (pv[SND_SMA].ival > -1) - sndsmaller = pv[SND_SMA].ival; - if (pv[SND_LAR].ival > -1) - sndlarger = pv[SND_LAR].ival; - if (pv[SND_NAM].ival > -1) { - g_fncnv = fncnv; /* Save global value */ - fncnv = pv[SND_NAM].ival; - debug(F101,"xsend fncnv","",fncnv); - } - if (pv[SND_PTH].ival > -1) { - g_spath = fnspath; /* Save global values */ - fnspath = pv[SND_PTH].ival; -#ifndef NZLTOR - if (fnspath != PATH_OFF) { - g_fncnv = fncnv; /* Bad bad... */ - fncnv = XYFN_C; - } -#endif /* NZLTOR */ - debug(F101,"xsend fnspath","",fnspath); - debug(F101,"xsend fncnv","",fncnv); - } - } - -#ifdef PIPESEND - if (pv[SND_FLT].ival > 0) { - makestr(&sndfilter,pv[SND_FLT].sval); - debug(F110,"xsend /FILTER", sndfilter, 0); - } -#endif /* PIPESEND */ - -#ifdef CK_APC -/* MOVE not allowed in APCs */ - if (moving && - (apcactive == APC_LOCAL || apcactive == APC_REMOTE) - && !(apcstatus & APC_UNCH)) - return(success = 0); -#endif /* CK_APC */ -#ifdef IKS_OPTION - if ( -#ifdef CK_XYZ - protocol == PROTO_K && -#endif /* CK_XYZ */ - !iks_wait(KERMIT_REQ_START,1)) { - printf("?A Kermit Server is not available to process this command.\n"); - printf("?Start a RECEIVE command to complement this command.\n"); - } -#endif /* IKS_OPTION */ - -#ifdef IKSD -#ifdef CK_LOGIN - if (moving && inserver && isguest) { - printf("?File deletion not allowed for guests.\n"); - return(-9); - } -#endif /* CK_LOGIN */ -#endif /* IKSD */ - - sstate = 's'; /* Set start state to SEND */ - sndcmd = 1; -#ifdef CK_RESEND - if (pv[SND_RES].ival > 0) /* Send sendmode appropriately */ - sendmode = SM_RESEND; - else if (pv[SND_STA].ival > 0) - sendmode = SM_PSEND; - else -#endif /* CK_RESEND */ - if (mlist) - sendmode = SM_MSEND; - else - sendmode = SM_SEND; -#ifdef MAC - what = W_SEND; - scrcreate(); -#endif /* MAC */ - if (local && pv[SND_SHH].ival != 0) { /* If in local mode, */ - displa = 1; /* turn on file transfer display */ - } - x = 0; - - xsendx: /* Common exit, including failure */ - debug(F101,"doxsend sndsrc","",sndsrc); - for (i = 0; i <= SND_MAX; i++) { /* Free malloc'd memory */ - if (pv[i].sval) - free(pv[i].sval); - } - return(x); -} -#endif /* NOXFER */ - -#ifndef NOLOCAL -/* D O X C O N N -- CONNECT command parsing with switches */ - -#ifdef XLIMITS -#define XLIMORTRIGGER -#else -#ifdef CK_TRIGGER -#define XLIMORTRIGGER -#endif /* CK_TRIGGER */ -#endif /* XLIMITS */ - -#ifdef CKTIDLE -int tt_idlelimit = 0; /* Terminal idle limit */ -int tt_idleact = IDLE_RET; /* Terminal idle action */ -#endif /* CKTIDLE */ - -#ifdef OS2 /* K95 only: */ -extern int - tt_idlesnd_tmo; /* Idle interval */ -int tt_timelimit = 0; /* Time limit, 0 = none */ -extern char * /* Parse results - strings: */ - tt_idlesnd_str; /* Idle string */ -#endif /* OS2 */ - -#ifdef CK_TRIGGER -extern char *tt_trigger[]; -extern CHAR *tt_trmatch[]; -extern char *triggerval; -static char *g_tt_trigger[TRIGGERS]; -#endif /* CK_TRIGGER */ - -#ifdef OS2 -static int g_tt_idlesnd_tmo, g_tt_timelimit; /* For saving and restoring */ -static int g_tt_idlelimit, g_tt_saved = 0; -static char * g_tt_idlesnd_str; /* global settings */ -#endif /* OS2 */ - -static struct stringint { /* Temporary array for switch values */ - char * sval; - int ival; -} pv[CONN_MAX+1]; - -VOID -resconn() { - int i; - -#ifdef OS2 - if ( g_tt_saved ) { - tt_idlelimit = g_tt_idlelimit; - tt_idlesnd_tmo = g_tt_idlesnd_tmo; - tt_timelimit = g_tt_timelimit; - tt_idlesnd_str = g_tt_idlesnd_str; - g_tt_saved = 0; - } -#endif /* OS2 */ - -#ifdef CK_TRIGGER - for (i = 0; i < TRIGGERS; i++) - tt_trigger[i] = g_tt_trigger[i]; -#endif /* CK_TRIGGER */ - - for (i = 0; i <= CONN_MAX; i++) { /* Free malloc'd memory */ - if (pv[i].sval) - free(pv[i].sval); - pv[i].sval = NULL; - } -} - -int -doxconn(cx) int cx; { - int c, i, n; /* Workers */ - int x, y; - int getval = 0; /* Whether to get switch value */ - int async = 0; /* Make an async connect */ - struct FDB sw, cm; /* FDBs for each parse function */ - extern FILE * tfile[]; - extern char * macp[]; - -#ifdef OS2 - g_tt_idlesnd_tmo = tt_idlesnd_tmo; /* Save global settings */ - g_tt_timelimit = tt_timelimit; - g_tt_idlelimit = tt_idlelimit; - g_tt_idlesnd_str = tt_idlesnd_str; - g_tt_saved = 1; -#endif /* OS2 */ - -#ifdef CK_TRIGGER - if (!tt_trigger[0]) { /* First initialization */ - for (i = 1; i < TRIGGERS; i++) - tt_trigger[i] = NULL; - } - for (i = 0; i < TRIGGERS; i++) - g_tt_trigger[i] = tt_trigger[i]; - if (triggerval) { - free(triggerval); - triggerval = NULL; - } -#endif /* CK_TRIGGER */ - - for (i = 0; i <= CONN_MAX; i++) { /* Initialize switch values */ - pv[i].sval = NULL; /* to null pointers */ - pv[i].ival = -1; /* and -1 int values */ - } - if (cx == XXCQ) /* CQ == CONNECT /QUIETLY */ - pv[CONN_NV].ival = 1; - - /* Set up chained parse functions... */ - - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "Switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nconntab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - conntab, /* Keyword table */ - &cm /* Pointer to next FDB */ - ); - cmfdbi(&cm, /* 2nd FDB - Confirmation */ - _CMCFM, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - NULL, - NULL, - NULL - ); - - while (1) { /* Parse 0 or more switches */ - x = cmfdb(&sw); /* Parse switch or confirmation */ - debug(F101,"doxconn cmfdb","",x); - if (x < 0) { /* Error */ - if (x == -9 || x == -2) - printf("?No switches match - \"%s\"\n",atmbuf); - goto xconnx; /* or reparse needed */ - } - if (cmresult.fcode != _CMKEY) /* Break out if not a switch */ - break; - c = cmgbrk(); /* Get break character */ - getval = (c == ':' || c == '='); /* to see how they ended the switch */ - if (getval && !(cmresult.kflags & CM_ARG)) { - printf("?This switch does not take arguments\n"); - x = -9; - goto xconnx; - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - n = cmresult.nresult; /* Numeric result = switch value */ - debug(F101,"doxconn switch","",n); - - switch (n) { /* Process the switch */ -#ifdef OS2 - case CONN_AS: /* Asynchronous */ - pv[CONN_AS].ival = 1; - pv[CONN_SY].ival = 0; - break; - case CONN_SY: /* Synchronous */ - pv[CONN_SY].ival = 1; - pv[CONN_AS].ival = 0; - break; -#endif /* OS2 */ - case CONN_NV: /* Non-verbal */ - pv[n].ival = 1; - break; -#ifdef XLIMITS - case CONN_II: /* Idle-interval */ - case CONN_IL: /* Idle-limit */ - case CONN_TL: /* Time-limit */ - if (!getval) break; - if ((x = cmnum("Seconds","0",10,&y,xxstring)) < 0) - goto xconnx; - pv[n].ival = y; - break; - case CONN_IS: /* Idle-string */ -#endif /* XLIMITS */ -#ifdef CK_TRIGGER - case CONN_TS: /* Trigger-string */ -#endif /* CK_TRIGGER */ -#ifdef XLIMORTRIGGER - if (!getval) break; - if ((x = cmfld("String (enclose in braces if it contains spaces)", - "",&s,xxstring)) < 0) { - if (x == -3) { - printf("?String required\n"); - x = -9; - } - goto xconnx; - } - if (n != CONN_TS) - s = brstrip(s); - if ((y = strlen(s)) > 0) { - if (pv[n].sval) free(pv[n].sval); - pv[n].sval = malloc(y+1); - if (pv[n].sval) { - strcpy(pv[n].sval,s); /* safe */ - pv[n].ival = 1; - } - } - break; -#endif /* XLIMORTRIGGER */ - default: - printf("?Unexpected switch value - %d\n",cmresult.nresult); - x = -9; - goto xconnx; - } - } - debug(F101,"doxconn cmresult.fcode","",cmresult.fcode); - if (cmresult.fcode != _CMCFM) { - printf("?Unexpected function code: %d\n",cmresult.fcode); - x = -9; - goto xconnx; - } - - /* Command was confirmed so we can pre-pop command level. */ - /* This is so CONNECT module won't think we're executing a script */ - /* if CONNECT was the final command in the script. */ - - if (cmdlvl > 0) - prepop(); - -#ifdef OS2 /* Make results available globally */ - if (pv[CONN_IL].ival > -1) /* Idle limit */ - tt_idlelimit = pv[CONN_IL].ival; - if (pv[CONN_II].ival > -1) /* Idle limit */ - tt_idlesnd_tmo = pv[CONN_II].ival; - if (pv[CONN_IS].sval) /* Idle string */ - if (tt_idlesnd_str = (char *)malloc((int)strlen(pv[CONN_IS].sval)+1)) - strcpy(tt_idlesnd_str,pv[CONN_IS].sval); /* safe */ - if (pv[CONN_TL].ival > -1) /* Session limit */ - tt_timelimit = pv[CONN_TL].ival; - async = (pv[CONN_AS].ival > 0 || - pv[CONN_SY].ival <= 0 && cmdlvl == 0) ? 1 : 0; -#endif /* OS2 */ - -#ifdef CK_TRIGGER - if (pv[CONN_TS].sval) /* Trigger strings */ - makelist(pv[CONN_TS].sval,tt_trigger,TRIGGERS); - for (i = 0; i < TRIGGERS; i++) /* Trigger match pointers */ - tt_trmatch[i] = NULL; - if (triggerval) { /* Reset trigger value */ - free(triggerval); - triggerval = NULL; - } -#endif /* CK_TRIGGER */ - - x = doconect((pv[CONN_NV].ival > 0) ? 1 : 0, async); - { - int xx; - debug(F101,"doxconn doconect returns","",x); - if ((xx = ttchk()) < 0) dologend(); - debug(F101,"doxconn ttchk returns","",xx); - } - -#ifdef CK_TRIGGER - debug(F111,"doxconn doconect triggerval",triggerval,x); -#endif /* CK_TRIGGER */ - - xconnx: - /* Back from CONNECT -- Restore global settings */ - - if (!async) - resconn(); - - success = (x > 0) ? 1 : 0; - return(x); -} -#endif /* NOLOCAL */ - -#ifdef ADDCMD -/* cx == XXADD or XXREMV */ -/* fc == ADD_BIN or ADD_TXT */ -static int -doadd(cx,fc) int cx, fc; { -#ifdef PATTERNS - char * tmp[FTPATTERNS]; - char **p = NULL; - int i, j, k, n = 0, x = 0, last; - -#endif /* PATTERNS */ - if (cx != XXADD && cx != XXREMV) { - printf("?Unexpected function code: %d\n",cx); - return(-9); - } -#ifdef PATTERNS - while (n < FTPATTERNS) { /* Collect new patterns */ - tmp[n] = NULL; - if ((x = cmfld("Pattern","",&s,xxstring)) < 0) - break; - ckstrncpy(line,s,LINBUFSIZ); - s = brstrip(line); - makestr(&(tmp[n++]),s); - } - if (x == -3) - x = cmcfm(); - if (x < 0) - goto xdoadd; - p = (fc == ADD_BIN) ? binpatterns : txtpatterns; /* Which list */ - last = 0; - for (i = 0; i < FTPATTERNS; i++) { /* Find last one in list */ - if (!p[i]) { - last = i; - break; - } - } - if (cx == XXADD) { /* Adding */ - if (last + n > FTPATTERNS) { /* Check if too many */ - printf("?Too many patterns - %d is the maximum\n", FTPATTERNS); - goto xdoadd; - } - for (i = 0; i < n; i++) { /* Copy in the new ones. */ - for (j = 0, x = 0; x == 0 && j < last ; j++ ) - x = !ckstrcmp(tmp[i],p[j],-1,filecase); /* match */ - if (x == 0) - makestr(&(p[last++]),tmp[i]); - } - makestr(&(p[last]),NULL); /* Null-terminate the list */ - x = 1; - goto xdoadd; /* Done */ - } else if (cx == XXREMV) { /* Remove something(s) */ - int j, k; - if (last == 0) /* List is empty */ - goto xdoadd; /* Nothing to remove */ - for (i = 0; i < n; i++) { /* i = Patterns they typed */ - for (j = 0; j < last; j++) { /* j = Patterns in list */ - /* Change this to ckstrcmp()... */ - if (filecase) - x = !ckstrcmp(tmp[i],p[j],-1,filecase); /* match */ - else - x = ckstrcmp(tmp[i],p[j],-1,0); /* Case-independent match */ - if (x) { /* This one matches */ - makestr(&(p[j]),NULL); /* Free it */ - for (k = j; k < last; k++) /* Move the rest up */ - p[k] = p[k+1]; - p[k] = NULL; /* Erase last one */ - if (!p[k]) - break; - } - } - } - } - xdoadd: /* Common exit */ - for (i = 0; i < n; i++) - if (tmp[i]) - free(tmp[i]); - return(x); -#endif /* PATTERNS */ -} - -/* ADD SEND-LIST */ - -static int -addsend(cx) int cx; { -#ifndef NOMSEND - extern struct keytab fttab[]; - extern int nfttyp; - struct filelist * flp; - char * fmode = ""; - int xmode = 0; - int xbinary = 0; -#endif /* NOMSEND */ - -#ifdef NOMSEND - printf("?Sorry, ADD/REMOVE SEND-LIST not available.\n"); - return(-9); -#endif /* NOMSEND */ - if (cx == XXREMV) { - printf("?Sorry, REMOVE SEND-LIST not implemented yet.\n"); - return(-9); - } -#ifndef NOMSEND -#ifndef XYZ_INTERNAL - if (protocol != PROTO_K) { - printf("?Sorry, ADD SEND-LIST does not work with external protocols\n"); - return(-9); - } -#endif /* XYZ_INTERNAL */ - - x = cmifi("File specification to add","", &s,&y,xxstring); - if (x < 0) { - if (x == -3) { - printf("?A file specification is required\n"); - return(-9); - } else - return(x); - } - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - s = tmpbuf; - if (filesinlist == 0) /* Take care of \v(filespec) */ - fspec[0] = NUL; - zfnqfp(s,LINBUFSIZ,line); - s = line; - if (((int)strlen(fspec) + (int)strlen(s) + 1) < fspeclen) { - strcat(fspec,s); /* safe */ - strcat(fspec," "); /* safe */ - } else - printf("WARNING - \\v(filespec) buffer overflow\n"); - - - xbinary = binary; - if ((patterns || filepeek) /* FILE PATTERNS or SCAN is ON */ -#ifdef CK_LABELED - && binary != XYFT_L /* And not if FILE TYPE LABELED */ -#endif /* CK_LABELED */ -#ifdef VMS - && binary != XYFT_I /* or FILE TYPE IMAGE */ -#endif /* VMS */ - ) { - int k, x; - x = -1; - k = scanfile(line,&x,nscanfile); - if (k > 0) xbinary = (k == FT_BIN) ? XYFT_B : XYFT_T; - } - fmode = gfmode(xbinary,0); - if ((x = cmkey(fttab,nfttyp, - "type of file transfer", fmode, xxstring)) < 0) - return(x); - xmode = x; - - cmarg2 = ""; - if ((x = cmfld(y ? - "\nAs-name template containing replacement variables such as \\v(filename)" : - "Name to send it with", "",&s,NULL)) < 0) - if (x != -3) - return(x); -#ifndef NOSPL - if (y && *s) { - char * p = tmpbuf; - x = TMPBUFSIZ; - zzstring(s,&p,&x); - if (!strcmp(tmpbuf,s)) { - printf( - "?As-name for file group must contain variables such as \\v(filename)\n" - ); - return(-9); - } - } -#endif /* NOSPL */ - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - cmarg2 = tmpbuf; - - if ((x = cmcfm()) < 0) - return(x); - flp = (struct filelist *) malloc(sizeof(struct filelist)); - if (flp) { - if (filetail) - filetail->fl_next = flp; - filetail = flp; - if (!filehead) - filehead = flp; - x = (int) strlen(line); /* Length of filename */ - s = (char *) malloc(x + 1); - if (s) { - strcpy(s,line); /* safe */ - flp->fl_name = s; - flp->fl_mode = xmode; - x = (int) strlen(cmarg2); /* Length of as-name */ - if (x < 1) { - flp->fl_alias = NULL; - } else { - s = (char *) malloc(x + 1); - if (s) { - strcpy(s,cmarg2); /* safe */ - flp->fl_alias = s; - } else { - printf("Sorry, can't allocate space for as-name"); - return(-9); - } - } - flp->fl_next = NULL; - filesinlist++; /* Count this node */ - return(success = 1); /* Finished adding this node */ - } else { - printf("Sorry, can't allocate space for name"); - return(-9); - } - } else { - printf("Sorry, can't allocate file list node"); - return(-9); - } -#endif /* NOMSEND */ -} -#endif /* ADDCMD */ - -#ifndef NOHTTP /* HTTP ops... */ -#ifdef TCPSOCKET -#define HTTP_GET 0 /* GET */ -#define HTTP_PUT 1 /* PUT */ -#define HTTP_POS 2 /* POST */ -#define HTTP_IDX 3 /* INDEX */ -#define HTTP_HED 4 /* HEAD */ -#define HTTP_DEL 5 /* DELETE */ -#define HTTP_CON 6 /* CONNECT */ -#define HTTP_OPN 7 /* OPEN */ -#define HTTP_CLS 8 /* CLOSE */ - -static struct keytab httptab[] = { - { "close", HTTP_CLS, 0 }, - { "connect", HTTP_CON, 0 }, - { "delete", HTTP_DEL, 0 }, - { "get", HTTP_GET, 0 }, - { "head", HTTP_HED, 0 }, - { "index", HTTP_IDX, 0 }, - { "open", HTTP_OPN, 0 }, - { "put", HTTP_PUT, 0 }, - { "post", HTTP_POS, 0 } -}; -static int nhttptab = sizeof(httptab)/sizeof(struct keytab); - -/* HTTP switches */ -#define HT_SW_AG 0 /* /AGENT */ -#define HT_SW_HD 1 /* /HEADER */ -#define HT_SW_US 2 /* /USER */ -#define HT_SW_PW 3 /* /PASSWORD */ -#define HT_SW_AR 4 /* /ARRAY */ -#define HT_SW_TP 5 /* /TOSCREEN */ - -static struct keytab httpswtab[] = { - { "/agent", HT_SW_AG, CM_ARG }, -#ifndef NOSPL - { "/array", HT_SW_AR, CM_ARG }, -#endif /* NOSPL */ - { "/header", HT_SW_HD, CM_ARG }, - { "/password", HT_SW_PW, CM_ARG }, - { "/toscreen", HT_SW_TP, 0 }, - { "/user", HT_SW_US, CM_ARG }, - { "", 0, 0 } -}; -static int nhttpswtab = sizeof(httpswtab)/sizeof(struct keytab) - 1; - -/* HTTP PUT/POST switches */ -#define HT_PP_MT 0 /* /MIME-TYPE */ - -static struct keytab httpptab[] = { - { "/mime-type", HT_PP_MT, CM_ARG }, - { "", 0, 0 } -}; -static int nhttpptab = sizeof(httpptab)/sizeof(struct keytab) - 1; - -#define HTTP_MAXHDR 8 - -static int -xdohttp(action, lfile, rf, dfile, agent, hdr, user, pass, mime, array, type) - int action; - char *lfile, *rf, *dfile, *agent, *hdr, *user, *pass, *mime, array; - int type; -/* xdohttp */ { - int i, rc = 0; - char * hdrlist[HTTP_MAXHDR]; - char rfile[CKMAXPATH+1]; - extern int httpfd; - - /* Check for a valid state to execute the command */ - if (inserver) { - printf("?The HTTP command may not be used from the IKS\r\n"); - } else if (httpfd == -1) { - if (http_reopen() < 0) - printf("?No connection\n"); - else - rc = 1; - } else { - rc = 1; - } - - /* If the command is not valid, exit with failure */ - if (rc == 0) - return(success = 0); - - if (action != HTTP_CON && rf[0] != '/') { - rfile[0] = '/'; - ckstrncpy(&rfile[1],rf,CKMAXPATH); - } else { - ckstrncpy(rfile,rf,CKMAXPATH); - } - for (i = 0; i < HTTP_MAXHDR; i++) /* Initialize header list */ - hdrlist[i] = NULL; - makelist(hdr,hdrlist,HTTP_MAXHDR); /* Make header list */ - -#ifdef BETADEBUG - for (i = 0; i < nhttptab; i++) /* Find action keyword */ - if (httptab[i].kwval == action) - break; - if (i == nhttptab) { /* Shouldn't happen... */ - printf("?Invalid action - %d\n",action); - return(0); /* Failure */ - } - - printf("HTTP action: %s\n",httptab[i].kwd); - printf(" Agent: %s\n",agent ? agent : "(null)"); - - if (hdrlist[1]) { - printf(" Header list: 1. %s\n",hdrlist[0]); - for (i = 1; i < HTTP_MAXHDR && hdrlist[i]; i++) - printf("%15d. %s\n",i+1,hdrlist[i]); - } else - printf(" Header: %s\n",hdrlist[0] ? hdrlist[0] : "(null)"); - - printf(" User: %s\n",user ? user : "(null)"); -#ifdef COMMENT - printf(" Password: %s\n",pass ? pass : "(null)"); -#endif /* COMMENT */ - -#ifndef NOSPL - if (array) - printf(" Array: \\%%%c[]\n", array); - else - printf(" Array: (none)\n"); -#endif /* NOSPL */ - - if (action == HTTP_PUT || action == HTTP_POS) - printf(" Mime-type: %s\n",mime ? mime : "(null)"); - - printf(" Local file: %s\n",lfile ? lfile : "(null)"); - printf(" Remote file: %s\n",rfile ? rfile : "(null)"); - printf(" Destination file: %s\n",dfile ? dfile : "(null)"); -#endif /* BETADEBUG */ - - /* The http_xxxx() functions return 0 on success, -1 on failure */ - switch (action) { - case HTTP_CON: { - extern int ttyfd; - rc = http_connect(httpfd,agent,hdrlist,user,pass,array,rfile); - break; - } - case HTTP_DEL: - rc = http_delete(agent,hdrlist,user,pass,array,rfile); - break; - case HTTP_GET: - rc = http_get(agent,hdrlist,user,pass,array,lfile,rfile,type); - break; - case HTTP_HED: - rc = http_head(agent,hdrlist,user,pass,array,lfile,rfile,type); - break; - case HTTP_PUT: - rc = http_put(agent,hdrlist,mime,user,pass,array,lfile,rfile,dfile, - type); - break; - case HTTP_POS: - rc = http_post(agent,hdrlist,mime,user,pass,array,lfile,rfile,dfile, - type); - break; - case HTTP_IDX: - rc = http_index(agent,hdrlist,user,pass,array,lfile,rfile,type); - break; - default: - rc = -1; - } - return(rc == 0 ? 1 : 0); /* Success is set by caller */ -} -#endif /* TCPSOCKET */ -#endif /* NOHTTP */ - -#ifndef NOSPL /* ARRAY ops... */ -static struct keytab arraytab[] = { - { "clear", ARR_CLR, 0 }, - { "copy", ARR_CPY, 0 }, - { "dcl", ARR_DCL, CM_INV }, - { "declare", ARR_DCL, 0 }, - { "destroy", ARR_DST, CM_INV }, - { "equate", ARR_EQU, CM_INV }, - { "link", ARR_EQU, 0 }, - { "resize", ARR_RSZ, 0 }, - { "set", ARR_SET, 0 }, -#ifndef NOSHOW - { "show", ARR_SHO, 0 }, -#endif /* NOSHOW */ - { "sort", ARR_SRT, 0 }, - { "undeclare", ARR_DST, 0 }, - { "", 0, 0 } -}; -static int narraytab = sizeof(arraytab)/sizeof(struct keytab) - 1; - -#ifdef CKLEARN -static struct keytab learnswi[] = { - { "/close", 2, 0 }, - { "/off", 0, 0 }, - { "/on", 1, 0 } -}; -#endif /* CKLEARN */ - -int -arrayitoa(x) int x; { /* Array index to array letter */ - if (x == 1) - return(64); - else if (x < 0 || x > (122 - ARRAYBASE)) - return(-1); - else - return(x + ARRAYBASE); -} - -int -arrayatoi(c) int c; { /* Array letter to array index */ - if (c == 64) - c = 96; - if (c > 63 && c < 91) - c += 32; - if (c < ARRAYBASE || c > 122) - return(-1); - return(c - ARRAYBASE); -} - -static int /* Declare an array */ -dodcl(cx) int cx; { - int i, n, v, lo, hi, rc = 0; - int isdynamic = 0; - char tmpbuf[64]; - char ** p = NULL; - char tmp[64]; /* Local temporary string buffer */ - if ((y = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */ - if (y == -3) { - printf("?Array name required\n"); - return(-9); - } else return(y); - } - ckstrncpy(line,s,LINBUFSIZ); - s = line; - x = arraybounds(s,&lo,&hi); /* Check syntax and get bounds */ - debug(F111,"dodcl arraybounds",s,x); - if (x < 0) { /* Error - Maybe it's a variable */ - char * p; /* whose value is an array name */ - int n; - p = tmpbuf; - n = 63; - p[0] = NUL; - if (s[0] == CMDQ && s[1] == '&') - s++; - if (zzstring(s,&p,&n) > -1) { - s = tmpbuf; - x = arraybounds(s,&lo,&hi); - debug(F111,"dodcl arraybounds 2",s,x); - } - if (x < 0) { - printf("?Bad array name - \"%s\"\n",s); - return(-9); - } - } - debug(F101,"dodcl hi","",hi); - debug(F101,"dodcl lo","",lo); - debug(F101,"dodcl lo+1","",lo+1); - - if (lo == -1 && hi == -1) { /* Have good array name and bounds */ - isdynamic = 1; - n = CMDBL / 5; - } else if (hi > -1) { - printf("?Segment notation not allowed in array declarations\n"); - return(-9); - } else if ((lo+1) < 0) { - debug(F101,"dodcl underflow","",lo+1); - printf("?Dimension underflow\n"); - return(-9); - } else - n = lo; - x = arrayitoa(x); - if (cx == XXUNDCL) { - n = 0; - v = 0; - if ((y = cmcfm()) < 0) - return(y); - } else { - p = (char **)malloc(sizeof(char **)*(n+1)); - if (!p) { - printf("?Memory allocation error\n"); - return(-9); - } - v = 0; /* Highest initialized member */ - p[0] = NULL; /* Element 0 */ - keepallchars = 1; - while (n > 0 && v < n) { /* Parse initializers */ - p[v+1] = NULL; - ckmakxmsg(tmp, - 64, - "Initial value for \\&", - ckctoa((char)x), - "[", - ckitoa(v+1), - "]", - NULL,NULL,NULL,NULL,NULL,NULL,NULL - ); - if ((rc = cmfld((char *)tmp,"",&s,xxstring)) < 0) { /* Get field */ - if (rc == -3) /* If answer is empty, we're done */ - break; - else /* Parse error, free temp pointers */ - goto dclx; - } - rc = 1; - if (v == 0 && !strcmp(s,"=")) /* Skip the = sign. */ - continue; - s = brstrip(s); /* Strip any braces */ - makestr(&(p[++v]),s); - } - keepallchars = 0; - if ((y = cmtxt("Carriage return to confirm","",&s,NULL)) < 0) - return(y); - if (isdynamic) - n = v; - } - if (dclarray((char)x,n) < 0) { /* Declare the array */ - printf("?Declare failed\n"); - goto dclx; - } - for (i = 1; i <= v; i++) { /* Add any initial values */ - tmp[0] = '&'; - ckmakmsg(&tmp[1],63,ckctoa((char)x),"[",ckitoa(i),"]"); - if (addmac(tmp,p[i]) < 0) { - printf("Array initialization error: %s %s\n",tmp,p[i]); - rc = -9; - goto dclx; - } - } - dclx: - if (p) { - for (i = 1; i <= v; i++) - if (p[i]) free(p[i]); - free((char *)p); - } - debug(F101,"DCL rc","",rc); - return(success = rc); -} - -static int -rszarray() { - int i, x, y, n, lo, hi, islink = -1; - char c, * s, ** ap = NULL; - if ((x = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */ - if (x == -3) { - printf("?Array name required\n"); - return(-9); - } else return(x); - } - ckstrncpy(line,s,LINBUFSIZ); /* Make safe copy of name */ - s = line; - x = arraybounds(s,&lo,&hi); - if (x < 0) { /* Parse the name, get index */ - printf("?Bad array reference - \"%s\"\n", s); - return(-9); - } - if (lo < 0 && hi < 0) { - y = cmnum("New size","",10,&lo,xxstring); - if (y < 0) { - if (y == -3) - printf("?New size required\n"); - return(y); - } - } - if ((y = cmcfm()) < 0) - return(y); - if (a_link[x] > -1) { /* Link? */ - islink = x; /* Yes follow it */ - x = a_link[x]; /* and remember */ - } - if (!a_ptr[x]) { - printf("?Array not declared - \"%s\"\n", s); - return(-9); - } - if (lo < 0) { - printf("?New size required\n"); - return(-9); - } - if (hi > -1) { - printf("?Array segments not allowed for this operation\n"); - return(-9); - } - c = arrayitoa(x); /* Get array letter */ - if (c == '@') { /* Argument vector array off limits */ - printf("?Sorry, \\&@[] is read-only\n"); - return(-9); - } - if (lo == 0) { /* If new size is 0... */ - dclarray(c,0); /* Undeclare the array */ - return(success = 1); - } - n = a_dim[x]; /* Current size */ - ap = (char **) malloc((lo+1) * sizeof(char *)); /* New array */ - y = (n < lo) ? n : lo; - for (i = 0; i <= y; i++) /* Copy the part that fits */ - ap[i] = a_ptr[x][i]; - if (n < lo) { /* If original array smaller */ - for (; i <= lo; i++) /* initialize extra elements in */ - ap[i] = NULL; /* new array to NULL. */ - } else if (n > lo) { /* If new array smaller */ - for (; i <= lo; i++) /* deallocate leftover elements */ - makestr(&(a_ptr[x][i]),NULL); /* from original array. */ - } - free((char *)a_ptr[x]); /* Free original array list */ - a_ptr[x] = ap; /* Replace with new one */ - a_dim[x] = lo; /* Record the new dimension */ - if (islink > -1) { /* Was this a link? */ - a_ptr[islink] = ap; /* If so point to the resized array */ - a_dim[islink] = lo; - } else { /* If not are there links to here? */ - for (i = 0; i < (int) 'z' - ARRAYBASE; i++) { /* Any linked arrays? */ - if (i != x && a_link[i] == x) { /* Find and update them */ - a_ptr[i] = ap; - a_dim[i] = lo; - } - } - } - return(success = 1); -} - -static int -copyarray() { - int i, j, x1, lo1, hi1, x2, lo2, hi2, whole = 0; - char c1, c2, * a1, * a2; - if ((y = cmfld("Name of source array","",&s,NULL)) < 0) - return(y); - ckstrncpy(line,s,LINBUFSIZ); - a1 = line; - if ((x1 = arraybounds(a1,&lo1,&hi1)) < 0) { - printf("?Bad array reference - \"%s\"\n", a1); - return(-9); - } else if (!a_ptr[x1]) { - printf("?Array not declared - \"%s\"\n", a1); - return(-9); - } - c1 = arrayitoa(x1); - - if ((y = cmfld("Name of destination array","",&s,NULL)) < 0) - return(y); - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - a2 = tmpbuf; - if ((x2 = arraybounds(a2,&lo2,&hi2)) < 0) { - printf("?Bad array reference - \"%s\"\n", a2); - return(-9); - } - c2 = arrayitoa(x2); - - if ((x = cmcfm()) < 0) - return(x); - - if (c2 == '@') { /* Argument vector array off limits */ - printf("?Sorry, \\&@[] is read-only\n"); - return(-9); - } - if (lo1 < 0 && lo2 < 0 && hi1 < 0 && hi2 < 0) /* Special case for */ - whole = 1; /* whole array... */ - - if (lo1 < 0) lo1 = whole ? 0 : 1; /* Supply lower bound of source */ - if (hi1 < 0) hi1 = a_dim[x1]; /* Supply upper bound of source */ - if (lo2 < 0) lo2 = whole ? 0 : 1; /* Lower bound of target */ - if (hi2 < 0) hi2 = lo2 + hi1 - lo1; /* Upper bound of target */ - if (a_ptr[x2]) { /* Target array is already declared? */ - if (hi2 > a_dim[x2]) /* If upper bound out of range */ - hi2 = a_dim[x2]; /* shrink to fit */ - } else { /* Otherwise... */ - x2 = dclarray(c2, hi2); /* declare the target array */ - } - for (i = lo1, j = lo2; i <= hi1 && j <= hi2; i++,j++) { /* Copy */ - makestr(&(a_ptr[x2][j]),a_ptr[x1][i]); - } - return(success = 1); -} - -static int /* Undeclare an array */ -unarray() { - int x, y, n, rc = 0; - char c, * s; - - if ((y = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */ - if (y == -3) { - printf("?Array name required\n"); - return(-9); - } else return(y); - } - ckstrncpy(line,s,LINBUFSIZ); /* Make safe copy of name */ - s = line; - if ((y = cmcfm()) < 0) - return(y); - if ((x = arraybounds(s,&y,&n)) < 0) { /* Parse the name, get index */ - printf("?Bad array reference - \"%s\"\n", s); - return(-9); - } - if (y > 0 || n > 0) { - printf("?Partial arrays can not be destroyed\n"); - return(-9); - } - c = arrayitoa(x); /* Get array letter */ - if (a_ptr[x]) { /* If array is declared */ - if (c == '@') { /* Argument vector array off limits */ - printf("?Sorry, \\&@[] is read-only\n"); - return(-9); - } - rc = dclarray(c,0); /* Undeclare the array */ - } else /* It wasn't declared */ - rc = 1; - if (rc > -1) { /* Set return code and success */ - success = 1; - rc = 1; - } else { - success = 0; - printf("?Failed - destroy \"\\&%c[]\"\n", c); - rc = -9; - } - return(rc); -} - -static int -clrarray(cx) int cx; { - int i, x, lo, hi; - char c, * s, * val = NULL; - - if ((x = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */ - if (x == -3) { - printf("?Array name required\n"); - return(-9); - } else return(x); - } - ckstrncpy(line,s,LINBUFSIZ); /* Make safe copy of name */ - s = line; - if (cx == ARR_SET) { /* SET */ - if ((x = cmtxt("Value","",&val,xxstring)) < 0) - return(x); - ckstrncpy(tmpbuf,val,TMPBUFSIZ); /* Value to set */ - val = tmpbuf; - if (!*val) val = NULL; - } else if ((x = cmcfm()) < 0) /* CLEAR */ - return(x); - - if ((x = arraybounds(s,&lo,&hi)) < 0) { /* Parse the name */ - printf("?Bad array reference - \"%s\"\n", s); - return(-9); - } - c = arrayitoa(x); /* Get array letter */ - if (!a_ptr[x]) { /* If array is declared */ - printf("?Array %s is not declared\n", s); - return(-9); - } else if (c == '@') { /* Argument vector array off limits */ - printf("?Sorry, \\&@[] is read-only\n"); - return(-9); - } - if (lo < 0) lo = 0; - if (hi < 0) hi = a_dim[x]; - for (i = lo; i <= hi; i++) /* Clear/Set selected range */ - makestr(&(a_ptr[x][i]),val); - - return(success = 1); -} - -extern char **aa_ptr[CMDSTKL][28]; -extern int aa_dim[CMDSTKL][28]; - -static int /* Create symbolic link to an array */ -linkarray() { - int i = 0, x, y, lo, hi, flag = 0; - char c, * s, * p; - - if ((x = cmfld("Array name not currently in use","",&s,NULL)) < 0) { - if (x == -3) { - printf("?Array name required\n"); - return(-9); - } else return(x); - } - ckstrncpy(line,s,LINBUFSIZ); /* Make safe copy of link name */ - s = line; - if ((x = cmfld("Name of existing array","",&p,xxstring)) < 0) { - if (x == -3) { - printf("?Array name required\n"); - return(-9); - } else return(x); - } - ckstrncpy(tmpbuf,p,TMPBUFSIZ); /* Make safe copy of array name */ - p = tmpbuf; - if ((x = cmcfm()) < 0) - return(x); - - if ((x = arraybounds(s,&lo,&hi)) < 0) { /* Parse the link name */ - printf("?Bad array reference - \"%s\"\n", s); - return(-9); - } - if (a_ptr[x]) { /* Must not already exist */ - c = arrayitoa(x); - printf("?Array already exists: \\&%c[]\n", c); - return(-9); - } - if (lo > -1 || hi > -1) { - printf("?Sorry, whole arrays only: %s\n",s); - return(-9); - } - if ((y = arraybounds(p,&lo,&hi)) < 0) { /* Parse the array name */ - printf("?Bad array reference - \"%s\"\n", s); - return(-9); - } - if (lo > -1 || hi > -1) { - printf("?Sorry, whole arrays only: %s\n",p); - return(-9); - } - if (x == y) { - for (i = cmdlvl; i >= 0; i--) - if (aa_ptr[i][x]) { - flag++; - break; - } - } - if (flag) { - a_ptr[x] = aa_ptr[i][y]; /* Link to saved copy */ - a_dim[x] = aa_dim[i][y]; - } else { /* Otherwise... */ - c = arrayitoa(y); /* Check if it's declared */ - if (!a_ptr[y]) { - printf("?Array is not declared: \\&%c[]\n", c); - return(-9); - } - if (a_link[y] > -1) { /* And if it's a link itself */ - printf("?Links to links not allowed: \\&%c[]\n", c); - return(-9); - } - a_ptr[x] = a_ptr[y]; /* All OK, make the link */ - a_dim[x] = a_dim[y]; - } - a_link[x] = y; - return(success = 1); -} -#endif /* NOSPL */ - -#ifndef NOCSETS -static char * dcsetname = NULL; - -/* Get Display Character-Set Name */ - -char * -getdcset() { - char * s; - int y; -#ifdef PCFONTS - extern int tt_font, ntermfont; - extern struct keytab term_font[]; -#endif /* PCFONTS */ - - s = ""; -#ifdef OS2 - y = os2getcp(); /* Default is current code page */ - switch (y) { - case 437: s = "cp437"; break; - case 850: s = "cp850"; break; - case 852: s = "cp852"; break; - case 857: s = "cp857"; break; - case 858: s = "cp858"; break; - case 862: s = "cp862"; break; - case 866: s = "cp866"; break; - case 869: s = "cp869"; break; - case 1250: s = "cp1250"; break; - case 1251: s = "cp1251"; break; - case 1252: s = "cp1252"; break; - case 1253: s = "cp1253"; break; - case 1254: s = "cp1254"; break; - case 1255: s = "cp1255"; break; - case 1256: s = "cp1256"; break; - case 1257: s = "cp1257"; break; - case 1258: s = "cp1258"; break; - } -#ifdef PCFONTS -/* - If the user has loaded a font with SET TERMINAL FONT then we want - to change the default code page to the font that was loaded. -*/ - if (tt_font != TTF_ROM) { - for (y = 0; y < ntermfont; y++ ) { - if (term_font[y].kwval == tt_font) { - s = term_font[y].kwd; - break; - } - } - } -#endif /* PCFONTS */ -#else /* OS2 */ -#ifdef COMMENT - /* Hack not needed as of C-Kermit 7.1 */ - if (fcharset == FC_1LATIN) { - s = "latin1-iso"; /* Hack to avoid reporting "cp1252" */ - } else { /* Report current file character set */ -#endif /* COMMENT */ - for (y = 0; y <= nfilc; y++) - if (fcstab[y].kwval == fcharset) { - s = fcstab[y].kwd; - break; - } -#ifdef COMMENT - } -#endif /* COMMENT */ -#endif /* OS2 */ - makestr(&dcsetname,s); /* Return stable pointer */ - return((char *)dcsetname); -} -#endif /* NOCSETS */ - -#ifndef NOFRILLS -static int -doclear() { - if ((x = cmkey(clrtab,nclear,"item to clear", -#ifdef NOSPL - "device-buffer" -#else - "device-and-input" -#endif /* NOSPL */ - ,xxstring)) < 0) return(x); -#ifndef NOSPL -#ifdef OS2 - if (x == CLR_CMD || x == CLR_TRM) { - if ((z = cmkey(clrcmdtab,nclrcmd,"how much screen to clear\n", - "all",xxstring)) < 0) - return(z); - } -#endif /* OS2 */ -#endif /* NOSPL */ - if ((y = cmcfm()) < 0) - return(y); - - /* Clear device input buffer if requested */ - y = (x & CLR_DEV) ? ttflui() : 0; - - if (x & CLR_SCR) /* CLEAR SCREEN */ - y = ck_cls(); /* (= SCREEN CLEAR = CLS) */ - - if (x & CLR_KBD) { /* CLEAR KEYBOARD */ - int n; - n = conchk(); - y = 0; - while (n-- > 0 && (y = coninc(0) > -1)) - ; - y = (y > -1) ? 0 : -1; - } - -#ifndef NOSPL - /* Clear INPUT command buffer if requested */ - if (x & CLR_INP) { - for (z = 0; z < inbufsize; z++) - inpbuf[z] = NUL; - inpbp = inpbuf; - y = 0; - } -#ifdef CK_APC - if (x & CLR_APC) { - debug(F101,"Executing CLEAR APC","",apcactive); - apcactive = 0; - y = 0; - } -#endif /* CK_APC */ - if (x & CLR_ALR) { - setalarm(0L); - y = 0; - } -#endif /* NOSPL */ - -#ifdef PATTERNS - if (x & (CLR_TXT|CLR_BIN)) { - int i; - for (i = 0; i < FTPATTERNS; i++) { - if (x & CLR_TXT) - makestr(&txtpatterns[i],NULL); - if (x & CLR_BIN) - makestr(&binpatterns[i],NULL); - } - y = 0; - } -#endif /* PATTERNS */ - -#ifndef NODIAL - if (x & CLR_DIA) { - dialsta = DIA_UNK; - y = 0; - } -#endif /* NODIAL */ - -#ifndef NOMSEND - if (x & CLR_SFL) { /* CLEAR SEND-LIST */ - if (filehead) { - struct filelist * flp, * next; - flp = filehead; - while (flp) { - if (flp->fl_name) - free(flp->fl_name); - if (flp->fl_alias) - free(flp->fl_alias); - next = flp->fl_next; - free((char *)flp); - flp = next; - } - } - filesinlist = 0; - filehead = NULL; - filetail = NULL; - addlist = 0; - y = 0; - } -#endif /* NOMSEND */ - -#ifdef OS2 -#ifndef NOLOCAL - switch (x) { - case CLR_SCL: - clearscrollback(VTERM); - break; - case CLR_CMD: - switch ( z ) { - case CLR_C_ALL: - clear(); - break; - case CLR_C_BOS: - clrboscr_escape(VCMD,SP); - break; - case CLR_C_BOL: - clrbol_escape(VCMD,SP); - break; - case CLR_C_EOL: - clrtoeoln(VCMD,SP); - break; - case CLR_C_EOS: - clreoscr_escape(VCMD,SP); - break; - case CLR_C_LIN: - clrline_escape(VCMD,SP); - break; - case CLR_C_SCR: - clearscrollback(VCMD); - break; - default: - printf("Not implemented yet, sorry.\n"); - break; - } - break; - -#ifndef NOTERM - case CLR_TRM: - switch ( z ) { - case CLR_C_ALL: - if (VscrnGetBufferSize(VTERM) > 0 ) { - VscrnScroll(VTERM, UPWARD, 0, - VscrnGetHeight(VTERM)-(tt_status[VTERM]?2:1), - VscrnGetHeight(VTERM) - - (tt_status[VTERM]?1:0), TRUE, SP - ); - cleartermscreen(VTERM); - } - break; - case CLR_C_BOS: - clrboscr_escape(VTERM,SP); - break; - case CLR_C_BOL: - clrbol_escape(VTERM,SP); - break; - case CLR_C_EOL: - clrtoeoln(VTERM,SP); - break; - case CLR_C_EOS: - clreoscr_escape(VTERM,SP); - break; - case CLR_C_LIN: - clrline_escape(VTERM,SP); - break; - case CLR_C_SCR: - clearscrollback(VTERM); - break; - default: - printf("Not implemented yet, sorry.\n"); - break; - } - break; -#endif /* NOTERM */ - } - y = 0; -#endif /* NOLOCAL */ -#endif /* OS2 */ - return(success = (y == 0)); -} -#endif /* NOFRILLS */ - -#ifndef NOSPL -static int -doeval(cx) int cx; { - char *p; - char vnambuf[VNAML], * vnp = NULL; /* These must be on the stack */ - if (!oldeval) { - if ((y = cmfld("Variable name","",&s, - ((cx == XX_EVAL) ? xxstring : NULL))) < 0) { - if (y == -3) { - printf("?Variable name required\n"); - return(-9); - } else return(y); - } - ckstrncpy(vnambuf,s,VNAML); /* Make a copy. */ - vnp = vnambuf; - if (vnambuf[0] == CMDQ && - (vnambuf[1] == '%' || vnambuf[1] == '&')) - vnp++; - y = 0; - if (*vnp == '%' || *vnp == '&') { - if ((y = parsevar(vnp,&x,&z)) < 0) - return(y); - } - } - if ((x = cmtxt("Integer arithmetic expression","",&s,xxstring)) < 0) - return(x); - p = evala(s); - if (!p) p = ""; - if (oldeval && *p) - printf("%s\n", p); - ckstrncpy(evalbuf,p,32); - if (!oldeval) - return(success = addmac(vnambuf,p)); - else - return(success = *p ? 1 : 0); -} -#endif /* NOSPL */ - -#ifdef TNCODE -static int -dotelopt() { - if ((x = cmkey(telcmd, ntelcmd, "TELNET command", "", xxstring)) < 0 ) - return(x); - switch (x) { - case WILL: - case WONT: - case DO: - case DONT: - if ((y = cmkey(tnopts,ntnopts,"TELNET option","",xxstring)) < 0) - return(y); - if ((z = cmcfm()) < 0) return(z); - - switch (x) { - case WILL: - if (TELOPT_UNANSWERED_WILL(y)) - return(success = 0); - break; - case WONT: - if (TELOPT_UNANSWERED_WONT(y)) - return(success = 0); - break; - case DO: - if (TELOPT_UNANSWERED_DO(y)) - return(success = 0); - break; - case DONT: - if (TELOPT_UNANSWERED_DONT(y)) - return(success = 0); - break; - } - if (local) { - success = ((tn_sopt(x,y) > -1) ? 1 : 0); - } else { - printf("ff%02x%02x\n",x,y); - success = 1; - } - if (success) { - switch (x) { - case WILL: - TELOPT_UNANSWERED_WILL(y) = 1; - break; - case WONT: - if ( TELOPT_ME(y) ) - TELOPT_UNANSWERED_WONT(y) = 1; - break; - case DO: - TELOPT_UNANSWERED_DO(y) = 1; - break; - case DONT: - if ( TELOPT_ME(y) ) - TELOPT_UNANSWERED_DONT(y) = 1; - break; - } - if (tn_wait("XXTELOP") < 0) { - tn_push(); - success = 0; - } - } - return(success); - case SB: - if ((y=cmkey(tnsbopts,ntnsbopts,"TELNET option","",xxstring)) < 0) - return(y); - switch (y) { - case TELOPT_NAWS: - /* Some compilers require switch() to have at least 1 case */ -#ifdef CK_NAWS - TELOPT_SB(TELOPT_NAWS).naws.x = 0; - TELOPT_SB(TELOPT_NAWS).naws.y = 0; - if (local) - return(success = ((tn_snaws() > -1) ? 1 : 0)); - else - return(success = 0); -#else - return(success = 0); -#endif /* CK_NAWS */ - } - return(success = 0); - -#ifdef CK_KERBEROS -#ifdef KRB5 - case TN_FWD: - success = (kerberos5_forward() == AUTH_SUCCESS); - return(success); -#endif /* KRB5 */ -#endif /* CK_KERBEROS */ - - default: - if ((z = cmcfm()) < 0) return(z); -#ifndef NOLOCAL - if (local) { - CHAR temp[3]; - if (network && IS_TELNET()) { /* TELNET */ - temp[0] = (CHAR) IAC; - temp[1] = x; - temp[2] = NUL; - success = (ttol((CHAR *)temp,2) > -1 ? 1 : 0); - if (tn_deb || debses || deblog) { - /* TN_MSG_LEN is in ckctel.h */ - ckmakmsg(tn_msg,256,"TELNET SENT ",TELCMD(x),NULL,NULL); - debug(F101,tn_msg,"",x); - if (debses || tn_deb) tn_debug(tn_msg); - } - return(success); - } - return(success = 0); - } else { -#endif /* NOLOCAL */ - printf("ff%02x\n",x); - return(success = 1); -#ifndef NOLOCAL - } -#endif /* NOLOCAL */ - } -} -#endif /* TNCODE */ - - -#ifndef NOPUSH -#ifndef NOFRILLS -static int -doedit() { -#ifdef OS2 - char * p = NULL; -#endif /* OS2 */ - if (!editor[0]) { - s = getenv("EDITOR"); - if (s) ckstrncpy(editor,s,CKMAXPATH); - editor[CKMAXPATH] = NUL; - if (!editor[0]) { - printf("?Editor not defined - use SET EDITOR to define\n"); - return(-9); - } - } - ckstrncpy(tmpbuf,editfile,TMPBUFSIZ); -/* - cmiofi() lets us parse the name of an existing file, or the name of - a nonexistent file to be created. -*/ - x = cmiofi("File to edit", (char *)tmpbuf, &s, &y, xxstring); - if (x < 0) { - if (x == -9) { - if (zchko(s) < 0) { - printf("Can't create \"%s\"\n",s); - return(x); - } - } else if (x != -3) - return(x); - } - if (x == -3) - tmpbuf[0] = NUL; - else { - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - if (iswild((char *)tmpbuf)) { - printf("?A single file please\n"); - return(-9); - } - } - if ((z = cmcfm()) < 0) return(z); - if (nopush) { - printf("?Sorry, editing not allowed\n"); - return(success = 0); - } - if (tmpbuf[0]) { - /* Get full path in case we change directories between EDIT commands */ - zfnqfp(tmpbuf, CKMAXPATH, editfile); - editfile[CKMAXPATH] = NUL; -#ifdef OS2 - p = editfile; /* Flip the stupid slashes */ - while (*p) { - if (*p == '/') *p = '\\'; - p++; - } -#endif /* OS2 */ - } else - editfile[0] = NUL; - x = 0; - if (editopts[0]) { -#ifdef OS2 - x = ckindex("%1",(char *)editopts,0,0,1); - if (x > 0) - editopts[x] = 's'; - else -#endif /* OS2 */ - x = ckindex("%s",(char *)editopts,0,0,1); - } - if (((int)strlen(editopts) + (int)strlen(editfile) + 1) < TMPBUFSIZ) { - if (x) - sprintf(tmpbuf,editopts,editfile); - else - sprintf(tmpbuf,"%s %s",editopts,editfile); - } - s = line; - ckmakmsg(s,LINBUFSIZ,editor," ",tmpbuf,NULL); -#ifdef OS2 - p = s + strlen(editor); /* And again with the slashes */ - while (p != s) { - if (*p == '/') *p = '\\'; - p--; - } -#endif /* OS2 */ - conres(); - x = zshcmd(s); - concb((char)escape); - return(x); -} -#endif /* NOFRILLS */ -#endif /* NOPUSH */ - -#ifdef BROWSER -static int -dobrowse() { -#ifdef OS2 - char * p = NULL; -#endif /* OS2 */ - if (nopush) { - printf("?Sorry, browsing not allowed\n"); - return(success = 0); - } -#ifndef NT - /* Windows lets the Shell Execute the URL if no Browser is defined */ - if (!browser[0]) { - s = getenv("BROWSER"); - if (s) ckstrncpy(browser,s,CKMAXPATH); - browser[CKMAXPATH] = NUL; - if (!browser[0]) { - printf("?Browser not defined - use SET BROWSER to define\n"); - return(-9); - } - } -#endif /* NT */ - ckstrncpy(tmpbuf,browsurl,TMPBUFSIZ); - if ((x = cmtxt("URL",(char *)browsurl,&s,xxstring)) < 0) - return(x); - ckstrncpy(browsurl,s,4096); - x = 0; - if (browsopts[0]) { -#ifdef OS2 - x = ckindex("%1",(char *)browsopts,0,0,1); - if (x > 0) - browsopts[x] = 's'; - else -#endif /* OS2 */ - x = ckindex("%s",(char *)browsopts,0,0,1); - } - if (((int)strlen(browsopts) + (int)strlen(browsurl) + 1) < TMPBUFSIZ) { - if (x) - sprintf(tmpbuf,browsopts,browsurl); - else - sprintf(tmpbuf,"%s %s",browsopts,browsurl); - } -#ifdef NT - if (!browser[0]) - return(success = Win32ShellExecute(browsurl)); -#endif /* NT */ - s = line; - ckmakmsg(s,LINBUFSIZ,browser," ",tmpbuf,NULL); -#ifdef OS2 - p = line + strlen(browser); /* Flip slashes */ - while (p != line) { - if (*p == '/') *p = '\\'; - p--; - } -#endif /* OS2 */ - conres(); - x = zshcmd(s); - concb((char)escape); - return(x); -} -#endif /* BROWSER */ - -#ifdef CK_RECALL -static int -doredo() { /* Find a previous cmd and redo it */ - extern int on_recall, in_recall; - int x; - char * p; - - if ((x = cmtxt( -"pattern, or first few characters of a previous command", - "*",&s,xxstring)) < 0) - return(x); - ckstrncpy(line,s,LINBUFSIZ); - x = strlen(s); - s = line; - if (*s == '{') { /* Braces disable adding * to end */ - if (s[x-1] == '}') { - s[x-1] = NUL; - s++; - x--; - } - } else { /* No braces, add * to end. */ - s[x] = '*'; - s[x+1] = NUL; - } - - while (x > 0 && s[x] == '*' && s[x-1] == '*') s[x--] = NUL; - - if (!on_recall || !in_recall) { - printf("?Sorry, command recall can't be used now.\n"); - return(-9); - } - if ((p = cmgetcmd(s))) { /* Look for it history buffer */ - ckmakmsg(cmdbuf,CMDBL,p,"\r",NULL,NULL); /* Copy to command buffer */ - if (!quiet) /* Echo it */ - printf("%s\n",cmdbuf); - cmaddnext(); /* Force re-add to history buffer */ - return(cmflgs = -1); /* Force reparse */ - } else { - printf("?Sorry - \"%s\" not found\n", s); - return(-9); - } -} -#endif /* CK_RECALL */ - -#ifndef NOXFER -#ifndef NOCSETS -static int -doassoc() { /* ASSOCIATE */ - extern struct keytab tcstab[]; - extern int ntcs; - if ((x = cmkey(assoctab, nassoc, "", "", xxstring)) < 0 ) - return(x); - - switch (x) { /* Associate what? */ - - case ASSOC_TC: /* Transfer character-set... */ - if ((x = cmkey(tcstab, ntcs, - "transfer character-set name","",xxstring)) < 0) - return(x); - if ((y = cmkey(fcstab, nfilc, - "with file character-set","", xxstring)) < 0) - if (y != -3) - return(y); - if ((z = cmcfm()) < 0) - return(z); - axcset[x] = y; - return(success = 1); - - case ASSOC_FC: /* File character-set... */ - if ((x = cmkey(fcstab, nfilc, - "file character-set name","",xxstring)) < 0) - return(x); - if ((y = cmkey(tcstab, ntcs, - "with transfer character-set","", xxstring)) < 0) - if (y != -3) - return(y); - if ((z = cmcfm()) < 0) - return(z); - afcset[x] = y; - return(success = 1); - - default: - return(-2); - } -} -#endif /* NOCSETS */ -#endif /* NOXFER */ - -#ifndef NOHELP -static int -domanual() { -#ifdef OS2 - if ((x = cmcfm()) < 0) - return(x); - if (nopush) { - printf("?Sorry, access to system commands is disabled.\n"); - return(-9); - } - y = mxlook(mactab,"manual",nmac); - if (y > -1) { - z = maclvl; /* Save the current maclvl */ - dodo(y,NULL,cmdstk[cmdlvl].ccflgs); /* Run the macro */ - while (maclvl > z) { - debug(F101,"XXMAN loop maclvl 1","",maclvl); - sstate = (CHAR) parser(1); - debug(F101,"XXMAN loop maclvl 2","",maclvl); - if (sstate) proto(); - } - debug(F101,"XXMAN loop exit maclvl","",maclvl); - return(success); - } - return(success = 0); -#else - if ((x = cmtxt( -#ifdef UNIX - "Carriage return to confirm the command, or manual topic", -#else - "Carriage return to confirm the command, or help topic", -#endif /* UNIX */ - "kermit", - &s, - xxstring - ) - ) < 0) - return(x); -#endif /* OS2 */ - -#ifdef UNIX - ckmakmsg(tmpbuf,TMPBUFSIZ,"man ",s,NULL,NULL); -#else - ckmakmsg(tmpbuf,TMPBUFSIZ,"help ",s,NULL,NULL); -#endif /* UNIX */ - debug(F110,"MANUAL",tmpbuf,0); - if (nopush) { - printf("?Sorry, access to system commands is disabled.\n"); - return(-9); - } else { - conres(); /* Restore the console */ - success = zshcmd(tmpbuf); - concb((char)escape); /* Restore CBREAK mode */ - return(success); - } -} -#endif /* NOHELP */ - -#ifndef NOHTTP -#ifdef TCPSOCKET -static struct keytab sslswtab[] = { - { "/ssl", 1, 0 }, - { "/tls", 1, 0 } -}; - -#ifndef NOURL -struct urldata http_url = {NULL,NULL,NULL,NULL,NULL,NULL,NULL}; -#endif /* NOURL */ - -static int -dohttp() { /* HTTP */ - struct FDB sw, kw, fi; - int n, getval, allinone = 0; - char c, * p; - char rdns[128]; - - char * http_agent = NULL; /* Parse results */ - char * http_hdr = NULL; - char * http_user = NULL; - char * http_pass = NULL; - char * http_mime = NULL; - char * http_lfile = NULL; - char * http_rfile = NULL; - char * http_dfile = NULL; - char http_array = NUL; - int http_action = -1; - - char * http_host = NULL; - char * http_srv = NULL; - int http_ssl = 0; - - static char * http_d_agent = NULL; - static char * http_d_user = NULL; - static char * http_d_pass = NULL; - - static int http_d_type = 0; - int http_type = http_d_type; - -#ifdef OS2 - p = "Kermit 95"; /* Default user agent */ -#else - p = "C-Kermit"; -#endif /* OS2 */ - makestr(&http_agent,p); - makestr(&http_mime,"text/HTML"); /* MIME type default */ - rdns[0] = '\0'; - - cmfdbi(&sw, /* 1st FDB - general switches */ - _CMKEY, /* fcode */ - "OPEN, CLOSE, GET, HEAD, PUT, INDEX, or POST,\n or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nhttpswtab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - httpswtab, /* Keyword table */ - &kw /* Pointer to next FDB */ - ); - cmfdbi(&kw, /* 2nd FDB - commands */ - _CMKEY, /* fcode */ - "Command", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nhttptab, /* addtl numeric data 1: tbl size */ - 0, /* addtl numeric data 2: 0 = keyword */ - xxstring, /* Processing function */ - httptab, /* Keyword table */ - NULL /* Pointer to next FDB */ - ); - - while (1) { - x = cmfdb(&sw); /* Parse something */ - if (x < 0) /* Error */ - goto xhttp; - n = cmresult.nresult; - if (cmresult.fdbaddr == &kw) /* Command - exit this loop */ - break; - c = cmgbrk(); /* Switch... */ - getval = (c == ':' || c == '='); - x = -9; - if (getval && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - goto xhttp; - } - switch (cmresult.nresult) { /* Handle each switch */ - case HT_SW_TP: /* /TOSCREEN */ - http_type = 1; - break; - case HT_SW_AG: /* /AGENT */ - if (getval) { - if ((x = cmfld("User agent",p,&s,xxstring)) < 0) - goto xhttp; - } else { - s = p; - } - makestr(&http_agent,s); - break; - case HT_SW_HD: /* /HEADER */ - s = NULL; - if (getval) { - if ((x = cmfld("Header line","",&s,xxstring)) < 0) { - if (x == -3) - s = NULL; - else - goto xhttp; - } - } - makestr(&http_hdr,s); - break; - case HT_SW_US: /* /USER */ - s = NULL; - if (getval) { - if ((x = cmfld("User ID","",&s,xxstring)) < 0) { - if (x == -3) - s = ""; - else - goto xhttp; - } - } - makestr(&http_user,s); - break; - case HT_SW_PW: /* /PASSWORD */ - debok = 0; - s = NULL; - if (getval) { - if ((x = cmfld("Password","",&s,xxstring)) < 0) - goto xhttp; - } - makestr(&http_pass,s); - break; -#ifndef NOSPL - case HT_SW_AR: { /* /ARRAY: */ - char * s2, array = NUL; - if (!getval) { - printf("?This switch requires an argument\n"); - x = -9; - goto xhttp; - } - if ((x = cmfld("Array name (a single letter will do)", - "", - &s, - NULL - )) < 0) { - if (x == -3) { - printf("?Array name required\n"); - x = -9; - goto xhttp; - } else - goto xhttp; - } - if (!*s) { - printf("?Array name required\n"); - x = -9; - goto xhttp; - } - s2 = s; - if (*s == CMDQ) s++; - if (*s == '&') s++; - if (!isalpha(*s)) { - printf("?Bad array name - \"%s\"\n",s2); - x = -9; - goto xhttp; - } - array = *s++; - if (isupper(array)) - array = tolower(array); - if (*s && (*s != '[' || *(s+1) != ']')) { - printf("?Bad array name - \"%s\"\n",s2); - http_array = NUL; - x = -9; - goto xhttp; - } - http_array = array; - break; - } -#endif /* NOSPL */ - default: - x = -2; - goto xhttp; - } - } - http_action = n; /* Save the action */ - if (http_action == HTTP_PUT || http_action == HTTP_POS) { - cmfdbi(&sw, /* 1st FDB - switch */ - _CMKEY, /* fcode */ - "Local filename\n Or switch", /* help */ - "", /* default */ - "", /* addtl string data */ - nhttpptab, /* keyword table size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - httpptab, /* Keyword table */ - &fi /* Pointer to next FDB */ - ); - cmfdbi(&fi, /* 2nd FDB - filename */ - _CMIFI, /* fcode */ - "Local filename", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - while (1) { - x = cmfdb(&sw); - if (x < 0) - goto xhttp; /* Free any malloc'd temp strings */ - n = cmresult.nresult; - if (cmresult.fcode != _CMKEY) - break; - c = cmgbrk(); /* Switch... */ - getval = (c == ':' || c == '='); - if (getval && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - x = -9; - goto xhttp; - } - switch (n) { - case HT_PP_MT: - s = "text/HTML"; - if (getval) { - if ((x = cmfld("MIME type", - "text/HTML",&s,xxstring)) < 0) - goto xhttp; - } - makestr(&http_mime,s); - break; - default: - x = -2; - goto xhttp; - } - } - makestr(&http_lfile,cmresult.sresult); - n = ckindex("/",http_lfile,-1,1,0); - if (n) - p = &http_lfile[n]; - else - p = http_lfile; - if ((x = cmfld("URL or remote filename",p,&s,xxstring)) < 0) { - if (x == -3) { - printf("?%s what?\n",(http_action == HTTP_PUT) ? "Put" : "Post"); - x = -9; - } - goto xhttp; - } - if (!*s) s = NULL; - makestr(&http_rfile,s); - - if ((x = cmtxt("Response filename","",&s,xxstring)) < 0) { - if (x != -3) - goto xhttp; - } - if (*s) - makestr(&http_dfile,s); - } - switch (http_action) { - case HTTP_DEL: /* DELETE */ - if ((x = cmfld("URL or remote source file","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Delete what?\n"); - x = -9; - } - goto xhttp; - } - makestr(&http_rfile,s); - break; - case HTTP_CON: /* CONNECT */ - if ((x = cmfld("Remote host[:port]","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Remote host[:port] is required\n"); - x = -9; - } - goto xhttp; - } - makestr(&http_rfile,s); - break; - case HTTP_HED: { /* HEAD */ - char buf[CKMAXPATH+1]; - if ((x = cmfld("URL or remote source file","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Head of what?\n"); - x = -9; - } - goto xhttp; - } - makestr(&http_rfile,s); - - if (http_array || http_type) { /* Default result filename */ - p = ""; /* None if /ARRAY or /TOSCREEN */ - } else { - n = ckindex("/",http_rfile,-1,1,0); /* Otherwise strip path */ - if (n) /* and add ".head" */ - p = &http_rfile[n]; - else - p = http_rfile; - ckmakmsg(buf,CKMAXPATH,p,".head",NULL,NULL); - p = buf; - } - if ((x = cmofi("Local filename",p,&s,xxstring)) < 0) { - if (x != -3) - goto xhttp; - } - makestr(&http_lfile,s); - break; - } - case HTTP_GET: /* GET */ - case HTTP_IDX: { /* INDEX */ - char * lfile = ""; - if ((x = cmfld("URL or remote source file","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Get what?\n"); - x = -9; - } - goto xhttp; - } - makestr(&http_rfile,s); - if (http_action == HTTP_GET && !http_type) - zstrip(http_rfile,&lfile); - if ((x = cmofi("Local filename",lfile,&s,xxstring)) < 0) - if (x != -3) - goto xhttp; - makestr(&http_lfile,s); - break; - } - case HTTP_OPN: { - int sslswitch = 0; -#ifdef CK_SSL - struct FDB sw, fl; - cmfdbi(&sw, - _CMKEY, /* fcode */ - "IP host name or address, or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 2, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - sslswtab, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* 2nd FDB - host */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - x = cmfdb(&sw); /* Parse switch or host */ - if (x < 0) /* Error */ - goto xhttp; - if (cmresult.fcode == _CMFLD) { /* Host */ - s = cmresult.sresult; /* Set up expected pointer */ - goto havehost; /* Go parse rest of command */ - } - sslswitch = 1; /* /SSL or /TLS switch - set flag */ -#endif /* CK_SSL */ - - /* Parse host */ - - if ((x = cmfld("URL, hostname, or ip-address","",&s,xxstring)) < 0) { - if (x == -3) { - printf("?Open what?\n"); - x = -9; - } - goto xhttp; - } - - havehost: /* Come here with s -> host */ -#ifdef CK_URL - x = urlparse(s,&http_url); /* Was a URL given? */ - if (x < 1) { /* Not a URL */ -#endif /* CK_URL */ - makestr(&http_host,s); - if ((x = - cmfld("Service name or port number", - sslswitch ? "https" : "http",&s,xxstring)) < 0) - goto xhttp; - else - makestr(&http_srv,s); -#ifdef CK_URL - } else if (ckstrcmp(http_url.svc,"http",-1,0) && /* Non-HTTP URL */ - ckstrcmp(http_url.svc,"https",-1,0)) { - printf("?Non-HTTP URL\n"); - x = -9; - goto xhttp; - } else { /* Have HTTP URL */ - makestr(&http_srv, http_url.svc); - makestr(&http_user,http_url.usr); - makestr(&http_pass,http_url.psw); - makestr(&http_host,http_url.hos); - if (http_url.por) - makestr(&http_srv,http_url.por); - makestr(&http_rfile,http_url.pth); - } - if (http_rfile) { /* Open, GET, and Close */ - printf("?Directory/file path not allowed in HTTP OPEN URL\n"); - x = -9; - goto xhttp; - } - if (!ckstrcmp("https",http_srv,-1,0) || sslswitch || - !ckstrcmp("443",http_srv,-1,0)) - http_ssl = 1; -#endif /* CK_URL */ - break; - } - case HTTP_CLS: - break; - } - if ((x = cmcfm()) < 0) - goto xhttp; - - if (http_action == HTTP_OPN) { - x = (http_open(http_host,http_srv,http_ssl,rdns,128,http_agent) == 0); - if (x) { - if (!quiet) { - if (rdns[0]) - printf("Connected to %s [%s]\r\n",http_host,rdns); - else - printf("Connected to %s\r\n",http_host); - } - if (http_agent) { - if (http_d_agent) - free(http_d_agent); - http_d_agent = http_agent; - http_agent = NULL; - } - if (http_user) { - if (http_d_user) - free(http_d_user); - http_d_user = http_user; - http_user = NULL; - } - if (http_pass) { - if (http_d_pass) { - memset(http_d_pass,0,strlen(http_d_pass)); - free(http_d_pass); - } - http_d_pass = http_pass; - http_pass = NULL; - } - http_d_type = http_type; - } else { - if (!quiet) - printf("?HTTP Connection failed.\r\n"); - } - } else if (http_action == HTTP_CLS) { - if (http_d_agent) { - free(http_d_agent); - http_d_agent = NULL; - } - if (http_d_user) { - free(http_d_user); - http_d_user = NULL; - } - if (http_d_pass) { - memset(http_d_pass,0,strlen(http_d_pass)); - free(http_d_pass); - http_d_pass = NULL; - } - http_d_type = 0; - x = (http_close() == 0); - } - if ((http_action != HTTP_CLS) && - (http_action != HTTP_CON) && http_rfile) { /* Remote file is URL? */ - - /* All-in-one actions when a URL is given... */ - -#ifdef CK_URL - if (urlparse(http_rfile,&http_url) > 0) { /* Have URL? */ - if (ckstrcmp(http_url.svc,"http",-1,0) && /* It's an HTTP URL? */ - ckstrcmp(http_url.svc,"https",-1,0)) { - printf("?Non-HTTP URL\n"); - x = -9; - goto xhttp; - } else { /* Yes, collect the pieces */ - makestr(&http_srv, http_url.svc); - makestr(&http_user,http_url.usr); - makestr(&http_pass,http_url.psw); - makestr(&http_host,http_url.hos); - if (http_url.por) - makestr(&http_srv,http_url.por); - makestr(&http_rfile,http_url.pth); - } - if (!http_rfile) { /* Still have a path? */ - makestr(&http_rfile,"/"); - } - if (!ckstrcmp("https",http_srv,-1,0) || /* Check for SSL/TLS */ - !ckstrcmp("443",http_srv,-1,0)) - http_ssl = 1; - if (http_isconnected()) /* Close any open HTTP connection */ - http_close(); - if (http_pass == NULL && http_d_pass != NULL) - makestr(&http_pass,http_d_pass); - x = (http_open(http_host, - http_srv,http_ssl,rdns,128,http_d_agent) == 0); - if (x < 0) { - x = 0; - goto xhttp; - } - allinone = 1; - } -#endif /* CK_URL */ - if (http_pass == NULL && http_d_pass != NULL) - makestr(&http_pass,http_d_pass); - - if (http_action == HTTP_OPN && allinone) { - http_action = HTTP_GET; - } - x = xdohttp(http_action, - http_lfile, - http_rfile, - http_dfile, - http_agent ? http_agent : http_d_agent, - http_hdr, - http_user ? http_user : http_d_user, - http_pass ? http_pass : http_d_pass, - http_mime, - http_array, - http_type - ); - if (allinone) - x = (http_close() == 0); - } - - xhttp: - if (http_agent) free(http_agent); - if (http_hdr) free(http_hdr); - if (http_user) free(http_user); - if (http_pass) { - memset(http_pass,0,strlen(http_pass)); - free(http_pass); - } - if (http_mime) free(http_mime); - if (http_lfile) free(http_lfile); - if (http_rfile) free(http_rfile); - if (http_dfile) free(http_dfile); - if (http_host) free(http_host); - if (http_srv) free(http_srv); - - if (x > -1) - success = x; - return(x); -} -#endif /* TCPSOCKET */ -#endif /* NOHTTP */ - - -#ifndef NOSPL -static int -dotrace() { - int on = 1; - struct FDB sw, kw; - cmfdbi(&sw, /* 1st FDB - switch */ - _CMKEY, /* fcode */ - "Trace object;\n Or switch", /* help */ - "", /* default */ - "", /* addtl string data */ - 2, /* keyword table size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - onoffsw, /* Keyword table */ - &kw /* Pointer to next FDB */ - ); - cmfdbi(&kw, /* 2nd FDB - Trace object */ - _CMKEY, /* fcode */ - "Trace object", /* help */ - "all", /* default */ - "", /* addtl string data */ - ntracetab, /* keyword table size */ - 0, /* addtl numeric data 2: 0 = keyword */ - xxstring, /* Processing function */ - tracetab, /* Keyword table */ - NULL /* Pointer to next FDB */ - ); - if ((x = cmfdb(&sw)) < 0) - return(x); - if (cmresult.fdbaddr == &sw) { - on = cmresult.nresult; - if ((x = cmkey(tracetab, ntracetab,"","all",xxstring)) < 0) - return(x); - } else { - x = cmresult.nresult; - } - if ((y = cmcfm()) < 0) - return(y); - - switch (x) { - case TRA_ASG: - tra_asg = on; - break; - case TRA_CMD: - tra_cmd = on; - break; - case TRA_ALL: - tra_asg = on; - tra_cmd = on; - break; - default: - return(-2); - } - printf("TRACE %s\n", on ? "ON" : "OFF"); - return(success = 1); -} -#endif /* NOSPL */ - - -static int -doprompt() { - extern int xcmdsrc; - if ((x = cmtxt("Optional message","",&s,xxstring)) < 0) - return(x); -#ifdef NOSPL - printf("?Sorry, PROMPT requires script programming language\n"); - return(-9); -#else - debug(F101,"Prompt cmdlvl","",cmdlvl); - cmdlvl++; - if (cmdlvl > CMDSTKL) { - printf("?Command stack overflow: %d\n",cmdlvl); - cmdlvl--; - return(-9); - } - xcmdsrc = CMD_KB; - cmdstk[cmdlvl].src = CMD_KB; /* Say we're at the prompt */ - cmdstk[cmdlvl].lvl = 0; - cmdstk[cmdlvl].ccflgs = cmdstk[cmdlvl-1].ccflgs; - if (tra_cmd) - printf("[%d] +P: \"(prompt)\"\n",cmdlvl); - concb((char)escape); - if (!quiet) - printf( -"(Recursive command prompt: Resume script with CONTINUE, STOP to stop...)\n" - ); - if (*s) { /* If prompt given */ - makestr(&(prstring[cmdlvl-1]),cmgetp()); /* Save current prompt */ - cmsetp(s); /* Set new one */ - } - return(success = 1); -#endif /* NOSPL */ -} - -#ifdef CKLEARN -VOID -learncmd(s) char *s; { /* Record commands in learned script */ - char buf[64]; - int i, k; - if (learnfp && learning) { /* Only if open and on */ - k = ckstrncpy(buf,s,64); - for (i = 0; i < k; i++) { /* Get top-level command keyword */ - if (buf[i] <= SP) { - buf[i] = NUL; - break; - } - } - k = lookup(cmdtab,buf,ncmd,NULL); /* Look it up */ - if (k == XXCON || k == XXLEARN) /* Don't record CONNECT or LEARN */ - return; - if (k == XXTEL) { - fputs("SET HOST /NETWORK:TCP",learnfp); - fputs(&s[i],learnfp); - fputs(" TELNET /TELNET",learnfp); - fputs("\nIF FAIL STOP 1 Connection failed\n",learnfp); - } else { - fputs(s,learnfp); - fputs("\n",learnfp); - } - } -} -#endif /* CKLEARN */ - - -/* D O C M D -- Do a command */ - -/* - Returns: - -2: user typed an illegal command - -1: reparse needed - 0: parse was successful (even tho command may have failed). -*/ -#ifdef DEBUG -int cmdstats[256] = { -1, -1 }; -#endif /* DEBUG */ - -int -docmd(cx) int cx; { - extern int nolocal, cmkwflgs; - - debug(F101,"docmd entry, cx","",cx); - activecmd = cx; - doconx = ((activecmd == XXCON) || (activecmd == XXTEL) || - (activecmd == XXRLOG) || (activecmd == XXPIPE) || - (activecmd == XXIKSD) || (activecmd == XXPTY)); -/* - Originally all commands were handled with a big switch() statement, - but eventually this started blowing up compilers. Now we have a series - of separate if statements and small switches, with the commands that are - most commonly executed in scipts and loops coming first, to speed up - compute-bound scripts. - */ - -#ifdef DEBUG - if (cmdstats[0] == -1) { /* Count commands */ - int i; /* for tuning... */ - for (i = 0; i < 256; i++) - cmdstats[i] = 0; - } -#endif /* DEBUG */ - - switch (cx) { - case -4: /* EOF */ -#ifdef OSK - if (msgflg) printf("\n"); -#else - if (msgflg) printf("\r\n"); -#endif /* OSK */ - doexit(GOOD_EXIT,xitsta); - case -3: /* Null command */ - return(0); - case -9: /* Like -2, but errmsg already done */ - case -1: /* Reparse needed */ - return(cx); - case -6: /* Special */ - case -2: /* Error, maybe */ - -#ifndef NOSPL -/* - Maybe they typed a macro name. Let's look it up and see. -*/ - if (cx == -6) /* If they typed CR */ - ckstrncat(cmdbuf,"\015",CMDBL); /* add it back to command buffer. */ - if (ifcmd[cmdlvl] == 2) /* Watch out for IF commands. */ - ifcmd[cmdlvl]--; - repars = 1; /* Force reparse */ - cmres(); - cx = XXDO; /* Try DO command */ -#else - return(cx); -#endif /* NOSPL */ - default: - if (cx < 0) - return(cx); - break; - } -#ifdef DEBUG - if (cx < 256) - cmdstats[cx]++; -#endif /* DEBUG */ - - if ((cmkwflgs & CM_PSH) -#ifndef NOPUSH - && nopush -#endif /* NOPUSH */ - ) { - printf("?Access to system disabled\n"); - return(-9); - } - if ((cmkwflgs & CM_LOC) -#ifndef NOLOCAL - && nolocal -#endif /* NOLOCAL */ - ) { - printf("?Connections disabled\n"); - return(-9); - } - -#ifndef NOSPL - /* Used in FOR loops */ - - if (cx == XX_INCR || cx == XXINC || /* _INCREMENT, INCREMENT */ - cx == XX_DECR || cx == XXDEC) /* _DECREMENT, DECREMENT */ - return(doincr(cx)); - - /* Define (or change the definition of) a macro or variable */ - - if (cx == XXUNDEF || cx == XXUNDFX) { -#ifdef IKSD - if (inserver && !ENABLED(en_asg)) { - printf("?Sorry, DEFINE/ASSIGN disabled\n"); - return(-9); - } -#endif /* IKSD */ - return(doundef(cx)); /* [_]UNDEFINE */ - } - if (cx == XXDEF || cx == XXASS || - cx == XXDFX || cx == XXASX) { -#ifdef IKSD - if (inserver && !ENABLED(en_asg)) { - printf("?Sorry, DEFINE/ASSIGN disabled\n"); - return(-9); - } -#endif /* IKSD */ - if (atmbuf[0] == '.' && !atmbuf[1]) /* "." entered as keyword */ - xxdot = 1; /* i.e. with space after it... */ - return(dodef(cx)); /* DEFINE, ASSIGN, etc... */ - } - - /* IF, WHILE, and friends */ - - if (cx == XXIF || cx == XXIFX || cx == XXWHI || cx == XXASSER) { - return(doif(cx)); - } - if (cx == XXSWIT) { /* SWITCH */ - return(doswitch()); - } - - /* GOTO, FORWARD, and _FORWARD (used internally by FOR, WHILE, etc) */ - - if (cx == XXGOTO || cx == XXFWD || cx == XXXFWD) { /* GOTO or FORWARD */ - /* Note, here we don't set SUCCESS/FAILURE flag */ -#ifdef COMMENT - if ((y = cmfld("label","",&s,xxstring)) < 0) { - if (y == -3) { - if (cx != XXXFWD) { - printf("?Label name required\n"); - return(-9); - } - } else - return(y); - } - ckstrncpy(lblbuf,s,LBLSIZ); - if ((x = cmcfm()) < 0) return(x); -#else - if ((y = cmtxt("label","",&s,xxstring)) < 0) { - if (y == -3) { - if (cx != XXXFWD) { - printf("?GOTO: Label name required: \"%s\" \"%s\"\n", - atmbuf, - cmdbuf); - return(-9); - } - } else - return(y); - } - ckstrncpy(lblbuf,brstrip(s),LBLSIZ); -#endif /* COMMENT */ - s = lblbuf; - debug(F111,"GOTO target",s,cx); - return(dogoto(s,cx)); - } - if (cx == XXDO || cx == XXMACRO) { /* DO (a macro) */ - char mnamebuf[16]; /* (buffer for controlled temp name) */ - struct FDB kw, fl; - int mx; /* Macro index (on stack!) */ - - debug(F101,"XXMACRO 0",line,cx); - if (cx == XXDO) { - if (nmac == 0) { - printf("\n?No macros defined\n"); - return(-9); - } - for (y = 0; y < nmac; y++) { /* copy the macro table into a */ - mackey[y].kwd = mactab[y].kwd; /* regular keyword table */ - mackey[y].kwval = y; /* with value = pointer to macro tbl */ - mackey[y].flgs = mactab[y].flgs; - } - cmfdbi(&kw, /* First FDB - macro name */ - _CMKEY, /* fcode */ - "Macro", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nmac, /* addtl numeric data 1: tbl size */ - 0, /* addtl numeric data 2: 0 = cmkey */ - xxstring, /* Processing function */ - mackey, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* 2nd FDB - for "{" */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - x = cmfdb(&kw); /* Parse something */ - if (x < 0) { /* Error */ - if (x == -3) { - printf("?Macro name required\n"); - return(-9); - } else - return(x); - } - if (cmresult.fcode == _CMKEY) { - extern int mtchanged; - char * macroname = NULL; - - /* In case args include an \fexec() that changes the macro table */ - - mx = x; /* Save macro index on stack */ - mtchanged = 0; /* Mark state of macro table */ - makestr(¯oname,mactab[mx].kwd); /* Save name */ - - if ((y = cmtxt("optional arguments","",&s,xxstring)) < 0) - return(y); /* Get macro args */ - - if (mtchanged) { /* Macro table changed? */ - mx = mlook(mactab,macroname,nmac); /* Look up name again */ - } - if (macroname) - free(macroname); - - return(dodo(mx,s,cmdstk[cmdlvl].ccflgs) < 1 ? - (success = 0) : 1); - } - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* _CMFLD */ - if (atmbuf[0] == '{') { - if ((y = cmcfm()) < 0) - return(y); - } - } else { /* XXMACRO ("immediate macro") */ - int k = 0; - line[k++] = '{'; - line[k++] = SP; - line[k] = NUL; - debug(F111,"XXMACRO A",line,k); - /* Defer evaluation of variables until the commands are exec'd */ - if ((y = cmtxt("Braced list of commands","",&s,NULL)) < 0) - return(y); - k = ckstrncpy(line+k,s,LINBUFSIZ-k); - debug(F111,"XXMACRO B",line,k); - } - x = strlen(line); - if ((line[0] == '{' && line[x-1] != '}') || line[0] == '}') - return(-2); - if (line[0] != '{' && line[x-1] != '}') { - /* Unknown command. If ON_UNKNOWN_COMMAND macro is defined, */ - /* parse args and then execute it, but only if it is not */ - /* already active. */ - int k = -1; - if (!unkmacro) { - k = mxlook(mactab,"on_unknown_command",nmac); - } - if (k > -1) { - ckstrncpy(tmpbuf,atmbuf,TMPBUFSIZ); - z = maclvl; /* Save the current maclvl */ - if ((y = cmtxt("text","",&s,xxstring)) < 0) - return(y); - ckstrncat(tmpbuf," ",TMPBUFSIZ); - ckstrncat(tmpbuf,s,TMPBUFSIZ); - unkmacro = 1; - debug(F110,"ON_UNKNOWN_COMMAND",s,0); - dodo(k,tmpbuf,cmdstk[cmdlvl].ccflgs); /* Run the macro */ - while (maclvl > z) { - sstate = (CHAR) parser(1); - if (sstate) proto(); - } - debug(F101,"UNKMAC loop exit maclvl","",maclvl); - unkmacro = 0; - return(success); - } - if (x > 0) - printf("?Not a command or macro name: \"%s\"\n",line); - else - printf("?Not a command or macro name.\n"); - return(-9); - } - s = brstrip(line); - sprintf(mnamebuf," ..tmp:%03d",cmdlvl); /* safe (16) */ - x = addmac(mnamebuf,s); - return(dodo(x,NULL,cmdstk[cmdlvl].ccflgs) < 1 ? (success = 0) : 1); - } - - if (cx == XXLBL) { /* LABEL */ - if ((x = cmfld("label","",&s,xxstring)) < 0) { - if (x == -3) { -#ifdef COMMENT - printf("?LABEL: Label name required: \"%s\"\n", cmdbuf); - return(-9); -#else - s = ""; -#endif /* COMMENT */ - } else return(x); - - } - debug(F111,"LABEL",s,x); - if ((x = cmcfm()) < 0) return(x); - return(0); - } - - if (cx == XXEVAL || cx == XX_EVAL) /* _EVALUATE, EVALUATE */ - return(doeval(cx)); - -#ifndef NOSEXP - if (cx == XXSEXP) { /* Lisp-like S-Expression */ - struct stringarray * q; - char /* *p, *r, */ *tmp, *m; - int i, k, n, quote = 0, contd = 0, size = 0, len = 0; - extern int sexprc, sexppv; - - tmp = tmpbuf; /* Buffer to collect SEXP */ - tmpbuf[0] = NUL; /* Clear it */ - size = TMPBUFSIZ; /* Capacity of buffer */ - sexprc = -1; /* Assume bad input */ - n = 0; /* Paren balance counter */ - - while (1) { /* Allow SEXP on multiple lines */ - m = contd ? - "Continuation of S-Expression" : - "S-Expression (\"help sexp\" for details)"; - x = cmtxt(m,"",&s,xxstring); - if (x < 0) - return(x); - if (!*s) /* Needed for (=) and (:) */ - s = atmbuf; - k = ckmakmsg(tmp, size, contd ? " " : "(", s, NULL, NULL); - if (k < 1) { - printf("?SEXP too long - %d max\n",TMPBUFSIZ); - return(-9); - } - debug(F111,contd ? "sexp contd" : "sexp",s,k); - - for (i = len; i < len+k; i++) { /* Check balance */ - if (!quote && tmpbuf[i] == CMDQ) { - quote = 1; - continue; - } - if (quote) { - quote = 0; - continue; - } - if (tmpbuf[i] == '(') - n++; - else if (tmpbuf[i] == ')') - n--; - } - if (n == 0) { /* Break when balanced */ - break; - } - if (n < 0) { /* Too many right parens */ - printf("?Unbalanced S-Expression: \"%s\"\n",tmpbuf); - return(-9); - } - contd++; /* Need more right parens */ - cmini(ckxech); /* so keep parsing */ - tmp += k; /* adjust buffer pointer */ - size -= k; /* and capacity */ - len += k; /* and length so far */ - } - s = tmpbuf; - makestr(&lastsexp,s); - q = cksplit(1,SEXPMAX,s,NULL,NULL,8,0,0); /* Precheck for > 1 SEXP */ - debug(F101,"sexp split","",q->a_size); - - if (q->a_size == 1) { /* We should get exactly one back */ - char * result, * dosexp(); - sexprc = 0; /* Reset out-of-band return code */ - result = dosexp(s); /* Get result */ - debug(F111,"sexp result",result,sexprc); - if (sexprc == 0) { /* Success */ - /* Echo the result if desired */ - if ((!xcmdsrc && sexpecho != SET_OFF) || sexpecho == SET_ON) - printf(" %s\n",result ? result : ""); - makestr(&sexpval,result); - success = sexppv > -1 ? sexppv : 1; - return(success); - } - } - if (sexprc < 0) - printf("?Invalid S-Expression: \"%s\"\n",lastsexp); - return(-9); - } -#endif /* NOSEXP */ - -#endif /* NOSPL */ - - if (cx == XXECH || cx == XXXECH || cx == XXVOID -#ifndef NOSPL - || cx == XXAPC -#endif /* NOSPL */ - ) { /* ECHO or APC */ - if ((x = cmtxt((cx == XXECH || cx == XXXECH) ? - "Text to be echoed" : - ((cx == XXVOID) ? "Text" : - "Application Program Command text"), - "", - &s, - xxstring - ) - ) < 0) - return(x); - if (!s) s = ""; -#ifdef COMMENT -/* This is to preserver the pre-8.0 behavior but it's too confusing */ - x = strlen(s); - x = (x > 1) ? ((s[0] == '"' && s[x-1] == '"') ? 1 : 0) : 0; -#endif /* COMMENT */ - s = brstrip(s); /* Strip braces and doublequotes */ - if (cx == XXECH) { /* ECHO */ -#ifndef NOSPL - if (!fndiags || fnsuccess) { -#endif /* NOSPL */ -#ifdef COMMENT - /* The "if (x)" business preserves previous behavior */ - /* by putting back the doublequotes if they were included. */ - if (x) - printf("\"%s\"\n",s); - else -#endif /* COMMENT */ - printf("%s\n",s); -#ifndef NOSPL - } -#endif /* NOSPL */ - } else if (cx == XXXECH) { /* XECHO */ - if (x) - printf("\"%s\"",s); - else - printf("%s",s); -#ifdef UNIX - fflush(stdout); -#endif /* UNIX */ - } else if (cx == XXAPC) { /* APC */ -#ifdef CK_APC - if (apcactive == APC_LOCAL || - (apcactive == APC_REMOTE && !(apcstatus & APC_UNCH))) - return(success = 0); -#endif /* CK_APC */ - if (!local) { - printf("%c_%s%c\\",ESC,s,ESC); -#ifdef UNIX - fflush(stdout); -#endif /* UNIX */ - - } else { /* Local mode - have connection */ -#ifndef NOSPL - if (ckmakxmsg(tmpbuf, /* Form APC string in buffer */ - TMPBUFSIZ, - ckctoa((char)ESC), - ckctoa('_'), - s, - ckctoa((char)ESC), - ckctoa('\\'), - NULL,NULL,NULL,NULL,NULL,NULL,NULL - ) > 0) - return(success = dooutput(tmpbuf, XXOUT)); - printf("?Too long\n"); - return(-9); -#else - printf("%c_%s%c\\",ESC,s,ESC); -#endif /* NOSPL */ - } - } - return(success = 1); - } - -#ifndef NOSPL -/* Copy macro args from/to two levels up, used internally by _floop et al. */ - if (cx == XXGTA || cx == XXPTA) { /* _GETARGS, _PUTARGS */ - int x; - debug(F101,"docmd XXGTA","",XXGTA); - debug(F101,"docmd cx","",cx); - debug(F101,"docmd XXGTA maclvl","",maclvl); - x = dogta(cx); - debug(F101,"docmd dogta returns","",x); - debug(F101,"docmd dogta maclvl","",maclvl); - return(x); - } -#endif /* NOSPL */ - -#ifndef NOSPL -#ifdef CKCHANNELIO - if (cx == XXFILE) - return(dofile(cx)); - else if (cx == XXF_RE || cx == XXF_WR || cx == XXF_OP || - cx == XXF_CL || cx == XXF_SE || cx == XXF_RW || - cx == XXF_FL || cx == XXF_LI || cx == XXF_ST || cx == XXF_CO) - return(dofile(cx)); -#endif /* CKCHANNELIO */ - -/* ASK, ASKQ, READ */ - if (cx == XXASK || cx == XXASKQ || cx == XXREA || - cx == XXRDBL || cx == XXGETC || cx == XXGETK) { - return(doask(cx)); - } -#endif /* NOSPL */ - -#ifndef NOFRILLS - if (cx == XXBUG) { /* BUG */ - if ((x = cmcfm()) < 0) return(x); - return(dobug()); - } -#endif /* NOFRILLS */ - -#ifndef NOXFER - if (cx == XXBYE) { /* BYE */ - extern int ftp_cmdlin; - if ((x = cmcfm()) < 0) return(x); - -#ifdef NEWFTP - if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) { - extern int stayflg, ftp_fai; - success = ftpbye(); - if (ftp_cmdlin && !stayflg && !local) - doexit(ftp_fai ? BAD_EXIT : GOOD_EXIT,-1); - else - return(success); - } -#endif /* NEWFTP */ - - if (!local) { - printf("?No connection - use EXIT to quit.\n"); - return(-9); - } - -#ifdef CK_XYZ - if (protocol != PROTO_K) { - printf("?Sorry, BYE only works with Kermit protocol\n"); - return(-9); - } -#endif /* CK_XYZ */ - -#ifdef IKS_OPTION - if ( -#ifdef CK_XYZ - protocol == PROTO_K && -#endif /* CK_XYZ */ - !iks_wait(KERMIT_REQ_START,1)) { - printf( - "?A Kermit Server is not available to process this command\n"); - return(-9); /* Correct the return code */ - } -#endif /* IKS_OPTION */ - - bye_active = 1; - sstate = setgen('L',"","",""); - if (local) ttflui(); /* If local, flush tty input buffer */ - return(0); - } -#endif /* NOXFER */ - - if (cx == XXBEEP) { /* BEEP */ - int x; -#ifdef OS2 - int y; - if ((y = cmkey(beeptab, nbeeptab, "which kind of beep", "information", - xxstring)) < 0 ) - return (y); - if ((x = cmcfm()) < 0) return(x); - bleep((short)y); /* y is one of the BP_ values */ -#else /* OS2 */ - if ((x = cmcfm()) < 0) return(x); -#ifndef NOSPL - bleep(BP_NOTE); -#else - putchar('\07'); -#endif /* NOSPL */ -#endif /* OS2 */ - return(0); - } - -#ifndef NOFRILLS - if (cx == XXCLE) /* CLEAR */ - return(success = doclear()); -#endif /* NOFRILLS */ - - if (cx == XXCOM) { /* COMMENT */ - if ((x = cmtxt("Text of comment line","",&s,NULL)) < 0) - return(x); - /* Don't change SUCCESS flag for this one */ - return(0); - } - -#ifndef NOLOCAL - if (cx == XXCON || cx == XXCQ) /* CONNECT or CONNECT /QUIETLY */ - return(doxconn(cx)); -#endif /* NOLOCAL */ - -#ifndef NOFRILLS -#ifdef ZCOPY - if (cx == XXCPY) { /* COPY a file */ -#ifdef IKSD - if (inserver && !ENABLED(en_cpy)) { - printf("?Sorry, COPY is disabled\n"); - return(-9); - } -#endif /* IKSD */ -#ifdef CK_APC - if (apcactive == APC_LOCAL || - (apcactive == APC_REMOTE && !(apcstatus & APC_UNCH)) - ) - return(success = 0); -#endif /* CK_APC */ - return(docopy()); - } -#endif /* ZCOPY */ -#ifdef NT - if ( cx == XXLINK ) { -#ifdef IKSD - if (inserver && !ENABLED(en_cpy)) { - printf("?Sorry, LINK (COPY) is disabled\n"); - return(-9); - } -#endif /* IKSD */ -#ifdef CK_APC - if (apcactive == APC_LOCAL || - (apcactive == APC_REMOTE && !(apcstatus & APC_UNCH)) - ) - return(success = 0); -#endif /* CK_APC */ - return(dolink()); - } -#endif /* NT */ -#endif /* NOFRILLS */ - - /* CD and friends */ - if (cx == XXCWD || cx == XXCDUP || cx == XXBACK || - cx == XXLCWD || cx == XXLCDU || cx == XXKCD) { -#ifdef LOCUS - if (!locus) { - if (cx == XXCWD) { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZCWD)); -#endif /* NOXFER */ - } else if (cx == XXCDUP) { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZCDU)); -#endif /* NOXFER */ - } - } -#endif /* LOCUS */ -#ifdef IKSD - if (inserver && !ENABLED(en_cwd)) { - printf("?Sorry, changing directories is disabled\n"); - return(-9); - } -#endif /* IKSD */ - return(success = docd(cx)); - } - - if (cx == XXCHK) /* CHECK */ - return(success = dochk()); - - if (cx == XXCLO) { /* CLOSE */ - x = cmkey(clstab,ncls,"\"CONNECTION\", or log or file to close", - "connection",xxstring); - if (x == -3) { - printf("?You must say which file or log\n"); - return(-9); - } - if (x < 0) return(x); - if ((y = cmcfm()) < 0) return(y); -#ifndef NOLOCAL - if (x == 9999) { /* CLOSE CONNECTION */ - x = clsconnx(0); - switch (x) { - case 0: - if (msgflg) printf("?Connection was not open\n"); - case -1: - return(0); - case 1: - whyclosed = WC_CLOS; - return(1); - } - return(0); - } -#endif /* NOLOCAL */ - y = doclslog(x); - success = (y == 1); - return(success); - } - -#ifndef NOSPL - if (cx == XXDCL || cx == XXUNDCL) { /* DECLARE an array */ - return(dodcl(cx)); - } -#endif /* NOSPL */ - -#ifndef NODIAL - if (cx == XXRED || cx == XXDIAL || cx == XXPDIA || - cx == XXANSW || cx == XXLOOK) { /* DIAL, REDIAL etc */ -#ifdef VMS - extern int batch; -#else -#ifdef UNIXOROSK - extern int backgrd; -#endif /* UNIXOROSK */ -#endif /* VMS */ - x = dodial(cx); - debug(F101,"dodial returns","",x); - if ((cx == XXDIAL || cx == XXRED || cx == XXANSW) && - (x > 0) && /* If DIAL or REDIAL succeeded */ - (dialsta != DIA_PART) && /* and it wasn't partial */ - (dialcon > 0)) { - if ((dialcon == 1 || /* And DIAL CONNECT is ON, */ - ((dialcon == 2) && /* or DIAL CONNECT is AUTO */ - !xcmdsrc /* and we're at top level... */ -#ifdef VMS - && !batch /* Not if running from batch */ -#else -#ifdef UNIXOROSK - && !backgrd /* Not if running in background */ -#endif /* UNIXOROSK */ -#endif /* VMS */ - ))) /* Or AUTO */ - x = doconect(dialcq, /* Then also CONNECT */ - cmdlvl == 0 ? 1 : 0 - ); - if (ttchk() < 0) - dologend(); - } - return(success = x); - } -#endif /* NODIAL */ - -#ifndef NOPUSH -#ifdef CK_REXX - if (cx == XXREXX) { /* REXX */ - extern int nopush; - if ( nopush ) - return(success=0); - return(dorexx()); - } -#endif /* CK_REXX */ -#endif /* NOPUSH */ - -#ifndef NOFRILLS - if (cx == XXDEL || cx == XXLDEL) { /* DELETE */ -#ifdef LOCUS - if (!locus && cx != XXLDEL) { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZDEL)); -#endif /* NOXFER */ - } -#endif /* LOCUS */ -#ifdef IKSD - if (inserver && (!ENABLED(en_del) -#ifdef CK_LOGIN - || isguest -#endif /* CK_LOGIN */ - )) { - printf("?Sorry, DELETE is disabled\n"); - return(-9); - } -#endif /* IKSD */ -#ifdef CK_APC - if ((apcactive == APC_LOCAL) || - ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH)))) - return(success = 0); -#endif /* CK_APC */ - return(dodel()); - } -#endif /* NOFRILLS */ - - if (cx == XXDIR || cx == XXLS || cx == XXLDIR) { /* DIRECTORY or LS */ -#ifdef LOCUS - if (!locus && cx != XXLDIR) { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZDIR)); -#endif /* NOXFER */ - } -#endif /* LOCUS */ -#ifdef IKSD - if (inserver && !ENABLED(en_dir)) { - printf("?Sorry, DIRECTORY is disabled\n"); - return(-9); - } -#endif /* IKSD */ - return(dodir(cx)); - } - -#ifndef NOSPL - if (cx == XXELS) /* ELSE */ - return(doelse()); -#endif /* NOSPL */ - -#ifndef NOSERVER -#ifndef NOFRILLS - if (cx == XXENA || cx == XXDIS) { /* ENABLE, DISABLE */ - s = (cx == XXENA) ? - "Server function to enable" : - "Server function to disable"; - - if ((x = cmkey(enatab,nena,s,"",xxstring)) < 0) { - if (x == -3) { - printf("?Name of server function required\n"); - return(-9); - } else return(x); - } - if ((y = cmkey(kmstab,3,"mode","both",xxstring)) < 0) { - if (y == -3) { - printf("?Please specify remote, local, or both\n"); - return(-9); - } else return(y); - } - if (cx == XXDIS) /* Disabling, not enabling */ - y = 3 - y; - if ((z = cmcfm()) < 0) return(z); -#ifdef CK_APC - if ((apcactive == APC_LOCAL) || - ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH)))) - return(success = 0); -#endif /* CK_APC */ -#ifdef IKSD - /* This may seem like it duplicates the work in doenable() */ - /* but this code returns failure whereas doenable() returns */ - /* success. */ - if (inserver && -#ifdef IKSDCONF - iksdcf && -#endif /* IKSDCONF */ - (x == EN_HOS || x == EN_PRI || x == EN_MAI || x == EN_WHO || - isguest)) - return(success = 0); -#endif /* IKSD */ - return(doenable(y,x)); - } -#endif /* NOFRILLS */ -#endif /* NOSERVER */ - -#ifndef NOSPL - if (cx == XXRET) { /* RETURN */ - if ((x = cmtxt("Optional return value","",&s,NULL)) < 0) - return(x); - s = brstrip(s); /* Strip braces */ - if (cmdlvl == 0) /* At top level, nothing happens... */ - return(success = 1); - switch (cmdstk[cmdlvl].src) { /* Action depends on command source */ - case CMD_TF: /* Command file */ - popclvl(); /* Pop command level */ - return(success = 1); /* always succeeds */ - case CMD_MD: /* Macro */ - case CMD_KB: /* Prompt */ - return(doreturn(s)); /* Trailing text is return value. */ - default: /* Shouldn't happen */ - return(-2); - } - } -#endif /* NOSPL */ - -#ifndef NOSPL - if (cx == XXOPE) /* OPEN */ - return(doopen()); -#endif /* NOSPL */ - -#ifndef NOSPL - if (cx == XXOUT || cx == XXLNOUT) { /* OUTPUT or LINEOUT */ - if ((x = cmtxt("Text to be output","",&s,NULL)) < 0) - return(x); -#ifdef CK_APC - if ((apcactive == APC_LOCAL) || - ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH)))) - return(success = 0); -#endif /* CK_APC */ - debug(F110,"OUTPUT 1",s,0); - s = brstrip(s); /* Strip enclosing braces, */ - debug(F110,"OUTPUT 2",s,0); -/* - I don't think I could ever fully explain this in a million years... - We have read the user's string without calling the variable-expander - function. Now, before we call it, we have to double backslashes that - appear before \N, \B, \L, and \ itself, so the expander function will - reduce them back to single backslashes, so when we call dooutput()... - But it's more complicated than that. -*/ - if (cmdgquo()) { /* Only if COMMAND QUOTING ON ... */ - for (x = 0, y = 0; s[x]; x++, y++) { - if (s[x] == CMDQ) { - char c = s[x+1]; - if (c == 'n' || c == 'N' || - c == 'b' || c == 'B' || - c == 'l' || c == 'L' || - c == CMDQ) - line[y++] = CMDQ; - } - line[y] = s[x]; - } - line[y++] = '\0'; /* Now expand variables, etc. */ - debug(F110,"OUTPUT 3",line,0); - s = line+y+1; - x = LINBUFSIZ - (int) strlen(line) - 1; - debug(F101,"OUTPUT size","",x); - if (zzstring(line,&s,&x) < 0) - return(success = 0); - s = line+y+1; - debug(F110,"OUTPUT 4",s,0); - } - success = dooutput(s,cx); - return(success); - } -#endif /* NOSPL */ - -#ifdef ANYX25 -#ifndef IBMX25 - if (cx == XXPAD) { /* PAD commands */ - x = cmkey(padtab,npadc,"PAD command","",xxstring); - if (x == -3) { - printf("?You must specify a PAD command to execute\n"); - return(-9); - } - if (x < 0) return(x); - - switch (x) { - case XYPADL: - if (x25stat() < 0) - printf("Sorry, you must 'set network' & 'set host' first\r\n"); - else { - x25clear(); - initpad(); - } - break; - case XYPADS: - if (x25stat() < 0) - printf("Not connected\r\n"); - else { - extern int linkid, lcn; - conol("Connected thru "); - conol(ttname); - printf(", Link id %d, Logical channel number %d\r\n", - linkid,lcn); - } - break; - case XYPADR: - if (x25stat() < 0) - printf("Sorry, you must 'set network' & 'set host' first\r\n"); - else - x25reset(0,0); - break; - case XYPADI: - if (x25stat() < 0) - printf("Sorry, you must 'set network' & 'set host' first\r\n"); - else - x25intr(0); - } - return(0); - } -#endif /* IBMX25 */ -#endif /* ANYX25 */ - -#ifndef NOSPL - if (cx == XXPAU || cx == XXWAI || cx == XXMSL) /* PAUSE, WAIT, etc */ - return(dopaus(cx)); -#endif /* NOSPL */ - -#ifndef NOFRILLS - if (cx == XXPRI) { -#ifdef IKSD -#ifdef CK_LOGIN - if (inserver && (isguest || !ENABLED(en_pri))) { - printf("?Sorry, printing is disabled\n"); - return(-9); - } -#endif /* CK_LOGIN */ -#endif /* IKSD */ - if ((x = cmifi("File to print","",&s,&y,xxstring)) < 0) { - if (x == -3) { - printf("?A file specification is required\n"); - return(-9); - } else return(x); - } - if (y != 0) { - printf("?Wildcards not allowed\n"); - return(-9); - } - ckstrncpy(line,s,LINBUFSIZ); - s = ""; -#ifndef NT - if ((x = cmtxt("Local print command options, or carriage return","",&s, - xxstring)) < 0) - return(x); -#endif /* NT */ - if ((x = cmcfm()) < 0) - return(x); - return(success = (zprint(s,line) == 0) ? 1 : 0); - } -#endif /* NOFRILLS */ - -#ifdef TCPSOCKET -#ifndef NOPUSH - if (cx == XXPNG) /* PING an IP host */ - return(doping()); -#endif /* NOPUSH */ - -#ifndef NOFTP - if (cx == XXFTP) /* FTP */ -#ifdef SYSFTP -#ifndef NOPUSH - return(doftp()); /* Just runs system's ftp program */ -#else - return(-2); -#endif /* NOPUSH */ -#else - return(doxftp()); -#endif /* SYSFTP */ -#endif /* NOFTP */ -#endif /* TCPSOCKET */ - - if (cx == XXPWD || cx == XXLPWD) { /* PWD */ -#ifdef OS2 - char *pwp; -#endif /* OS2 */ - if ((x = cmcfm()) < 0) - return(x); -#ifdef LOCUS - if (!locus && cx != XXLPWD) { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZPWD)); -#endif /* NOXFER */ - } -#endif /* LOCUS */ - -#ifndef MAC -#ifndef OS2 -#ifdef UNIX - printf("%s\n",zgtdir()); -#else - xsystem(PWDCMD); -#endif /* UNIX */ - return(success = 1); /* Blind faith */ -#else /* OS2 */ - if (pwp = zgtdir()) { - if (*pwp) { -#ifdef NT - line[0] = NUL; - ckGetLongPathName(pwp,line,LINBUFSIZ); - line[LINBUFSIZ-1] = NUL; - tmpbuf[0] = NUL; - GetShortPathName(pwp,tmpbuf,TMPBUFSIZ); - tmpbuf[TMPBUFSIZ-1] = NUL; - pwp = line; - if (!strcmp(line,tmpbuf)) { -#endif /* NT */ - printf("%s\n",pwp); -#ifdef NT - } else { - printf(" Long name: %s\n",line); - printf(" Short name: %s\n",tmpbuf); - } -#endif /* NT */ - } - return(success = ((int)strlen(pwp) > 0)); - } else return(success = 0); -#endif /* OS2 */ -#else /* MAC */ - if (pwp = zgtdir()) { - printf("%s\n",pwp); - return(success = ((int)strlen(pwp) > 0)); - } else return(success = 0); -#endif /* MAC */ - } - - if (cx == XXQUI || cx == XXEXI) { /* EXIT, QUIT */ - extern int quitting; - - if ((y = cmnum("exit status code",ckitoa(xitsta),10,&x,xxstring)) < 0) - return(y); - if ((y = cmtxt("Optional EXIT message","",&s,xxstring)) < 0) - return(y); - s = brstrip(s); - ckstrncpy(line,s,LINBUFSIZ); - - if (!hupok(0)) /* Check if connection still open */ - return(success = 0); - - if (line[0]) /* Print EXIT message if given */ - printf("%s\n",(char *)line); - - quitting = 1; /* Flag that we are quitting. */ - -#ifdef VMS - doexit(GOOD_EXIT,x); -#else -#ifdef OSK -/* Returning any codes here makes the OS-9 shell print an error message. */ - doexit(GOOD_EXIT,-1); -#else -#ifdef datageneral - doexit(GOOD_EXIT,x); -#else - doexit(x,-1); -#endif /* datageneral */ -#endif /* OSK */ -#endif /* VMS */ - } - -#ifndef NOXFER -#ifndef NOFRILLS - if (cx == XXERR) { /* ERROR */ -#ifdef CK_XYZ - if (protocol != PROTO_K) { - printf("Sorry, E-PACKET only works with Kermit protocol\n"); - return(-9); - } -#endif /* CK_XYZ */ - if ((x = cmcfm()) < 0) return(x); - ttflui(); - epktflg = 1; - sstate = 'a'; - return(0); - } -#endif /* NOFRILLS */ - - if (cx == XXFIN) { /* FINISH */ -#ifdef NEWFTP - if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) - return(ftpbye()); -#endif /* NEWFTP */ -#ifdef CK_XYZ - if (protocol != PROTO_K) { - printf("Sorry, FINISH only works with Kermit protocol\n"); - return(-9); - } -#endif /* CK_XYZ */ - if ((x = cmcfm()) < 0) return(x); - -#ifdef IKS_OPTION - if ( -#ifdef CK_XYZ - protocol == PROTO_K && -#endif /* CK_XYZ */ - !iks_wait(KERMIT_REQ_START,1)) { - printf( - "?A Kermit Server is not available to process this command\n"); - return(-9); /* Correct the return code */ - } -#endif /* IKS_OPTION */ - - sstate = setgen('F',"","",""); - if (local) ttflui(); /* If local, flush tty input buffer */ - return(0); - } -#endif /* NOXFER */ - -#ifndef NOSPL - if (cx == XXFOR) /* FOR loop */ - return(dofor()); -#endif /* NOSPL */ - -#ifndef NOXFER - /* GET MGET REGET RETRIEVE etc */ - if (cx == XXGET || cx == XXMGET || cx == XXREGET || cx == XXRETR) { -#ifdef IKSD - if (inserver && !ENABLED(en_sen)) { - printf("?Sorry, reception of files is disabled\n"); - return(-9); - } -#endif /* IKSD */ - return(doxget(cx)); - } -#endif /* NOXFER */ - -#ifndef NOSPL -#ifndef NOFRILLS - if (cx == XXGOK) { /* GETOK */ - return(success = doask(cx)); - } -#endif /* NOFRILLS */ -#endif /* NOSPL */ - - if (cx == XXHLP) { /* HELP */ -#ifdef NOHELP - return(dohlp(XXHLP)); -#else - x = cmkey2(cmdtab,ncmd,"\nCommand or topic","help",toktab,xxstring,3); - debug(F101,"HELP command x","",x); - if (x == -5) { - y = chktok(toktab); - debug(F101,"HELP cmkey token","",y); - /* ungword(); */ - switch (y) { -#ifndef NOPUSH - case '!': x = XXSHE; break; -#endif /* NOPUSH */ - case '#': x = XXCOM; break; - case ';': x = XXCOM; break; -#ifndef NOSPL - case '.': x = XXDEF; break; - case ':': x = XXLBL; break; -#ifndef NOSEXP - case '(': x = XXSEXP; break; -#endif /* NOSEXP */ -#endif /* NOSPL */ - case '&': x = XXECH; break; - default: - printf("\n?Invalid - %s\n",cmdbuf); - x = -2; - } - } - makestr(&hlptok,atmbuf); - debug(F111,"HELP token",hlptok,x); - return(dohlp(x)); -#endif /* NOHELP */ - } - -#ifndef NOHELP - if (cx == XXINT) /* INTRO */ - return(hmsga(introtxt)); - if (cx == XXNEW) { /* NEWS */ - int x; - extern char * k_info_dir; - x = hmsga(newstxt); - return(x); - } - -#ifdef OS2ONLY - if (cx == XXUPD) { /* View UPDATE file */ - extern char exedir[]; - char * pTopic; - char updstr[2048]; - if ((x = cmtxt("topic name","",&pTopic,xxstring)) < 0) - return x; -#ifdef COMMENT - sprintf(updstr, - "start view %s\\docs\\k2.inf+%s\\docs\\using_ck.inf+\ -%s\\docs\\dialing.inf+%s\\docs\\modems.inf %s", - exedir,exedir,exedir,exedir,pTopic - ); -#else - if (ckmakxmsg(updstr, - 2048, - "start view ", - exedir, - "\\docs\\k2.inf+", - exedir, - "\\docs\\using_ck.inf+", - exedir, - "\\docs\\dialing.inf+", - exedir, - "\\docs\\modems.inf ", - pTopic, - NULL, - NULL - ) > 0) -#endif /* COMMENT */ - system(updstr); - return(success = 1); - } -#endif /* OS2ONLY */ -#endif /* NOHELP */ - -#ifndef NOLOCAL - if (cx == XXHAN) { /* HANGUP */ - if ((x = cmcfm()) < 0) return(x); -#ifdef NEWFTP - if ((ftpget == 1) || ((ftpget == 2) && !local && ftpisopen())) - return(success = ftpbye()); -#endif /* NEWFTP */ -#ifndef NODIAL - if ((x = mdmhup()) < 1) { - debug(F101,"HANGUP mdmup","",x); -#endif /* NODIAL */ - x = tthang(); - debug(F101,"HANGUP tthang","",x); - x = (x > -1); -#ifndef NODIAL - } - dialsta = DIA_UNK; -#endif /* NODIAL */ - whyclosed = WC_CLOS; - ttchk(); /* In case of CLOSE-ON-DISCONNECT */ - dologend(); -#ifdef OS2 - if (x) - DialerSend(OPT_KERMIT_HANGUP, 0); -#endif /* OS2 */ - if (x) haveline = 0; - return(success = x); - } -#endif /* NOLOCAL */ - -#ifndef NOSPL - /* INPUT, REINPUT, and MINPUT */ - - if (cx == XXINP || cx == XXREI || cx == XXMINP) { - long zz; - extern int ispattern, isjoin; - - struct FDB sw, nu, fl; - int fc, havetime = 0; - char * m; - - if (cx == XXREI) { - m = "Timeout in seconds (ignored)"; - } else { - m = "Seconds to wait for input,\n or time of day hh:mm:ss, \ - or switch"; - } - innomatch = 0; /* Initialize switch value(s) */ - - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - m, /* helpmsg */ - ckitoa(indef), /* default */ - "", /* addtl string data */ - ninputsw, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - inputsw, /* Keyword table */ - &nu /* Pointer to next FDB */ - ); - cmfdbi(&nu, - _CMNUM, /* Number */ - m, /* Help message */ - ckitoa(indef), /* default */ - "", /* N/A */ - 10, /* Radix = 10 */ - 0, /* N/A */ - xxstring, /* Processing function */ - NULL, /* N/A */ - &fl /* Next */ - ); - cmfdbi(&fl, /* Time of day hh:mm:ss */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - fc = (cx == XXREI) ? cmfdb(&nu) : cmfdb(&sw); /* Parse something */ - - while (!havetime) { - if (fc < 0) { /* Error */ - if (fc == -3) { - printf("?Syntax error in INPUT-class command\n"); - return(-9); - } else - return(fc); - } - switch (cmresult.fcode) { - case _CMKEY: /* Switch */ - if (cmresult.nresult == INPSW_NOM) /* /NOMATCH */ - innomatch = 1; - m = "Seconds to wait for input,\n or time of day hh:mm:ss"; - cmfdbi(&nu,_CMNUM,m,"","",10,0,xxstring,NULL,&fl); - cmfdbi(&fl,_CMFLD,"","","",0,0,xxstring,NULL,NULL); - fc = cmfdb(&nu); /* Parse something */ - continue; - - case _CMNUM: /* Seconds to time out */ - x = cmresult.nresult; -#ifdef CKFLOAT - if (inscale != 1.0) /* Scale */ - x *= inscale; -#endif /* CKFLOAT */ - havetime++; - break; - - case _CMFLD: - zz = tod2sec(atmbuf); /* Convert to secs since midnight */ - if (zz < 0L) { - printf("?Number, expression, or time of day required\n"); - return(-9); - } else { - char now[32]; /* Current time */ - char *p; - long tnow; - p = now; - ztime(&p); - tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17); - if (zz < tnow) /* User's time before now */ - zz += 86400L; /* So make it tomorrow */ - zz -= tnow; /* Seconds from now. */ - if (zz > -1L) { - x = zz; - if (zz != (long) x) { - printf( -"Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.\n" -); - return(-9); - } - } - havetime++; - } - break; - default: - printf("?Internal error\n"); - return(-9); - } - } - /* Now parse the search text */ - -#ifdef CK_MINPUT - for (y = 0; y < MINPMAX; y++) { /* Initialize strings */ - mp[y] = 0; /* Assume it's not a pattern */ - if (ms[y]) { - free(ms[y]); /* Free old strings, if any */ - ms[y] = NULL; - } - } - if (cx == XXMINP) { /* MINPUT */ - int i, k = 0, n = 0; - struct stringarray * q; - keepallchars = 1; - while (k < MINPMAX) { - if ((y = cmfld("String or pattern","",&s,xxstring)) < 0) { - if (y == -3) { - if ((y = cmcfm()) < 0) - return(y); - break; - } else { - return(y); - } - } - debug(F111,"MINPUT field",s,k); - if (isjoin) { - if ((q = cksplit(1,0,s," ",(char *)c1chars,3,0,0))) { - char ** ap = q->a_head; - n = q->a_size; - debug(F101,"minput cksplit size","",n); - for (i = 1; i <= n && k < MINPMAX; i++) { - if (!ap[i]) /* Add non-empty elements */ - continue; - if (!*(ap[i])) - continue; - makestr(&(ms[k]),ap[i]); - debug(F111,"MINPUT JOIN",ms[k],k); - k++; - } - } - } else { - if (s) if (*s) { - makestr(&(ms[k]),brstrip(s)); - if (ispattern) mp[k] = 1; - debug(F111,"MINPUT",ms[k],ispattern); - k++; - } - } - } - keepallchars = 0; - } else { -#endif /* CK_MINPUT */ - - /* INPUT or REINPUT */ - - if ((y = cmtxt("Material to be input","",&s,xxstring)) < 0) - return(y); - mp[0] = ispattern ? 1 : 0; - makestr(&(ms[0]),brstrip(s)); - ms[1] = NULL; - -#ifdef CK_MINPUT - } -#endif /* CK_MINPUT */ - -#ifdef COMMENT - printf("/NOMATCH=%d\n",innomatch); - printf("Timeout=%d\n",x); - return(1); -#endif /* COMMENT */ - - if (cx == XXINP || cx == XXMINP) { /* Not REINPUT... */ - i_active = 1; - /* Go try to input the search string */ - success = doinput(x,ms,mp,innomatch); - i_active = 0; - } else { /* REINPUT */ - success = doreinp(x,ms[0],ispattern); - } - if (intime[cmdlvl] && !success) { /* TIMEOUT-ACTION = QUIT? */ - popclvl(); /* If so, pop command level. */ - if (pflag && cmdlvl == 0) { - if (cx == XXINP) printf("?INPUT timed out\n"); - if (cx == XXMINP) printf("?MINPUT timed out\n"); - if (cx == XXREI) printf("?REINPUT failed\n"); - } - } - return(success); /* Return do(re)input's return code */ - } - -#endif /* NOSPL */ - - if (cx == XXLOG) { /* LOG */ - x = cmkey(logtab,nlog,"What to log","",xxstring); - if (x == -3) { - printf("?Type of log required\n"); - return(-9); - } - if (x < 0) return(x); - x = dolog(x); - if (x < 0) - return(x); - else - return(success = x); - } - - if (cx == XXLOGIN) { /* (REMOTE) LOGIN */ -#ifdef NEWFTP - if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) - return(success = doftpusr()); -#endif /* NEWFTP */ -#ifdef IKSD - if (inserver) { - printf("?Already logged in\n"); - return(-9); - } else -#endif /* IKSD */ - { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZLGI)); -#endif /* NOXFER */ - } - } - if (cx == XXLOGOUT) { /* (REMOTE) LOGOUT */ -#ifdef NEWFTP - if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) - return(success = doftpres()); -#endif /* NEWFTP */ - -#ifdef IKSD - if (inserver) { - if ((x = cmcfm()) < 0) - return(x); - doexit(GOOD_EXIT,xitsta); - } else -#endif /* IKSD */ - if (!local || (network && ttchk() < 0)) { - printf("?No connection.\n"); - return(-9); - } else { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZLGO)); -#endif /* NOXFER */ - } - } - -#ifndef NOSCRIPT - if (cx == XXLOGI) { /* UUCP-style script */ - if ((x = cmtxt("expect-send expect-send ...","",&s,xxstring)) < 0) - return(x); -#ifdef CK_APC - if ((apcactive == APC_LOCAL) || - ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH)))) - return(success = 0); -#endif /* CK_APC */ -#ifdef VMS - conres(); /* For Ctrl-C to work... */ -#endif /* VMS */ - return(success = dologin(s)); /* Return 1=completed, 0=failed */ - } -#endif /* NOSCRIPT */ - -#ifndef NOXFER -#ifdef PIPESEND - if (cx == XXCREC) { /* CRECEIVE */ - if (protocol != PROTO_K) { - printf("?Sorry, CRECEIVE works only with Kermit protocol\n"); - return(-9); - } else - return(doxget(cx)); - } - if (cx == XXCGET) { /* CGET */ - return(doxget(cx)); - } -#endif /* PIPESEND */ - - if (cx == XXREC) /* RECEIVE */ - return(doxget(cx)); -#endif /* NOXFER */ - -#ifndef NOXFER - if (cx == XXREM) { /* REMOTE */ -#ifdef NEWFTP - if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) - return(doftprmt(0,0)); -#endif /* NEWFTP */ -#ifdef CK_XYZ - if (protocol != PROTO_K) { - printf("Sorry, REMOTE commands only work with Kermit protocol\n"); - return(-9); - } -#endif /* CK_XYZ */ - x = cmkey(remcmd,nrmt,"Remote Kermit server command","",xxstring); - if (x == -3) { - printf("?You must specify a command for the remote server\n"); - return(-9); - } - return(dormt(x)); - } -#endif /* NOXFER */ - -#ifndef NORENAME -#ifndef NOFRILLS - if (cx == XXREN || cx == XXLREN) { /* RENAME */ -#ifdef LOCUS - if (!locus && cx != XXLREN) { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZREN)); -#endif /* NOXFER */ - } -#endif /* LOCUS */ -#ifdef IKSD - if (inserver && (!ENABLED(en_ren) -#ifdef CK_LOGIN - || isguest -#endif /* CK_LOGIN */ - )) { - printf("?Sorry, renaming of files is disabled\n"); - return(-9); - } -#endif /* IKSD */ -#ifdef CK_APC - if ((apcactive == APC_LOCAL) || - ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH)))) - return(success = 0); -#endif /* CK_APC */ - return(dorenam()); - } -#endif /* NOFRILLS */ -#endif /* NORENAME */ - - if (cx == XXEIGHT) { /* EIGHTBIT */ - extern int parity, cmask, cmdmsk; - if ((x = cmcfm()) < 0) - return(x); - parity = 0; - cmask = 0xff; - cmdmsk = 0xff; - return(success = 1); - } - -#ifndef NOXFER -/* SEND, CSEND, MOVE, MAIL, and RESEND use the new common code */ - - if (cx == XXSEN /* SEND */ -#ifdef PIPESEND - || cx == XXCSEN /* CSEND */ -#endif /* PIPESEND */ - || cx == XXMOVE /* MOVE */ - || cx == XXMAI /* MAIL */ -#ifdef CK_RESEND - || cx == XXRSEN /* RESEND */ -#endif /* CK_RESEND */ - ) { -#ifdef IKSD - if (inserver && !ENABLED(en_get)) { - printf("?Sorry, sending files is disabled\n"); - return(-9); - } -#endif /* IKSD */ - return(doxsend(cx)); - } - -/* PSEND, ADD, and REMOVE use special parsing */ - -#ifdef ADDCMD - /* ADD and REMOVE */ - if (cx == XXADD || cx == XXREMV) { - char * m; - m = (cx == XXADD) ? "Add to which list?" : "Remove from which list?"; - x = cmkey(addtab,naddtab,m,"",xxstring); - if (x < 0) - return(x); -#ifndef NOMSEND - if (x == ADD_SND) - return(addsend(cx)); - else -#endif /* NOMSEND */ - return(doadd(cx,x)); - } -#endif /* ADDCMD */ - -#ifdef CK_RESEND - if (cx == XXPSEN) { /* PSEND */ - int seekto = 0; - - cmarg = cmarg2 = ""; - x = cmifi("File to partially send", "", &s, &y, xxstring); - if (x < 0) { - if (x == -3) { - printf("?A file specification is required\n"); - return(-9); - } else return(x); - } - nfils = -1; /* Files come from internal list. */ -#ifndef NOMSEND - addlist = 0; /* Don't use SEND-LIST. */ - filenext = NULL; -#endif /* NOMSEND */ - ckstrncpy(line,s,LINBUFSIZ); /* Save copy of string just parsed. */ - debug(F110,"PSEND line",line,0); - if (y != 0) { - printf("?Sorry, wildcards not permitted in this command\n"); - return(-9); - } - if (sizeof(int) < 4) { - printf("?Sorry, this command needs 32-bit integers\n"); - return(-9); - } - x = cmnum("starting position (byte number)", - "",10,&seekto,xxstring); - if (x < 0) - return(x); - zfnqfp(s,fspeclen,fspec); /* Get full path */ - if ((x = cmtxt("Name to send it with","",&s,NULL)) < 0) - return(x); - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - -#ifdef IKSD - if (inserver && !ENABLED(en_get)) { - printf("?Sorry, sending files is disabled\n"); - return(-9); - } -#endif /* IKSD */ -#ifdef PIPESEND - if (sndfilter) { - printf("?Sorry, no PSEND while SEND FILTER selected\n"); - return(-9); - } -#endif /* PIPESEND */ -#ifdef CK_XYZ - if ((protocol == PROTO_X || protocol == PROTO_XC)) { - printf("Sorry, PSEND works only with Kermit protocol\n"); - return(-9); - } -#endif /* CK_XYZ */ - - cmarg2 = brstrip(tmpbuf); /* Strip braces */ - cmarg = line; /* File to send */ - debug(F110,"PSEND filename",cmarg,0); - debug(F110,"PSEND as-name",cmarg2,0); - sendstart = seekto; - sstate = 's'; /* Set start state to SEND */ -#ifndef NOMSEND - addlist = 0; - filenext = NULL; -#endif /* NOMSEND */ - sendmode = SM_PSEND; -#ifdef MAC - what = W_SEND; - scrcreate(); -#endif /* MAC */ - if (local) { /* If in local mode, */ - displa = 1; /* enable file transfer display */ - } - return(0); - } -#endif /* CK_RESEND */ -#endif /* NOXFER */ - -#ifndef NOXFER -#ifndef NOMSEND - if (cx == XXMSE || cx == XXMMOVE) { -#ifdef NEWFTP - if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) - return(doftpput(cx,0)); -#endif /* NEWFTP */ -#ifdef CK_XYZ - if (protocol == PROTO_X || protocol == PROTO_XC) { - printf( -"Sorry, you can only send one file at a time with XMODEM protocol\n" - ); - return(-9); - } -#endif /* CK_XYZ */ - return(doxsend(cx)); - } - -#ifdef COMMENT /* (moved to doxsend) */ - if (cx == XXMSE || cx == XXMMOVE) { /* MSEND and MMOVE commands */ - nfils = 0; /* Like getting a list of */ - lp = line; /* files on the command line */ - addlist = 0; /* Do not use SEND-LIST */ - filenext = NULL; /* Ditto ! */ - - while (1) { - char *p; - if ((x = cmifi("Names of files to send, separated by spaces","", - &s,&y,xxstring)) < 0) { - if (x == -3) { - if (nfils <= 0) { - printf("?A file specification is required\n"); - return(-9); - } else break; - } - return(x); - } - msfiles[nfils++] = lp; /* Got one, count it, point to it, */ - p = lp; /* remember pointer, */ - while (*lp++ = *s++) /* and copy it into buffer */ - if (lp > (line + LINBUFSIZ)) { /* Avoid memory leak */ - printf("?MSEND list too long\n"); - line[0] = NUL; - return(-9); - } - debug(F111,"msfiles",msfiles[nfils-1],nfils-1); - if (nfils == 1) *fspec = NUL; /* Take care of \v(filespec) */ -#ifdef ZFNQFP - zfnqfp(p,TMPBUFSIZ,tmpbuf); - p = tmpbuf; -#endif /* ZFNQFP */ - if (((int)strlen(fspec) + (int)strlen(p) + 1) < fspeclen) { - strcat(fspec,p); /* safe */ - strcat(fspec," "); /* safe */ - } else printf("WARNING - \\v(filespec) buffer overflow\n"); - } - cmlist = msfiles; /* Point cmlist to pointer array */ - cmarg2 = ""; /* No internal expansion list (yet) */ - sndsrc = nfils; /* Filenames come from cmlist */ - sendmode = SM_MSEND; /* Remember this kind of SENDing */ - sstate = 's'; /* Set start state for SEND */ - if (cx == XXMMOVE) /* If MMOVE'ing, */ - moving = 1; /* set this flag. */ -#ifdef MAC - what = W_SEND; - scrcreate(); -#endif /* MAC */ - if (local) { /* If in local mode, */ - displa = 1; /* turn on file transfer display */ - ttflui(); /* and flush tty input buffer. */ - } - return(0); - } -#endif /* COMMENT */ -#endif /* NOMSEND */ -#endif /* NOXFER */ - -#ifndef NOSERVER - if (cx == XXSER) { /* SERVER */ -#ifdef CK_XYZ - if (protocol != PROTO_K) { - printf("Sorry, SERVER only works with Kermit protocol\n"); - return(-9); - } -#endif /* CK_XYZ */ -#ifdef COMMENT -/* - Parse for time limit, but since we don't use it yet, - the parsing is commented out. -*/ - x_ifnum = 1; /* Turn off internal complaints */ - y = cmnum("optional time limit, seconds, or time of day as hh:mm:ss", - "0", 10, &x, xxstring - ); - x_ifnum = 0; - if (y < 0) { - if (y == -2) { /* Invalid number or expression */ - zz = tod2sec(atmbuf); /* Convert to secs since midnight */ - if (zz < 0L) { - printf("?Number, expression, or time of day required\n"); - return(-9); - } else { - char now[32]; /* Current time */ - char *p; - long tnow; - p = now; - ztime(&p); - tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17); - if (zz < tnow) /* User's time before now */ - zz += 86400L; /* So make it tomorrow */ - zz -= tnow; /* Seconds from now. */ - } - } else - return(y); - } - if (zz > -1L) { - x = zz; - if (zz != (long) x) { - printf( -"Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.\n" - ); - return(-9); - } - } - if (x < 0) - x = 0; -#endif /* COMMENT */ - - if ((x = cmcfm()) < 0) return(x); - sstate = 'x'; -#ifdef MAC - what = W_RECV; - scrcreate(); -#endif /* MAC */ - if (local) displa = 1; -#ifdef AMIGA - reqoff(); /* No DOS requestors while server */ -#endif /* AMIGA */ - return(0); - } -#endif /* NOSERVER */ - - if (cx == XXSAVE) { /* SAVE command */ - x = cmkey(savtab,nsav,"option","keymap",xxstring); - if (x == -3) { - printf("?You must specify an option to save\n"); - return(-9); - } - if (x < 0) return(x); - /* have to set success separately for each item in doprm()... */ - /* actually not really, could have just had doprm return 0 or 1 */ - /* and set success here... */ - y = dosave(x); - if (y == -3) { - printf("?More fields required\n"); - return(-9); - } else return(y); - } - - if (cx == XXSET) { /* SET command */ - x = cmkey(prmtab,nprm,"Parameter","",xxstring); - if (x == -3) { - printf("?You must specify a parameter to set\n"); - return(-9); - } - if (x < 0) return(x); - /* have to set success separately for each item in doprm()... */ - /* actually not really, could have just had doprm return 0 or 1 */ - /* and set success here... */ - y = doprm(x,0); - if (y == -3) { - printf("?More fields required\n"); - return(-9); - } else return(y); - } - -#ifndef NOPUSH - if (cx == XXSHE /* SHELL (system) command */ - || cx == XXEXEC /* exec() */ - ) { - int rx = 0; - char * p = NULL; - int i /* ,n */ ; -#ifdef UNIXOROSK - char * args[256]; -#endif /* UNIXOROSK */ - -#ifdef IKSD - if (inserver && (nopush || !ENABLED(en_hos))) { - printf("?Sorry, host command access is disabled\n"); - return(-9); - } -#endif /* IKSD */ - -#ifdef CKEXEC - if (cx == XXEXEC) { /* EXEC (overlay ourselves) */ - struct FDB sw, fl; - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "Command to overlay C-Kermit\n or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 1, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - redirsw, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* 2nd FDB - command to exec */ - _CMFLD, /* fcode */ - "Command to overlay C-Kermit", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL /* No more after this */ - ); - while (1) { - x = cmfdb(&sw); /* Parse something */ - debug(F101,"exec cmfdb","",x); - if (x < 0) - return(x); - /* Generalize this if we add more switches */ - if (cmresult.fcode == _CMKEY) { - rx = 1; - continue; - } - if (cmresult.fcode == _CMFLD) - break; - return(-2); - } - ckstrncpy(tmpbuf,cmresult.sresult,TMPBUFSIZ); - if (!tmpbuf[0]) { - printf("?Command required\n"); - return(-9); - } - p = brstrip(tmpbuf); - args[0] = NULL; /* Set argv[0] to it */ - makestr(&args[0],p); - for (i = 1; i < 255; i++) { /* Get arguments for command */ - if ((x = cmfld("Argument","",&s,xxstring)) < 0) { - if (x == -3) { - if ((x = cmcfm()) < 0) - return(x); - break; - } else - return(x); - } - args[i] = NULL; - s = brstrip(s); - makestr(&args[i],s); - } - args[i] = NULL; - } else { -#endif /* CKEXEC */ - if ((x = cmtxt("System command to execute","",&s,xxstring)) < 0) - return(x); -#ifdef CKEXEC - } -#endif /* CKEXEC */ - if (nopush) - return(success = 0); -#ifdef CK_APC - if (apcactive == APC_REMOTE && !(apcstatus & APC_UNCH)) - return(success = 0); -#endif /* CK_APC */ - conres(); /* Make console normal */ -#ifdef OS2 - if (!(s && *s)) { - os2push(); - return(success = 1); - } else -#endif /* OS2 */ - if (cx == XXSHE) { - x = zshcmd(s); - debug(F101,"RUN zshcmd code","",x); - concb((char)escape); - return(success = x); -#ifdef CKEXEC - } else { -#ifdef DEBUG - if (deblog) { - debug(F111,"EXEC cmd",p,0); - for (i = 0; i < 256 && args[i]; i++) - debug(F111,"EXEC arg",args[i],i); - } -#endif /* DEBUG */ - if (p) { - z_exec(p,args,rx); /* Overlay ourself */ - debug(F100,"EXEC fails","",0); - concb((char)escape); /* In case it returns */ - } - return(success = 0); -#endif /* CKEXEC */ - } - } - -#ifdef CK_REDIR - if (cx == XXFUN) { /* REDIRECT */ -#ifdef CK_APC - if ((apcactive == APC_LOCAL) || - ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH)))) - return(success = 0); -#endif /* CK_APC */ - ckmakmsg(tmpbuf, - TMPBUFSIZ, - "Local command to run,\n", - "with its standard input/output redirected to ", - local ? ttname : "the communications connection", - "\n" - ); - if ((x = cmtxt(tmpbuf,"",&s,xxstring)) < 0) - return(x); - if (nopush) { - printf("?REDIRECT disabled\n"); - return(success=0); - } - if (!local) { - printf("?SET LINE or SET HOST required first\n"); - return(-9); - } - if (!*s) { - printf("?REDIRECT requires a command to redirect\n"); - return(-9); - } - return(success = ttruncmd(s)); - } -#endif /* CK_REDIR */ -#endif /* NOPUSH */ - -#ifndef NOSHOW - if (cx == XXSHO) { /* SHOW */ - x = cmkey(shotab,nsho,"","parameters",xxstring); - if (x < 0) return(x); - return(doshow(x)); - } -#endif /* NOSHOW */ - -#ifndef MAC - if (cx == XXSPA) { /* SPACE */ -#ifdef IKSD - if (inserver && !ENABLED(en_spa)) { - printf("?Sorry, SPACE command disabled\n"); - return(-9); - } -#endif /* IKSD */ -#ifdef datageneral - /* AOS/VS can take an argument after its "space" command. */ - if ((x = cmtxt("Confirm, or local directory name","",&s,xxstring)) < 0) - return(x); - if (nopush) { - printf("?Sorry, SPACE command disabled\n"); - return(-9); - } else if (*s == NUL) { - xsystem(SPACMD); - } else { - ckmakmsg(line,LINBUFSIZ,"space ",s,NULL,NULL); - xsystem(line); - } -#else -#ifdef OS2 - if ((x = cmtxt("Press Enter for current disk,\n\ - or specify a disk letter like A:","",&s,xxstring)) < 0) - return(x); - if (*s == NUL) { /* Current disk */ - unsigned long space = zdskspace(0); - if (space > 0 && space < 1024) - printf(" Free space: unknown\n"); - else - printf(" Free space: %ldK\n", space/1024L); - } else { - int drive = toupper(*s); - unsigned long space = zdskspace(drive - 'A' + 1); - if (space > 0 && space < 1024) - printf(" Drive %c: unknown free\n"); - else - printf(" Drive %c: %ldK free\n", drive,space / 1024L); - } -#else -#ifdef UNIXOROSK - x = cmdir("Confirm for current disk,\n\ - or specify a disk device or directory","",&s,xxstring); - if (x == -3) - s = ""; - else if (x < 0) - return(x); - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - s = tmpbuf; - if ((x = cmcfm()) < 0) return(x); - if (nopush) { - printf("?Sorry, SPACE command disabled\n"); - return(-9); - } - if (!*s) { /* Current disk */ - xsystem(SPACMD); - } else { /* Specified disk */ - ckmakmsg(line,LINBUFSIZ,SPACM2," ",s,NULL); - xsystem(line); - } -#else - if ((x = cmcfm()) < 0) return(x); - if (nopush) { - printf("?Sorry, SPACE command disabled\n"); - return(-9); - } - xsystem(SPACMD); -#endif /* UNIXOROSK */ -#endif /* OS2 */ -#endif /* datageneral */ - return(success = 1); /* Pretend it worked */ - } -#endif /* MAC */ - -#ifndef NOXFER - if (cx == XXSTA) { /* STATISTICS */ - if ((x = cmkey(stattab,2,"Carriage return, or option", - "/brief",xxstring)) < 0) - return(x); - if ((y = cmcfm()) < 0) return(y); - return(success = dostat(x)); - } -#endif /* NOXFER */ - - if (cx == XXSTO || cx == XXEND) { /* STOP, END, or POP */ - if ((y = cmnum("exit status code","0",10,&x,xxstring)) < 0) - return(y); - if ((y = cmtxt("Message to print","",&s,xxstring)) < 0) - return(y); - s = brstrip(s); - if (*s) printf("%s\n",s); - if (cx == XXSTO) { - dostop(); - } else { - doend(x); - } - return(success = (x == 0)); - } - if (cx == XXSUS) { /* SUSPEND */ - if ((y = cmcfm()) < 0) return(y); -#ifdef NOJC - printf("Sorry, this version of Kermit cannot be suspended\n"); -#else -#ifdef IKSD - if (inserver) { - printf("?Sorry, IKSD can not be suspended\n"); - return(-9); - } else -#endif /* IKSD */ - if (nopush) { - printf("?Sorry, access to system is disabled\n"); - return(-9); - } - stptrap(0); -#endif /* NOJC */ - return(0); - } - - if (cx == XXTAK) { /* TAKE */ - char * scriptenv = NULL; -#ifdef OS2 - char * GetAppData(int); - extern char startupdir[],exedir[],inidir[]; - char * keymapenv = NULL; - char * appdata0 = NULL, *appdata1 = NULL; - int xx; -#define TAKEPATHLEN 4096 -#else /* OS2 */ -#define TAKEPATHLEN 1024 -#endif /* OS2 */ - char takepath[TAKEPATHLEN]; - - if (tlevel >= MAXTAKE-1) { - printf("?Take files nested too deeply\n"); - return(-9); - } -#ifdef OS2 -#ifdef NT - scriptenv = getenv("K95SCRIPTS"); - keymapenv = getenv("K95KEYMAPS"); - makestr(&appdata0,(char *)GetAppData(0)); - makestr(&appdata1,(char *)GetAppData(1)); -#else /* NT */ - scriptenv = getenv("K2SCRIPTS"); - keymapenv = getenv("K2KEYMAPS"); -#endif /* NT */ -#endif /* OS2 */ - - if (!scriptenv) /* Let this work for Unix etc too */ - scriptenv = getenv("CK_SCRIPTS"); /* Use this if defined */ -#ifndef OS2 - if (!scriptenv) /* Otherwise use home directory */ - scriptenv = homepath(); -#endif /* OS2 */ - if (!scriptenv) - scriptenv = ""; - ckstrncpy(takepath,scriptenv,TAKEPATHLEN); - debug(F110,"TAKE initial takepath",takepath,0); - -#ifdef OS2 - if (!keymapenv) - keymapenv = getenv("CK_KEYMAPS"); - if (!keymapenv) - keymapenv = ""; - - ckstrncat(takepath, - (scriptenv && scriptenv[strlen(scriptenv)-1]==';')?"":";", - TAKEPATHLEN - ); - ckstrncat(takepath,keymapenv?keymapenv:"",TAKEPATHLEN); - ckstrncat(takepath, - (keymapenv && keymapenv[strlen(keymapenv)-1]==';')?"":";", - TAKEPATHLEN - ); - ckstrncat(takepath,startupdir,TAKEPATHLEN); - ckstrncat(takepath,";",TAKEPATHLEN); - ckstrncat(takepath,startupdir,TAKEPATHLEN); - ckstrncat(takepath,"SCRIPTS/;",TAKEPATHLEN); - ckstrncat(takepath,startupdir,TAKEPATHLEN); - ckstrncat(takepath,"KEYMAPS/;",TAKEPATHLEN); - - ckstrncat(takepath,appdata1,TAKEPATHLEN); - ckstrncat(takepath,"Kermit 95/;",TAKEPATHLEN); - ckstrncat(takepath,appdata1,TAKEPATHLEN); - ckstrncat(takepath,"Kermit 95/SCRIPTS/;",TAKEPATHLEN); - ckstrncat(takepath,appdata1,TAKEPATHLEN); - ckstrncat(takepath,"Kermit 95/KEYMAPS/;",TAKEPATHLEN); - - ckstrncat(takepath,appdata0,TAKEPATHLEN); - ckstrncat(takepath,"Kermit 95/;",TAKEPATHLEN); - ckstrncat(takepath,appdata0,TAKEPATHLEN); - ckstrncat(takepath,"Kermit 95/SCRIPTS/;",TAKEPATHLEN); - ckstrncat(takepath,appdata0,TAKEPATHLEN); - ckstrncat(takepath,"Kermit 95/KEYMAPS/;",TAKEPATHLEN); - - ckstrncat(takepath,inidir,TAKEPATHLEN); - ckstrncat(takepath,";",TAKEPATHLEN); - ckstrncat(takepath,inidir,TAKEPATHLEN); - ckstrncat(takepath,"SCRIPTS/;",TAKEPATHLEN); - ckstrncat(takepath,inidir,TAKEPATHLEN); - ckstrncat(takepath,"KEYMAPS/;",TAKEPATHLEN); - - ckstrncat(takepath,zhome(),TAKEPATHLEN); - ckstrncat(takepath,";",TAKEPATHLEN); - ckstrncat(takepath,zhome(),TAKEPATHLEN); - ckstrncat(takepath,"SCRIPTS/;",TAKEPATHLEN); - ckstrncat(takepath,zhome(),TAKEPATHLEN); - ckstrncat(takepath,"KEYMAPS/;",TAKEPATHLEN); - - ckstrncat(takepath,exedir,TAKEPATHLEN); - ckstrncat(takepath,";",TAKEPATHLEN); - ckstrncat(takepath,exedir,TAKEPATHLEN); - ckstrncat(takepath,"SCRIPTS/;",TAKEPATHLEN); - ckstrncat(takepath,exedir,TAKEPATHLEN); - ckstrncat(takepath,"KEYMAPS/;",TAKEPATHLEN); -#endif /* OS2 */ - debug(F110,"TAKE final takepath",takepath,0); - - if ((y = cmifip("Commands from file", - "",&s,&x,0,takepath,xxstring)) < 0) { - if (y == -3) { - printf("?A file name is required\n"); - return(-9); - } else - return(y); - } - if (x != 0) { - printf("?Wildcards not allowed in command file name\n"); - return(-9); - } - ckstrncpy(line,s,LINBUFSIZ); - debug(F110,"TAKE file",s,0); - if (isdir(s)) { - printf("?Can't execute a directory - \"%s\"\n", s); - return(-9); - } -#ifndef NOTAKEARGS - { - char * p; - x = strlen(line); - debug(F111,"TAKE args",line,x); - p = line + x + 1; - if ((y = cmtxt("Optional arguments","",&s,xxstring)) < 0) - return(y); - if (*s) { /* Args given? */ - ckstrncpy(p,s,LINBUFSIZ-x-1); -#ifdef ZFNQFP - zfnqfp(line,TMPBUFSIZ,tmpbuf); - s = tmpbuf; -#else - s = line; -#endif /* ZFNQFP */ - debug(F110,"TAKE filename",s,0); - x = strlen(s); - debug(F101,"TAKE new len",s,x); - -#ifdef COMMENT -/* - This was added in C-Kermit 7.0 to allow args to be passed from the TAKE - command to the command file. But it overwrites the current argument vector, - which is at best surprising, and at worst unsafe. -*/ - addmac("%0",s); /* Define %0 = name of file */ - varnam[0] = '%'; - varnam[2] = '\0'; - debug(F110,"take arg 0",s,0); - debug(F110,"take args",p,0); - for (y = 1; y < 10; y++) { /* Clear current args %1..%9 */ - varnam[1] = (char) (y + '0'); - delmac(varnam,0); - } - xwords(p,MAXARGLIST,NULL,0); /* Assign new args */ - debug(F110,"take args",p,0); -#else -/* - This method is used in 8.0. If the TAKE command includes arguments, we - insert an intermediate temporary macro between the current level; we pass - the arguments to the macro and then the macro TAKEs the command file. - If the user Ctrl-C's out of the TAKE file, some temporary macro definitions - and other small malloc'd bits might be left behind. -*/ - { - char * q = NULL; - char * r = NULL; - int k, m; - m = maclvl; - q = (char *)malloc(x+24); - if (q) { - r = (char *)malloc(x+24); - if (r) { - sprintf(q,"_file[%s](%d)",s,cmdlvl); /* safe */ - sprintf(r,"take %s",s); /* safe */ - k = addmac(q,r); - if (k > -1) { - dodo(k,p,0); - while (maclvl > m) { - sstate = (CHAR) parser(1); - if (sstate) proto(); - } - } - k = delmac(q,0); - free(q); - free(r); - return(success); - } - } - } - return(success = 0); -#endif /* COMMENT */ - } - } -#else - if ((y = cmcfm()) < 0) return(y); -#endif /* NOTAKEARGS */ - return(success = dotake(line)); - } - -#ifndef NOLOCAL -#ifdef OS2 - if (cx == XXVIEW) { /* VIEW Only Terminal mode */ - viewonly = TRUE; - success = doconect(0, 0); - viewonly = FALSE; - return success; - } -#endif /* OS2 */ - -#ifdef NETCONN - if (cx == XXTEL || cx == XXIKSD) { /* TELNET */ - int x,z; -#ifdef OS2 - if (!tcp_avail) { - printf("?Sorry, either TCP/IP is not available on this system or\n\ -necessary DLLs did not load. Use SHOW NETWORK to check network status.\n"); - success = 0; - return(-9); - } else -#endif /* OS2 */ - { - x = nettype; /* Save net type in case of failure */ - z = ttnproto; /* Save protocol in case of failure */ - nettype = NET_TCPB; - ttnproto = (cx == XXTEL) ? NP_TELNET : NP_KERMIT; - if ((y = setlin(XYHOST,0,1)) <= 0) { - nettype = x; /* Failed, restore net type. */ - ttnproto = z; /* and protocol */ - success = 0; - } - didsetlin++; - } - return(y); - } - -#ifndef PTYORPIPE -#ifdef NETCMD -#define PTYORPIPE -#else -#ifdef NETPTY -#define PTYORPIPE -#endif /* NETPTY */ -#endif /* NETCMD */ -#endif /* PTYORPIPE */ - -#ifdef PTYORPIPE - if (cx == XXPIPE || cx == XXPTY) { /* PIPE or PTY */ - int x; - extern int netsave; - x = nettype; /* Save net type in case of failure */ - nettype = (cx == XXPIPE) ? NET_CMD : NET_PTY; - if ((y = setlin(XYHOST,0,1)) < 0) { - nettype = x; /* Failed, restore net type. */ - ttnproto = z; /* and protocol */ - success = 0; - } - didsetlin++; - netsave = x; - return(y); - } -#endif /* PTYORPIPE */ - -#ifdef ANYSSH - if (cx == XXSSH) { /* SSH (Secure Shell) */ - extern int netsave; -#ifdef SSHBUILTIN - int k, x, havehost = 0, trips = 0; - int tmpver = -1, tmpxfw = -1; -#ifndef SSHTEST - extern int sl_ssh_xfw, sl_ssh_xfw_saved; - extern int sl_ssh_ver, sl_ssh_ver_saved; -#endif /* SSHTEST */ - extern int mdmtyp, mdmsav, cxtype, sl_uid_saved; - extern char * slmsg; - extern char uidbuf[], sl_uidbuf[]; - extern char pwbuf[], * g_pswd; - extern int pwflg, pwcrypt, g_pflg, g_pcpt, nolocal; - struct FDB sw, kw, fl; - - if (ssh_tmpstr) - memset(ssh_tmpstr,0,strlen(ssh_tmpstr)); - makestr(&ssh_tmpstr,NULL); - makestr(&ssh_tmpuid,NULL); - makestr(&ssh_tmpcmd,NULL); - makestr(&ssh_tmpport,NULL); - - cmfdbi(&kw, /* 1st FDB - commands */ - _CMKEY, /* fcode */ - "host [ port ],\n or action", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nsshcmd, /* addtl numeric data 1: tbl size */ - 0, /* addtl numeric data 2: 0 = keyword */ - xxstring, /* Processing function */ - sshkwtab, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* Host */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - - x = cmfdb(&kw); - if (x == -3) { - printf("?ssh what?\n"); - return(-9); - } - if (x < 0) - return(x); - havehost = 0; - if (cmresult.fcode == _CMFLD) { - havehost = 1; - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Hostname */ - cmresult.nresult = XSSH_OPN; - } - switch (cmresult.nresult) { /* SSH keyword */ - case XSSH_OPN: /* SSH OPEN */ - if (!havehost) { - if ((x = cmfld("Host","",&s,xxstring)) < 0) - return(x); - ckstrncpy(line,s,LINBUFSIZ); - } - /* Parse [ port ] [ switches ] */ - cmfdbi(&kw, /* Switches */ - _CMKEY, - "Port number or service name,\nor switch", - "", - "", - nsshopnsw, - 4, - xxstring, - sshopnsw, - &fl - ); - cmfdbi(&fl, /* Port number or service name */ - _CMFLD, - "", - "", - "", - 0, - 0, - xxstring, - NULL, - NULL - ); - trips = 0; /* Explained below */ - while (1) { /* Parse port and switches */ - x = cmfdb(&kw); /* Get a field */ - if (x == -3) /* User typed CR so quit from loop */ - break; - if (x < 0) /* Other parse error, pass it back */ - return(x); - switch (cmresult.fcode) { /* Field or Keyword? */ - case _CMFLD: /* Field */ - makestr(&ssh_tmpport,cmresult.sresult); - break; - case _CMKEY: /* Keyword */ - switch (cmresult.nresult) { /* Which one? */ - case SSHSW_USR: /* /USER: */ - if (!cmgbrk()) { - printf("?This switch requires an argument\n"); - return(-9); - } - if ((y = cmfld("Username","",&s,xxstring)) < 0) - return(y); - s = brstrip(s); - makestr(&ssh_tmpuid,s); - break; - case SSHSW_PWD: - if (!cmgbrk()) { - printf("?This switch requires an argument\n"); - return(-9); - } - debok = 0; - if ((x = cmfld("Password","",&s,xxstring)) < 0) { - if (x == -3) { - makestr(&ssh_tmpstr,""); - } else { - return(x); - } - } else { - s = brstrip(s); - if ((x = (int)strlen(s)) > PWBUFL) { - makestr(&slmsg,"Internal error"); - printf("?Sorry, too long - max = %d\n",PWBUFL); - return(-9); - } - makestr(&ssh_tmpstr,s); - } - break; - - case SSHSW_VER: - if ((x = cmnum("Number","",10,&z,xxstring)) < 0) - return(x); - if (z < 1 || z > 2) { - printf("?Out of range: %d\n",z); - return(-9); - } - tmpver = z; - break; - case SSHSW_CMD: - case SSHSW_SUB: - if ((x = cmfld("Text","",&s,xxstring)) < 0) - return(x); - makestr(&ssh_tmpcmd,s); - ssh_cas = (cmresult.nresult == SSHSW_SUB); - break; - case SSHSW_X11: - if ((x = cmkey(onoff,2,"","on",xxstring)) < 0) - return(x); - tmpxfw = x; - break; - default: - return(-2); - } - } - if (trips++ == 0) { /* After first time through */ - cmfdbi(&kw, /* only parse switches, not port. */ - _CMKEY, - "Switch", - "", - "", - nsshopnsw, - 4, - xxstring, - sshopnsw, - NULL - ); - } - } - if ((x = cmcfm()) < 0) /* Get confirmation */ - return(x); - if (clskconnx(1) < 0) { /* Close current Kermit connection */ - if ( ssh_tmpstr ) { - memset(ssh_tmpstr,0,strlen(ssh_tmpstr)); - makestr(&ssh_tmpstr,NULL); - } - return(success = 0); - } - makestr(&ssh_hst,line); /* Stash everything */ - if (ssh_tmpuid) { - if (!sl_uid_saved) { - ckstrncpy(sl_uidbuf,uidbuf,UIDBUFLEN); - sl_uid_saved = 1; - } - ckstrncpy(uidbuf,ssh_tmpuid,UIDBUFLEN); - makestr(&ssh_tmpuid,NULL); - } - if (ssh_tmpport) { - makestr(&ssh_prt,ssh_tmpport); - makestr(&ssh_tmpport,NULL); - } else - makestr(&ssh_prt,NULL); - - if (ssh_tmpcmd) { - makestr(&ssh_cmd,brstrip(ssh_tmpcmd)); - makestr(&ssh_tmpcmd,NULL); - } else - makestr(&ssh_cmd,NULL); - - if (tmpver > -1) { -#ifndef SSHTEST - if (!sl_ssh_ver_saved) { - sl_ssh_ver = ssh_ver; - sl_ssh_ver_saved = 1; - } -#endif /* SSHTEST */ - ssh_ver = tmpver; - } - if (tmpxfw > -1) { -#ifndef SSHTEST - if (!sl_ssh_xfw_saved) { - sl_ssh_xfw = ssh_xfw; - sl_ssh_xfw_saved = 1; - } -#endif /* SSHTEST */ - ssh_xfw = tmpxfw; - } - if (ssh_tmpstr) { - if (ssh_tmpstr[0]) { - ckstrncpy(pwbuf,ssh_tmpstr,PWBUFL+1); - pwflg = 1; - pwcrypt = 0; - } else - pwflg = 0; - makestr(&ssh_tmpstr,NULL); - } - nettype = NET_SSH; - if (mdmsav < 0) - mdmsav = mdmtyp; - mdmtyp = -nettype; - x = 1; - -#ifndef NOSPL - makestr(&g_pswd,pwbuf); /* Save global pwbuf */ - g_pflg = pwflg; /* and flag */ - g_pcpt = pwcrypt; -#endif /* NOSPL */ - - /* Line parameter to ttopen() is ignored */ - k = ttopen(line,&x,mdmtyp, 0); - if (k < 0) { - printf("?Unable to connect to %s\n",ssh_hst); - mdmtyp = mdmsav; - slrestor(); - return(success = 0); - } - duplex = 0; /* Remote echo */ - ckstrncpy(ttname,line,TTNAMLEN); /* Record the command */ - debug(F110,"ssh ttname",ttname,0); - makestr(&slmsg,NULL); /* No SET LINE error message */ - cxtype = CXT_SSH; -#ifndef NODIAL - dialsta = DIA_UNK; -#endif /* NODIAL */ - success = 1; /* SET LINE succeeded */ - network = 1; /* Network connection (not serial) */ - local = 1; /* Local mode (not remote) */ - if ((reliable != SET_OFF || !setreliable)) - reliable = SET_ON; /* Transport is reliable end to end */ -#ifdef OS2 - DialerSend(OPT_KERMIT_CONNECT, 0); -#endif /* OS2 */ - setflow(); /* Set appropriate flow control */ - - haveline = 1; -#ifdef CKLOGDIAL -#ifdef NETCONN - dolognet(); -#endif /* NETCONN */ -#endif /* CKLOGDIAL */ - -#ifndef NOSPL - if (local) { - if (nmac) { /* Any macros defined? */ - int k; /* Yes */ - k = mlook(mactab,"on_open",nmac); /* Look this up */ - if (k >= 0) { /* If found, */ - if (dodo(k,ssh_hst,0) > -1) /* set it up, */ - parser(1); /* and execute it */ - } - } - } -#endif /* NOSPL */ -#ifdef LOCUS - if (autolocus) - setlocus(1,1); -#endif /* LOCUS */ - - /* Command was confirmed so we can pre-pop command level. */ - /* This is so CONNECT module won't think we're executing a */ - /* script if CONNECT was the final command in the script. */ - if (cmdlvl > 0) - prepop(); - success = doconect(0,cmdlvl == 0 ? 1 : 0); - if (ttchk() < 0) - dologend(); - return(success); - - case XSSH_CLR: - if ((y = cmkey(sshclr,nsshclr,"","", xxstring)) < 0) { - if (y == -3) { - printf("?clear what?\n"); - return(-9); - } - return(y); - } - if ((x = cmcfm()) < 0) - return(x); - switch (y) { - case SSHC_LPF: - ssh_pf_lcl_n = 0; - break; - case SSHC_RPF: - ssh_pf_rmt_n = 0; - break; - default: - return(-2); - } - return(success = 1); /* or whatever */ - - case XSSH_AGT: { /* SSH AGENT */ - int doeach = 0; - if ((y = cmkey(sshagent,nsshagent,"","",xxstring)) < 0) - return(y); - switch (y) { - case SSHA_ADD: /* SSH AGENT ADD ... */ - if ((x = cmifi("Identity file","",&s,&y,xxstring)) < 0) { -#ifndef SSHTEST - if (x == -3) /* No name given */ - doeach = 1; /* so do them all */ - else -#endif /* SSHTEST */ - return(x); - } - ckstrncpy(line,s,LINBUFSIZ); - if ((x = cmcfm()) < 0) - return(x); -#ifdef SSHTEST - x = 0; -#else - if (doeach) { - int i; - x = 0; - for (i = 0; i < ssh_idf_n; i++) - x += ssh_agent_add_file(ssh_idf[i]); - } else - x = ssh_agent_add_file(line); -#endif /* SSHTEST */ - return(success = (x == 0)); - - case SSHA_DEL: { /* SSH AGENT DELETE ... */ - int doall = 0; - if ((x = cmifi("Identity file","",&s,&y,xxstring)) < 0) { -#ifndef SSHTEST - if (x == -3) /* No name given */ - doall = 1; /* so do them all */ - else -#endif /* SSHTEST */ - return(x); - } - ckstrncpy(line,s,LINBUFSIZ); - if ((x = cmcfm()) < 0) - return(x); -#ifdef SSHTEST - x = 0; -#else - if (doall) - x = ssh_agent_delete_all(); - else - x = ssh_agent_delete_file(line); -#endif /* SSHTEST */ - return(success = (x == 0)); - } - case SSHA_LST: { - int fingerprint = 0; - if ((y = cmswi(sshagtsw,nsshagtsw,"","",xxstring)) < 0) { - if (y != -3) - return(y); - } else if (cmgbrk() > SP) { - printf("?This switch does not take an argument\n"); - return(-9); - } else if (y == SSHASW_FP) { - fingerprint = 1; - } - if ((x = cmcfm()) < 0) - return(x); -#ifdef SSHTEST - return(success = 1); -#else - return(success = - (ssh_agent_list_identities(fingerprint) == 0)); -#endif /* SSHTEST */ - } - default: - return(-2); - } - } - case XSSH_ADD: { /* SSH ADD */ - /* ssh add { local, remote } port host port */ - int cx, i, j, k; - char * h; - if ((cx = cmkey(addfwd,naddfwd,"","", xxstring)) < 0) - return(cx); - if ((x = cmnum((cx == SSHF_LCL) ? - "Local port number" : "Remote port number", - "",10,&j,xxstring)) < 0) - return(x); - if ((x = cmfld("Host","",&s,xxstring)) < 0) - return(x); - makestr(&h,s); - if ((x = cmnum("Port","",10,&k,xxstring)) < 0) - return(x); - if ((x = cmcfm()) < 0) - return(x); - - switch(cx) { - case SSHF_LCL: - if (ssh_pf_lcl_n == 32) { - printf( -"?Maximum number of local port forwardings already specified\n" - ); - free(h); - return(success = 0); - } - ssh_pf_lcl[ssh_pf_lcl_n].p1 = j; - makestr(&(ssh_pf_lcl[ssh_pf_lcl_n].host),h); - makestr(&h,NULL); - ssh_pf_lcl[ssh_pf_lcl_n].p2 = k; - ssh_pf_lcl_n++; - break; - case SSHF_RMT: - if (ssh_pf_rmt_n == 32) { - printf( -"?Maximum number of remote port forwardings already specified\n" - ); - free(h); - return(success = 0); - } - ssh_pf_rmt[ssh_pf_rmt_n].p1 = j; - makestr(&(ssh_pf_rmt[ssh_pf_rmt_n].host),h); - makestr(&h,NULL); - ssh_pf_rmt[ssh_pf_rmt_n].p2 = k; - ssh_pf_rmt_n++; - } - return(success = 1); - } - /* Not supporting arbitrary forwarding yet */ - case XSSH_FLP: /* SSH FORWARD-LOCAL-PORT */ - case XSSH_FRP: { /* SSH FORWARD-REMOTE-PORT */ - int li_port = 0; - int to_port = 0; - char * fw_host = NULL; - int n; - if ((x = cmnum(cmresult.nresult == XSSH_FLP ? - "local-port":"remote-port", - "",10,&li_port,xxstring)) < 0) - return(x); - if (li_port < 1 || li_port > 65535) { - printf("?Out range - min: 1, max: 65535\n"); - return(-9); - } - if ((x = cmfld("host",ssh_hst?ssh_hst:"",&s,xxstring)) < 0) - return(x); - n = ckstrncpy(tmpbuf,s,TMPBUFSIZ); - fw_host = tmpbuf; - if ((x = cmnum("host-port",ckuitoa(li_port),10, - &to_port,xxstring)) < 0) - return(x); - if (to_port < 1 || to_port > 65535) { - printf("?Out range - min: 1, max: 65535\n"); - return(-9); - } - if ((x = cmcfm()) < 0) - return(x); - switch (cmresult.nresult) { - case XSSH_FLP: /* SSH FORWARD-LOCAL-PORT */ -#ifndef SSHTEST - ssh_fwd_local_port(li_port,fw_host,to_port); -#endif /* SSHTEST */ - return(success = 1); - case XSSH_FRP: /* SSH FORWARD-REMOTE-PORT */ -#ifndef SSHTEST - ssh_fwd_remote_port(li_port,fw_host,to_port); -#endif /* SSHTEST */ - return(success = 1); - } - return(success = 1); - } - case XSSH_V2: /* SSH V2 */ - if ((cx = cmkey(ssh2tab,nssh2tab,"","", xxstring)) < 0) - return(cx); - switch (cx) { - case XSSH2_RKE: - if ((x = cmcfm()) < 0) - return(x); -#ifndef SSHTEST - ssh_v2_rekey(); -#endif /* SSHTEST */ - return(success = 1); - default: - return(-2); - } - case XSSH_KEY: - if ((cx = cmkey(sshkey,nsshkey,"","", xxstring)) < 0) - return(cx); - switch (cx) { - case SSHK_PASS: { /* Change passphrase */ - char * oldp = NULL, * newp = NULL; - struct FDB df, sw; - cmfdbi(&sw, - _CMKEY, /* fcode */ - "Filename, or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 2, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - sshkpsw, /* Keyword table */ - &df /* Pointer to next FDB */ - ); - cmfdbi(&df, /* 2nd FDB - file for display */ - _CMIFI, /* output file */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - line[0] = NUL; - - while (1) { - x = cmfdb(&sw); - if (x == -3) break; - if (x < 0) - return(x); - if (cmresult.fcode != _CMKEY) - break; - if (!cmgbrk()) { - printf("?This switch requires an argument\n"); - return(-9); - } - if ((y = cmfld("Passphrase","",&s,xxstring)) < 0) - return(y); - switch (cmresult.nresult) { - case 1: /* Old */ - makestr(&oldp,s); - break; - case 2: /* New */ - makestr(&newp,s); - } - } - if (cmresult.fcode == _CMIFI) { /* Filename */ - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); - if (zfnqfp(line,TMPBUFSIZ,tmpbuf)) - ckstrncpy(line,tmpbuf,LINBUFSIZ); - } - if ((x = cmcfm()) < 0) return(x); - -#ifndef SSHTEST - x = sshkey_change_passphrase(line[0] ? line : NULL, - oldp, newp); -#endif /* SSHTEST */ - makestr(&oldp,NULL); - makestr(&newp,NULL); - success = (x == 0); - return(success); - } - case SSHK_CREA: { /* SSH KEY CREATE /switches... */ - int bits = 1024, keytype = SSHKT_2R; - char * pass = NULL, * comment = NULL; - struct FDB df, sw; - - /* - * char * sshkey_default_file(int keytype) - * will provide the default filename for a given keytype - * is it possible to have the default value for the 2nd - * FDB set and changed when a /TYPE switch is provided? - * Would this allow for tab completion of the filename? - */ - cmfdbi(&sw, - _CMKEY, /* fcode */ - "Filename, or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nsshkcrea, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - sshkcrea, /* Keyword table */ - &df /* Pointer to next FDB */ - ); - cmfdbi(&df, /* 2nd FDB - file for display */ - _CMOFI, /* output file */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - line[0] = NUL; - - while (1) { - x = cmfdb(&sw); - if (x == -3) break; - if (x < 0) - return(x); - if (cmresult.fcode != _CMKEY) - break; - if (!cmgbrk()) { - printf("?This switch requires an argument\n"); - return(-9); - } - switch (cmresult.nresult) { - case SSHKC_BI: /* /BITS:n */ - if ((y = cmnum("","1024",10,&z,xxstring)) < 0) - return(y); - if (z < 512 || z > 4096) { - printf("?Out range - min: 512, max: 4096\n"); - return(-9); - } - bits = z; - break; - case SSHKC_PP: /* /PASSPHRASE:blah */ - if ((y = cmfld("Passphrase","",&s,xxstring)) < 0) - return(y); - makestr(&pass,s); - break; - case SSHKC_TY: /* /TYPE:keyword */ - if ((y = cmkey(sshkcty,nsshkcty,"", - "v2-rsa",xxstring)) < 0) - return(y); - keytype = y; - break; - case SSHKC_1R: /* /COMMENT */ - if ((y = cmfld("Text","",&s,xxstring)) < 0) - return(y); - makestr(&comment,s); - break; - } - } - if (cmresult.fcode == _CMOFI) { /* Filename */ - if (cmresult.sresult) { - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); - if (zfnqfp(line,TMPBUFSIZ,tmpbuf)) - ckstrncpy(line,tmpbuf,LINBUFSIZ); - } - } - if ((y = cmcfm()) < 0) /* Confirm */ - return(y); -#ifndef SSHTEST - x = sshkey_create(line[0] ? line : NULL, - bits, pass, keytype, comment); - if (pass) - memset(pass,0,strlen(pass)); -#endif /* SSHTEST */ - makestr(&pass,NULL); - makestr(&comment,NULL); - return(success = (x == 0)); - } - case SSHK_DISP: { /* SSH KEY DISPLAY /switches... */ - char c; - int infmt = 0, outfmt = 0; - struct FDB df, sw; - cmfdbi(&sw, - _CMKEY, /* fcode */ - "Filename, or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nsshdswi, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - sshdswi, /* Keyword table */ - &df /* Pointer to next FDB */ - ); - cmfdbi(&df, /* 2nd FDB - file for display */ - _CMIFI, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - line[0] = NUL; - - while (1) { - x = cmfdb(&sw); - if (x == -3) break; - if (x < 0) - return(x); - if (cmresult.fcode != _CMKEY) - break; - if (!cmgbrk()) { - printf("?This switch requires an argument\n"); - return(-9); - } - switch (cmresult.nresult) { -#ifdef COMMENT - case SSHKD_IN: /* /IN-FORMAT: */ - if ((y = cmkey(sshdifmt,nsshdifmt, - "","",xxstring)) < 0) - return(y); - infmt = y; - break; -#endif /* COMMENT */ - case SSHKD_OUT: /* /FORMAT: */ - if ((y = cmkey(sshdofmt,nsshdofmt, - "","",xxstring)) < 0) - return(y); - outfmt = y; - break; - } - } - if (cmresult.fcode == _CMIFI) { /* Filename */ - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); - if (zfnqfp(line,TMPBUFSIZ,tmpbuf)) - ckstrncpy(line,tmpbuf,LINBUFSIZ); - } -#ifdef COMMENT - if (!line[0]) { - printf("?Key filename required\n"); - return(-9); - } -#endif /* COMMENT */ - if ((y = cmcfm()) < 0) /* Confirm */ - return(y); -#ifndef SSHTEST - switch (outfmt) { - case SKDF_OSSH: - /* 2nd param is optional passphrase */ - x = sshkey_display_public(line[0] ? line : NULL, NULL); - break; - case SKDF_SSHC: - /* 2nd param is optional passphrase */ - x = sshkey_display_public_as_ssh2(line[0] ? line : NULL, - NULL); - break; - case SKDF_IETF: - x = sshkey_display_fingerprint(line[0] ? line : NULL, 1); - break; - case SKDF_FING: - x = sshkey_display_fingerprint(line[0] ? line : NULL, 0); - break; - } -#endif /* SSHTEST */ - return(success = (x == 0)); - } - case SSHK_V1: /* SSH KEY V1 SET-COMMENT */ - if ((x = cmkey(sshkv1,1,"","set-comment", xxstring)) < 0) - return(x); - if (x != 1) return(-2); - if ((x = cmifi("Key file name","",&s,&y,xxstring)) < 0) { - if (x == -3) { - printf("?Name of key file required\n"); - return(-9); - } - } - ckstrncpy(line,s,LINBUFSIZ); - if ((x = cmtxt("Comment text","",&s,xxstring)) < 0) - return(x); -#ifndef SSHTEST - x = sshkey_v1_change_comment(line, /* filename */ - s, /* new comment */ - NULL /* passphrase */ - ); -#endif /* SSHTEST */ - success = (x == 0); - return(success); - } - default: - return(-2); - } -#else /* SSHBUILTIN */ -#ifdef SSHCMD - x = nettype; - if ((y = setlin(XXSSH,0,1)) < 0) { - if (errno) - printf("?%s\n",ck_errstr()); - else -#ifdef COMMENT - /* This isn't right either because it catches command editing */ - printf("?Sorry, pseudoterminal open failed\n"); - if (hints) - printf("Hint: Try \"ssh -t %s\"\n",line); -#else - return(y); -#endif /* COMMENT */ - nettype = x; /* Failed, restore net type. */ - ttnproto = z; /* and protocol */ - success = 0; - } - didsetlin++; - netsave = x; - return(y); -#endif /* SSHCMD */ -#endif /* SSHBUILTIN */ - } -#endif /* ANYSSH */ - -#ifdef SSHBUILTIN - if (cx == XXSKRM) { /* SKERMIT (Secure Shell Kermit) */ - extern int netsave; - int k, x, havehost = 0, trips = 0; - int tmpver = -1, tmpxfw = -1; -#ifndef SSHTEST - extern int sl_ssh_xfw, sl_ssh_xfw_saved; - extern int sl_ssh_ver, sl_ssh_ver_saved; -#endif /* SSHTEST */ - extern int mdmtyp, mdmsav, cxtype, sl_uid_saved; - extern char * slmsg; - extern char uidbuf[], sl_uidbuf[]; - extern char pwbuf[], * g_pswd; - extern int pwflg, pwcrypt, g_pflg, g_pcpt, nolocal; - struct FDB sw, kw, fl; - - if (ssh_tmpstr) - memset(ssh_tmpstr,0,strlen(ssh_tmpstr)); - makestr(&ssh_tmpstr,NULL); - makestr(&ssh_tmpuid,NULL); - makestr(&ssh_tmpcmd,NULL); - makestr(&ssh_tmpport,NULL); - - cmfdbi(&kw, /* 1st FDB - commands */ - _CMKEY, /* fcode */ - "host [ port ],\n or action", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nsshkermit, /* addtl numeric data 1: tbl size */ - 0, /* addtl numeric data 2: 0 = keyword */ - xxstring, /* Processing function */ - sshkermit, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* Host */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - - x = cmfdb(&kw); - if (x == -3) { - printf("?skermit what?\n"); - return(-9); - } - if (x < 0) - return(x); - havehost = 0; - if (cmresult.fcode == _CMFLD) { - havehost = 1; - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Hostname */ - cmresult.nresult = SKRM_OPN; - } - switch (cmresult.nresult) { /* SSH keyword */ - case SKRM_OPN: /* SSH OPEN */ - if (!havehost) { - if ((x = cmfld("Host","",&s,xxstring)) < 0) - return(x); - ckstrncpy(line,s,LINBUFSIZ); - } - /* Parse [ port ] [ switches ] */ - cmfdbi(&kw, /* Switches */ - _CMKEY, - "Port number or service name,\nor switch", - "", - "", - nsshkrmopnsw, - 4, - xxstring, - sshkrmopnsw, - &fl - ); - cmfdbi(&fl, /* Port number or service name */ - _CMFLD, - "", - "", - "", - 0, - 0, - xxstring, - NULL, - NULL - ); - trips = 0; /* Explained below */ - while (1) { /* Parse port and switches */ - x = cmfdb(&kw); /* Get a field */ - if (x == -3) /* User typed CR so quit from loop */ - break; - if (x < 0) /* Other parse error, pass it back */ - return(x); - switch (cmresult.fcode) { /* Field or Keyword? */ - case _CMFLD: /* Field */ - makestr(&ssh_tmpport,cmresult.sresult); - break; - case _CMKEY: /* Keyword */ - switch (cmresult.nresult) { /* Which one? */ - case SSHSW_USR: /* /USER: */ - if (!cmgbrk()) { - printf("?This switch requires an argument\n"); - return(-9); - } - if ((y = cmfld("Username","",&s,xxstring)) < 0) - return(y); - s = brstrip(s); - makestr(&ssh_tmpuid,s); - break; - case SSHSW_PWD: - if (!cmgbrk()) { - printf("?This switch requires an argument\n"); - return(-9); - } - debok = 0; - if ((x = cmfld("Password","",&s,xxstring)) < 0) { - if (x == -3) { - makestr(&ssh_tmpstr,""); - } else { - return(x); - } - } else { - s = brstrip(s); - if ((x = (int)strlen(s)) > PWBUFL) { - makestr(&slmsg,"Internal error"); - printf("?Sorry, too long - max = %d\n",PWBUFL); - return(-9); - } - makestr(&ssh_tmpstr,s); - } - break; - - case SSHSW_VER: - if ((x = cmnum("Number","",10,&z,xxstring)) < 0) - return(x); - if (z < 1 || z > 2) { - printf("?Out of range: %d\n",z); - return(-9); - } - tmpver = z; - break; - default: - return(-2); - } - } - if (trips++ == 0) { /* After first time through */ - cmfdbi(&kw, /* only parse switches, not port. */ - _CMKEY, - "Switch", - "", - "", - nsshkrmopnsw, - 4, - xxstring, - sshkrmopnsw, - NULL - ); - } - } - if ((x = cmcfm()) < 0) /* Get confirmation */ - return(x); - if (clskconnx(1) < 0) { /* Close current Kermit connection */ - if ( ssh_tmpstr ) { - memset(ssh_tmpstr,0,strlen(ssh_tmpstr)); - makestr(&ssh_tmpstr,NULL); - } - return(success = 0); - } - makestr(&ssh_hst,line); /* Stash everything */ - if (ssh_tmpuid) { - if (!sl_uid_saved) { - ckstrncpy(sl_uidbuf,uidbuf,UIDBUFLEN); - sl_uid_saved = 1; - } - ckstrncpy(uidbuf,ssh_tmpuid,UIDBUFLEN); - makestr(&ssh_tmpuid,NULL); - } - if (ssh_tmpport) { - makestr(&ssh_prt,ssh_tmpport); - makestr(&ssh_tmpport,NULL); - } else - makestr(&ssh_prt,NULL); - - /* Set the Subsystem to Kermit */ - ssh_cas = 1; - makestr(&ssh_cmd,"kermit"); - - if (tmpver > -1) { -#ifndef SSHTEST - if (!sl_ssh_ver_saved) { - sl_ssh_ver = ssh_ver; - sl_ssh_ver_saved = 1; - } -#endif /* SSHTEST */ - ssh_ver = tmpver; - } - /* Disable X11 Forwarding */ -#ifndef SSHTEST - if (!sl_ssh_xfw_saved) { - sl_ssh_xfw = ssh_xfw; - sl_ssh_xfw_saved = 1; - } -#endif /* SSHTEST */ - ssh_xfw = 0; - - if (ssh_tmpstr) { - if (ssh_tmpstr[0]) { - ckstrncpy(pwbuf,ssh_tmpstr,PWBUFL+1); - pwflg = 1; - pwcrypt = 0; - } else - pwflg = 0; - makestr(&ssh_tmpstr,NULL); - } - nettype = NET_SSH; - if (mdmsav < 0) - mdmsav = mdmtyp; - mdmtyp = -nettype; - x = 1; - -#ifndef NOSPL - makestr(&g_pswd,pwbuf); /* Save global pwbuf */ - g_pflg = pwflg; /* and flag */ - g_pcpt = pwcrypt; -#endif /* NOSPL */ - - /* Line parameter to ttopen() is ignored */ - k = ttopen(line,&x,mdmtyp, 0); - if (k < 0) { - printf("?Unable to connect to %s\n",ssh_hst); - mdmtyp = mdmsav; - slrestor(); - return(success = 0); - } - duplex = 0; /* Remote echo */ - ckstrncpy(ttname,line,TTNAMLEN); /* Record the command */ - debug(F110,"ssh ttname",ttname,0); - makestr(&slmsg,NULL); /* No SET LINE error message */ - cxtype = CXT_SSH; -#ifndef NODIAL - dialsta = DIA_UNK; -#endif /* NODIAL */ - success = 1; /* SET LINE succeeded */ - network = 1; /* Network connection (not serial) */ - local = 1; /* Local mode (not remote) */ - if ((reliable != SET_OFF || !setreliable)) - reliable = SET_ON; /* Transport is reliable end to end */ -#ifdef OS2 - DialerSend(OPT_KERMIT_CONNECT, 0); -#endif /* OS2 */ - setflow(); /* Set appropriate flow control */ - - haveline = 1; -#ifdef CKLOGDIAL -#ifdef NETCONN - dolognet(); -#endif /* NETCONN */ -#endif /* CKLOGDIAL */ - -#ifndef NOSPL - if (local) { - if (nmac) { /* Any macros defined? */ - int k; /* Yes */ - k = mlook(mactab,"on_open",nmac); /* Look this up */ - if (k >= 0) { /* If found, */ - if (dodo(k,ssh_hst,0) > -1) /* set it up, */ - parser(1); /* and execute it */ - } - } - } -#endif /* NOSPL */ -#ifdef LOCUS - if (autolocus) - setlocus(1,1); -#endif /* LOCUS */ - - /* Command was confirmed so we can pre-pop command level. */ - /* This is so CONNECT module won't think we're executing a */ - /* script if CONNECT was the final command in the script. */ - if (cmdlvl > 0) - prepop(); - return(success = 1); - - default: - return(-2); - } - } -#endif /* SSHBUILTIN */ - -#ifdef SFTP_BUILTIN - if (cx == XXSFTP) { /* SFTP (Secure Shell File Transfer) */ - extern int netsave; - int k, x, havehost = 0, trips = 0; - int tmpver = -1, tmpxfw = -1; -#ifndef SSHTEST - extern int sl_ssh_xfw, sl_ssh_xfw_saved; - extern int sl_ssh_ver, sl_ssh_ver_saved; -#endif /* SSHTEST */ - extern int mdmtyp, mdmsav, cxtype, sl_uid_saved; - extern char * slmsg; - extern char uidbuf[], sl_uidbuf[]; - extern char pwbuf[], * g_pswd; - extern int pwflg, pwcrypt, g_pflg, g_pcpt, nolocal; - struct FDB sw, kw, fl; - - if (ssh_tmpstr) - memset(ssh_tmpstr,0,strlen(ssh_tmpstr)); - makestr(&ssh_tmpstr,NULL); - makestr(&ssh_tmpuid,NULL); - makestr(&ssh_tmpcmd,NULL); - makestr(&ssh_tmpport,NULL); - - cmfdbi(&kw, /* 1st FDB - commands */ - _CMKEY, /* fcode */ - "host [ port ],\n or action", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nsftpkwtab, /* addtl numeric data 1: tbl size */ - 0, /* addtl numeric data 2: 0 = keyword */ - xxstring, /* Processing function */ - sftpkwtab, /* Keyword table */ - &fl /* Pointer to next FDB */ - ); - cmfdbi(&fl, /* Host */ - _CMFLD, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - - x = cmfdb(&kw); - if (x == -3) { - printf("?sftp what?\n"); - return(-9); - } - if (x < 0) - return(x); - havehost = 0; - if (cmresult.fcode == _CMFLD) { - havehost = 1; - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Hostname */ - cmresult.nresult = SFTP_OPN; - } - switch (cmresult.nresult) { /* SFTP keyword */ - case SFTP_OPN: /* SFTP OPEN */ - if (!havehost) { - if ((x = cmfld("Host","",&s,xxstring)) < 0) - return(x); - ckstrncpy(line,s,LINBUFSIZ); - } - /* Parse [ port ] [ switches ] */ - cmfdbi(&kw, /* Switches */ - _CMKEY, - "Port number or service name,\nor switch", - "", - "", - nsshkrmopnsw, - 4, - xxstring, - sshkrmopnsw, - &fl - ); - cmfdbi(&fl, /* Port number or service name */ - _CMFLD, - "", - "", - "", - 0, - 0, - xxstring, - NULL, - NULL - ); - trips = 0; /* Explained below */ - while (1) { /* Parse port and switches */ - x = cmfdb(&kw); /* Get a field */ - if (x == -3) /* User typed CR so quit from loop */ - break; - if (x < 0) /* Other parse error, pass it back */ - return(x); - switch (cmresult.fcode) { /* Field or Keyword? */ - case _CMFLD: /* Field */ - makestr(&ssh_tmpport,cmresult.sresult); - break; - case _CMKEY: /* Keyword */ - switch (cmresult.nresult) { /* Which one? */ - case SSHSW_USR: /* /USER: */ - if (!cmgbrk()) { - printf("?This switch requires an argument\n"); - return(-9); - } - if ((y = cmfld("Username","",&s,xxstring)) < 0) - return(y); - s = brstrip(s); - makestr(&ssh_tmpuid,s); - break; - case SSHSW_PWD: - if (!cmgbrk()) { - printf("?This switch requires an argument\n"); - return(-9); - } - debok = 0; - if ((x = cmfld("Password","",&s,xxstring)) < 0) { - if (x == -3) { - makestr(&ssh_tmpstr,""); - } else { - return(x); - } - } else { - s = brstrip(s); - if ((x = (int)strlen(s)) > PWBUFL) { - makestr(&slmsg,"Internal error"); - printf("?Sorry, too long - max = %d\n",PWBUFL); - return(-9); - } - makestr(&ssh_tmpstr,s); - } - break; - - case SSHSW_VER: - if ((x = cmnum("Number","",10,&z,xxstring)) < 0) - return(x); - if (z < 1 || z > 2) { - printf("?Out of range: %d\n",z); - return(-9); - } - tmpver = z; - break; - default: - return(-2); - } - } - if (trips++ == 0) { /* After first time through */ - cmfdbi(&kw, /* only parse switches, not port. */ - _CMKEY, - "Switch", - "", - "", - nsshkrmopnsw, - 4, - xxstring, - sshkrmopnsw, - NULL - ); - } - } - if ((x = cmcfm()) < 0) /* Get confirmation */ - return(x); - if (clskconnx(1) < 0) { /* Close current Kermit connection */ - if ( ssh_tmpstr ) { - memset(ssh_tmpstr,0,strlen(ssh_tmpstr)); - makestr(&ssh_tmpstr,NULL); - } - return(success = 0); - } - makestr(&ssh_hst,line); /* Stash everything */ - if (ssh_tmpuid) { - if (!sl_uid_saved) { - ckstrncpy(sl_uidbuf,uidbuf,UIDBUFLEN); - sl_uid_saved = 1; - } - ckstrncpy(uidbuf,ssh_tmpuid,UIDBUFLEN); - makestr(&ssh_tmpuid,NULL); - } - if (ssh_tmpport) { - makestr(&ssh_prt,ssh_tmpport); - makestr(&ssh_tmpport,NULL); - } else - makestr(&ssh_prt,NULL); - - /* Set the Subsystem to Kermit */ - ssh_cas = 1; - makestr(&ssh_cmd,"sftp"); - - if (tmpver > -1) { -#ifndef SSHTEST - if (!sl_ssh_ver_saved) { - sl_ssh_ver = ssh_ver; - sl_ssh_ver_saved = 1; - } -#endif /* SSHTEST */ - ssh_ver = tmpver; - } - /* Disable X11 Forwarding */ -#ifndef SSHTEST - if (!sl_ssh_xfw_saved) { - sl_ssh_xfw = ssh_xfw; - sl_ssh_xfw_saved = 1; - } -#endif /* SSHTEST */ - ssh_xfw = 0; - - if (ssh_tmpstr) { - if (ssh_tmpstr[0]) { - ckstrncpy(pwbuf,ssh_tmpstr,PWBUFL+1); - pwflg = 1; - pwcrypt = 0; - } else - pwflg = 0; - makestr(&ssh_tmpstr,NULL); - } - nettype = NET_SSH; - if (mdmsav < 0) - mdmsav = mdmtyp; - mdmtyp = -nettype; - x = 1; - -#ifndef NOSPL - makestr(&g_pswd,pwbuf); /* Save global pwbuf */ - g_pflg = pwflg; /* and flag */ - g_pcpt = pwcrypt; -#endif /* NOSPL */ - - /* Line parameter to ttopen() is ignored */ - k = ttopen(line,&x,mdmtyp, 0); - if (k < 0) { - printf("?Unable to connect to %s\n",ssh_hst); - mdmtyp = mdmsav; - slrestor(); - return(success = 0); - } - duplex = 0; /* Remote echo */ - ckstrncpy(ttname,line,TTNAMLEN); /* Record the command */ - debug(F110,"ssh ttname",ttname,0); - makestr(&slmsg,NULL); /* No SET LINE error message */ - cxtype = CXT_SSH; -#ifndef NODIAL - dialsta = DIA_UNK; -#endif /* NODIAL */ - success = 1; /* SET LINE succeeded */ - network = 1; /* Network connection (not serial) */ - local = 1; /* Local mode (not remote) */ - if ((reliable != SET_OFF || !setreliable)) - reliable = SET_ON; /* Transport is reliable end to end */ -#ifdef OS2 - DialerSend(OPT_KERMIT_CONNECT, 0); -#endif /* OS2 */ - setflow(); /* Set appropriate flow control */ - - haveline = 1; -#ifdef CKLOGDIAL -#ifdef NETCONN - dolognet(); -#endif /* NETCONN */ -#endif /* CKLOGDIAL */ - -#ifndef NOSPL - if (local) { - if (nmac) { /* Any macros defined? */ - int k; /* Yes */ - k = mlook(mactab,"on_open",nmac); /* Look this up */ - if (k >= 0) { /* If found, */ - if (dodo(k,ssh_hst,0) > -1) /* set it up, */ - parser(1); /* and execute it */ - } - } - } -#endif /* NOSPL */ -#ifdef LOCUS - if (autolocus) - setlocus(1,1); -#endif /* LOCUS */ - - /* Command was confirmed so we can pre-pop command level. */ - /* This is so CONNECT module won't think we're executing a */ - /* script if CONNECT was the final command in the script. */ - if (cmdlvl > 0) - prepop(); - - success = sftp_do_init(); - return(success = 1); - - case SFTP_CD: - case SFTP_CHGRP: - case SFTP_CHMOD: - case SFTP_CHOWN: - case SFTP_RM: - case SFTP_DIR: - case SFTP_GET: - case SFTP_MKDIR: - case SFTP_PUT: - case SFTP_PWD: - case SFTP_REN: - case SFTP_RMDIR: - case SFTP_LINK: - case SFTP_VER: - if ((y = cmtxt("command parameters","",&s,xxstring)) < 0) - return(y); - if (ssh_tchk() < 0 || !ssh_cas || strcmp(ssh_cmd,"sftp")) { - printf("?Not connected to SFTP Service\n"); - return(success = 0); - } - success = sftp_do_cmd(cmresult.nresult,s); - return(success); - default: - return(-2); - } - } -#endif /* SFTP_BUILTIN */ - - if (cx == XXRLOG) { /* RLOGIN */ -#ifdef RLOGCODE - int x,z; -#ifdef OS2 - if (!tcp_avail) { - printf("?Sorry, either TCP/IP is not available on this system or\n\ -necessary DLLs did not load. Use SHOW NETWORK to check network status.\n" - ); - success = 0; - return(-9); - } else { -#endif /* OS2 */ - x = nettype; /* Save net type in case of failure */ - z = ttnproto; /* Save protocol in case of failure */ - nettype = NET_TCPB; - ttnproto = NP_RLOGIN; - if ((y = setlin(XYHOST,0,1)) <= 0) { - nettype = x; /* Failed, restore net type. */ - ttnproto = z; /* and protocol */ - success = 0; - } - didsetlin++; -#ifdef OS2 - } -#endif /* OS2 */ - return(y); -#else - printf("?Sorry, RLOGIN is not configured in this copy of C-Kermit.\n"); - return(-9); -#endif /* RLOGCODE */ - } -#endif /* NETCONN */ -#endif /* NOLOCAL */ - -#ifndef NOXMIT - if (cx == XXTRA) { /* TRANSMIT */ - extern int xfrxla; - int i, n, xpipe = 0, xbinary = 0, xxlate = 1, xxnowait = 0, getval; - int xxecho = 0; - int scan = 1; - char c; - struct FDB sf, sw, tx; /* FDBs for parse functions */ -#ifndef NOCSETS - extern int tcs_transp; /* Term charset is transparent */ -#else - int tcs_transp = 1; -#endif /* NOCSETS */ - -#ifdef COMMENT - xbinary = binary; /* Default text/binary mode */ -#else - xbinary = 0; /* Default is text */ -#endif /* COMMENT */ - xxecho = xmitx; - - cmfdbi(&sw, /* First FDB - command switches */ - _CMKEY, /* fcode */ - "Filename, or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - nxmitsw, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - xmitsw, /* Keyword table */ - &sf /* Pointer to next FDB */ - ); - cmfdbi(&sf, /* 2nd FDB - file to send */ - _CMIFI, /* fcode */ - "File to transmit", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, -#ifdef PIPESEND - &tx -#else - NULL -#endif /* PIPESEND */ - ); -#ifdef PIPESEND - cmfdbi(&tx, - _CMTXT, /* fcode */ - "Command", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); -#endif /* PIPESEND */ - - while (1) { - x = cmfdb(&sw); - if (x < 0) - return(x); - if (cmresult.fcode != _CMKEY) - break; - c = cmgbrk(); /* Have switch, get break character */ - if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - n = cmresult.nresult; /* Numeric result = switch ID */ - switch (n) { /* Process the switch */ -#ifdef PIPESEND - case XMI_CMD: /* Transmit from a command */ - if (nopush) { - printf("?Sorry, system command access is disabled\n"); - return(-9); - } - sw.hlpmsg = "Command, or switch"; /* Change help message */ - xpipe = 1; /* (No way to undo this one) */ - break; -#endif /* PIPESEND */ - - case XMI_BIN: /* Binary */ - xbinary = 1; - xxlate = 0; /* Don't translate charsets */ - scan = 0; - break; - - case XMI_TXT: /* Text */ - xbinary = 0; - xxlate = !tcs_transp; /* Translate if TERM CHAR not TRANSP */ - scan = 0; - break; - - case XMI_TRA: /* Transparent text */ - xbinary = 0; - xxlate = 0; /* But don't translate charsets */ - scan = 0; - break; - -#ifdef COMMENT - case XMI_VRB: /* /VERBOSE */ - case XMI_QUI: /* /QUIET */ - break; /* (not implemented yet) */ -#endif /* COMMENT */ - - case XMI_NOW: /* /NOWAIT */ - xxnowait = 1; - break; - - case XMI_NOE: /* /NOWAIT */ - xxecho = 0; - break; - - default: - return(-2); - } - - } - if (cmresult.fcode != _CMIFI && cmresult.fcode != _CMTXT) - return(-2); - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Filename */ - if (zfnqfp(line,TMPBUFSIZ,tmpbuf)) - ckstrncpy(line,tmpbuf,LINBUFSIZ); - s = line; - if ((y = cmcfm()) < 0) /* Confirm */ - return(y); -#ifdef CK_APC - if ((apcactive == APC_LOCAL) || - ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH)))) - return(success = 0); -#endif /* CK_APC */ - if (cmresult.nresult != 0) { - printf("?Only a single file may be transmitted\n"); - return(-9); - } -#ifdef PIPESEND - if (xpipe) { - s = brstrip(s); - if (!*s) { - printf("?Sorry, a command to send from is required\n"); - return(-9); - } - pipesend = 1; - } -#endif /* PIPESEND */ - - if (scan && (filepeek -#ifndef NOXFER - || patterns -#endif /* NOXFER */ - )) { /* If user didn't specify type */ - int k, x; /* scan the file to see */ - x = -1; - k = scanfile(s,&x,nscanfile); - if (k > 0) xbinary = (k == FT_BIN) ? XYFT_B : XYFT_T; - } - if (!xfrxla) xxlate = 0; - success = transmit(s, - (char) (xxnowait ? '\0' : (char)xmitp), - xxlate, - xbinary, - xxecho - ); - return(success); - } -#endif /* NOXMIT */ - -#ifndef NOFRILLS - if (cx == XXTYP || cx == XXCAT || cx == XXMORE || - cx == XXHEAD || cx == XXTAIL) { - int paging = 0, havename = 0, head = 0, width = 0; - int height = 0, count = 0; - char pfxbuf[64], * prefix = NULL; - char outfile[CKMAXPATH+1]; - struct FDB sf, sw; - char * pat = NULL; - int incs = 0, outcs = 0, cset = -1, number = 0; -#ifdef UNICODE - char * tocs = ""; - extern int fileorder; -#ifdef OS2 -#ifdef NT - char guibuf[128], * gui_title = NULL; - int gui = 0; -#endif /* NT */ -#ifndef NOCSETS - extern int tcsr, tcsl; -#endif /* NOCSETS */ -#endif /* OS2 */ -#endif /* UNICODE */ - - outfile[0] = NUL; - - if (cx == XXMORE) - paging = 1; - else if (cx == XXCAT) - paging = 0; - else - paging = (typ_page < 0) ? xaskmore : typ_page; - if (paging < 0) - paging = saveask; - - if (cx == XXHEAD) { - head = 10; - cx = XXTYP; - } else if (cx == XXTAIL) { - head = -10; - cx = XXTYP; - } - -#ifdef IKSD - if (inserver && !ENABLED(en_typ)) { - printf("?Sorry, TYPE command disabled\n"); - return(-9); - } -#endif /* IKSD */ - - cmfdbi(&sw, /* 2nd FDB - optional /PAGE switch */ - _CMKEY, /* fcode */ - "Filename or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - ntypetab, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - typetab, /* Keyword table */ - &sf /* Pointer to next FDB */ - ); - cmfdbi(&sf, /* 1st FDB - file to type */ - _CMIFI, /* fcode */ - "", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 0, /* addtl numeric data 1 */ - 0, /* addtl numeric data 2 */ - xxstring, - NULL, - NULL - ); - - while (!havename) { - x = cmfdb(&sw); /* Parse something */ - debug(F101,"type cmfdb","",x); - debug(F101,"type cmresult.fcode","",cmresult.fcode); - debug(F101,"type cmresult.nresult","",cmresult.nresult); - if (x < 0) { /* Error */ - if (x == -3) { - x = -9; - printf("?Filename required\n"); - } - return(x); - } else if (cmresult.fcode == _CMKEY) { - char c; int getval; - c = cmgbrk(); - getval = (c == ':' || c == '='); - if (getval && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } -#ifdef COMMENT - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - /* Not if it has a default! */ - return(-9); - } -#endif /* COMMENT */ - switch (cmresult.nresult) { -#ifdef CK_TTGWSIZ - case TYP_PAG: - paging = 1; - break; - - case TYP_NOP: - paging = 0; - break; -#endif /* CK_TTGWSIZ */ - - case TYP_COU: - paging = 0; - count = 1; - break; - - case TYP_HEA: - case TYP_TAI: - y = 10; - if (getval) - if ((x = cmnum("Number of lines", - "10",10,&y,xxstring)) < 0) - return(x); - head = (cmresult.nresult == TYP_TAI) ? -y : y; - break; - - case TYP_WID: - y = typ_wid > -1 ? typ_wid : cmd_cols; - if (getval) - if ((x = cmnum("Column at which to truncate", - ckitoa(y),10,&y,xxstring)) < 0) - return(x); - width = y; - break; - -#ifdef KUI - case TYP_HIG: - if (getval) - if ((x = cmnum("Height of GUI dialog", - ckitoa(y),10,&y,xxstring)) < 0) - return(x); - height = y; - break; -#endif /* KUI */ - - case TYP_PAT: - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - if ((x = cmfld("pattern","",&s,xxstring)) < 0) - return(x); - ckstrncpy(tmpbuf,s,TMPBUFSIZ); - pat = tmpbuf; - break; - - case TYP_PFX: - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - if ((x = cmfld("prefix for each line","",&s,xxstring)) < 0) - return(x); - if ((int)strlen(s) > 63) { - printf("?Too long - 63 max\n"); - return(-9); - } - ckstrncpy(pfxbuf,s,64); - prefix = brstrip(pfxbuf); - number = 0; - break; - -#ifdef KUI - case TYP_GUI: - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - if ((x = cmfld("Dialog box title","",&s,xxstring)) < 0) { - if (x != -3) - return(x); - } else { - if ((int)strlen(s) > 127) { - printf("?Too long - 127 max\n"); - return(-9); - } - ckstrncpy(guibuf,s,128); - gui_title = brstrip(guibuf); - } - gui = 1; - break; -#endif /* KUI */ - - case TYP_NUM: /* /NUMBER */ - number = 1; - prefix = NULL; - break; - -#ifdef UNICODE - case TYP_XPA: /* /TRANSPARENT */ - incs = 0; - cset = 0; - outcs = -1; - break; - - case TYP_XIN: /* /CHARACTER-SET: */ - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } - if ((incs = cmkey(fcstab,nfilc, - "character-set name","",xxstring)) < 0) { - if (incs == -3) /* Note: No default */ - incs = -2; - return(incs); - } - cset = incs; - break; - - case TYP_XUT: /* /TRANSLATE-TO: */ - if (!getval && (cmgkwflgs() & CM_ARG)) { - printf("?This switch requires an argument\n"); - return(-9); - } -#ifdef OS2 - if (!inserver && !k95stdout) { - tocs = "ucs2"; - } else { -#ifdef CKOUNI - tocs = rlookup(txrtab,ntxrtab,tcsl); -#else /* CKOUNI */ - extern struct keytab ttcstab[]; - extern int ntxrtab; - tocs = rlookup(ttcstab,ntermc,tocs); - if (!tocs) - tocs = getdcset(); -#endif /* CKOUNI */ - } -#else /* OS2 */ - tocs = getdcset(); -#endif /* OS2 */ - if ((outcs = cmkey(fcstab,nfilc, - "character-set",tocs,xxstring)) < 0) - return(outcs); - break; -#endif /* UNICODE */ - case TYP_OUT: - if ((x = cmofi("File for result lines","", - &s,xxstring)) < 0) - return(x); - ckstrncpy(outfile,s,CKMAXPATH); - break; - } - } else if (cmresult.fcode == _CMIFI) - havename = 1; - else - return(-2); - } - if (havename) { - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); - y = cmresult.nresult; - } else { - if ((x = cmifi("Filename","",&s,&y,xxstring)) < 0) { - if (x == -3) { - printf("?Name of an existing file required\n"); - return(-9); - } else return(x); - } - ckstrncpy(line,s,LINBUFSIZ); - } - if (y != 0) { - printf("?A single file please\n"); - return(-9); - } -#ifdef KUI - if ( outfile[0] && gui ) { - printf("?/GUI and /OUTPUT are incompatible\n"); - return(-9); - } -#endif /* KUI */ - - if ((y = cmcfm()) < 0) /* Confirm the command */ - return(y); - -#ifdef UNICODE - fileorder = -1; - if (cset < 0 && filepeek) { /* If no charset switches given */ - int k, x = -1; - k = scanfile(line,&x,nscanfile); /* Call file analyzer */ - debug(F111,"type scanfile",line,k); - debug(F101,"type scanfile flag","",x); - switch(k) { - case FT_UTF8: /* which can detect UTF-8... */ - cset = 0; - incs = FC_UTF8; - break; - case FT_UCS2: /* and UCS-2... */ - cset = 0; - incs = FC_UCS2; - fileorder = x; /* even if there is no BOM. */ - debug(F101,"type fileorder","",fileorder); - break; - } - } -#ifdef OS2 - if (cset < 0) { /* If input charset still not known */ -#ifdef CKOUNI - tocs = rlookup(txrtab,ntxrtab,tcsl); -#else /* CKOUNI */ - extern struct keytab ttcstab[]; - extern int ntxrtab; - tocs = rlookup(ttcstab,ntermc,incs); - if (!tocs) - tocs = getdcset(); -#endif /* CKOUNI */ - incs = lookup(fcstab,tocs,nfilc,&x); - } -#endif /* OS2 */ - - if (outcs == 0 && incs != 0) { /* Supply default target charset */ - int x = 0; /* if switch not given. */ - tocs = getdcset(); - outcs = lookup(fcstab,tocs,nfilc,&x); - } -#else /* !UNICODE */ - if (cset < 0) incs = outcs = 0; -#endif /* UNICODE */ - - if (outfile[0] && paging) /* This combination makes no sense */ - paging = 0; /* so turn off paging */ - -#ifdef KUI - /* No paging when dialog is used */ - if ( gui && paging ) - paging = 0; - - if ( !gui && height ) { - printf("?The /HEIGHT switch is not supported without /GUI\n"); - return(-9); - } -#endif /* KUI */ - - if (count) paging = -1; - debug(F111,"type",line,paging); -#ifdef KUI - if ( gui ) { - s = (char *)1; /* ok, its an ugly hack */ - if (gui_text_popup_create(gui_title ? - gui_title : line, height,width) < 0) { - printf("?/GUI not supported on this system\n"); - gui = 0; - return(-9); - } - width = 0; - } else -#endif /* KUI */ - s = outfile; - success = - dotype(line,paging,0,head,pat,width,prefix,incs,outcs,s,number); - return(success); - } -#endif /* NOFRILLS */ - -#ifndef NOCSETS - if (cx == XXXLA) { /* TRANSLATE file's charset */ - _PROTOTYP (int doxlate, ( void ) ); - return(doxlate()); - } -#endif /* NOCSETS */ - - if (cx == XXVER) { /* VERSION */ - int n = 0; - extern char * ck_patch, * ck_s_test; -#ifdef COMMENT - extern int hmtopline; -#endif /* COMMENT */ - if ((y = cmcfm()) < 0) - return(y); - - printf("\n%s, for%s\n Numeric: %ld",versio,ckxsys,vernum); - printf("\n\n"); - printf("Authors:\n"); - printf(" Frank da Cruz, Columbia University\n"); - printf(" Jeffrey Eric Altman, Secure Endpoints, Inc. %s\n", - "" - ); - printf(" Contributions from many others.\n"); - n = 7; - if (*ck_s_test) { - printf("\nTHIS IS A TEST VERSION, NOT FOR PRODUCTION USE.\n"); - n += 2; - } - if (*ck_patch) { - printf(" Patches: %s\n", ck_patch); - n++; - } - printf(" Type COPYRIGHT for copyright and license.\n\n"); -#ifdef OS2 - shoreg(); -#else -#ifdef COMMENT - hmtopline = n+1; - hmsga(copyright); - hmtopline = 0; -#endif /* COMMENT */ -#endif /* OS2 */ - return(success = 1); - } - - if (cx == XXCPR) { /* COPYRIGHT or LICENSE */ - if ((y = cmcfm()) < 0) - return(y); -#ifdef OS2 - if (inserver) { /* Free WIKSD */ - extern char * wiksdcpr[]; - hmsga(wiksdcpr); - } else -#endif /* OS2 */ - hmsga(copyright); - return(success = 1); - } - -#ifndef MAC /* Only for multiuser systems */ -#ifndef OS2 -#ifndef NOFRILLS - if (cx == XXWHO) { /* WHO */ - char *wc; -#ifdef IKSD - if (inserver && !ENABLED(en_who)) { - printf("?Sorry, WHO command disabled\n"); - return(-9); - } -#endif /* IKSD */ -#ifdef datageneral - if ((z = cmcfm()) < 0) return(z); - if (nopush) { - printf("?Sorry, who not allowed\n"); - return(success = 0); - } - xsystem(WHOCMD); -#else - if ((y = cmtxt("user name","",&s,xxstring)) < 0) return(y); - if (nopush) { - printf("?Sorry, WHO command disabled\n"); - return(success = 0); - } - if (!(wc = getenv("CK_WHO"))) wc = WHOCMD; - if (wc) - if ((int) strlen(wc) > 0) { - ckmakmsg(line,LINBUFSIZ,wc," ",s,NULL); - xsystem(line); - } -#endif /* datageneral */ - return(success = 1); - } -#endif /* NOFRILLS */ -#endif /* OS2 */ -#endif /* MAC */ - -#ifndef NOFRILLS - if (cx == XXWRI || cx == XXWRL || cx == XXWRBL) { /* WRITE */ - int x,y; /* On stack in case of \fexec() */ - if ((x = cmkey(writab,nwri,"to file or log","",xxstring)) < 0) { - if (x == -3) printf("?Write to what?\n"); - return(x); - } - if ((y = cmtxt("text","",&s,xxstring)) < 0) return(y); - s = brstrip(s); - switch (x) { - case LOGD: y = ZDFILE; break; - case LOGP: y = ZPFILE; break; -#ifndef NOLOCAL - case LOGS: y = ZSFILE; break; -#endif /* NOLOCAL */ - case LOGT: y = ZTFILE; break; -#ifndef NOSPL - case LOGW: y = ZWFILE; break; -#endif /* NOSPL */ - case LOGX: /* SCREEN (stdout) */ - case LOGE: /* ERROR (stderr) */ - if (x == LOGE) { - debug(F110, - (cx == XXWRL) ? "WRITELN ERROR" : "WRITE ERROR", s,0); - fprintf(stderr,"%s%s",s,(cx == XXWRL) ? "\n" : ""); - } else { - debug(F110, - (cx == XXWRL) ? "WRITELN SCREEN" : "WRITE SCREEN", s,0); - printf("%s%s",s,(cx == XXWRL) ? "\n" : ""); - } - return(success = 1); - default: return(-2); - } - if (chkfn(y) > 0) { - x = (cx == XXWRI) ? zsout(y,s) : zsoutl(y,s); - if (x < 0) printf("?Write error\n"); - } else { - x = -1; - printf("?File or log not open\n"); - } - return(success = (x == 0) ? 1 : 0); - } -#endif /* NOFRILLS */ - -#ifndef NOXFER - if (cx == XXASC || cx == XXBIN) { - if ((x = cmcfm()) < 0) return(x); -#ifdef NEWFTP - if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) - return(success = doftptyp((cx == XXASC) ? 0 : 1)); -#endif /* NEWFTP */ - binary = (cx == XXASC) ? XYFT_T : XYFT_B; - return(success = 1); - } -#endif /* NOXFER */ - - if (cx == XXCLS) { - if ((x = cmcfm()) < 0) return(x); - y = ck_cls(); - return(success = (y > -1) ? 1 : 0); - } - -#ifdef CK_MKDIR - if (cx == XXMKDIR || cx == XXLMKD) { - char *p; -#ifdef LOCUS - if (!locus && cx != XXLMKD) { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZMKD)); -#endif /* NOXFER */ - } -#endif /* LOCUS */ -#ifdef IKSD - if (inserver && !ENABLED(en_mkd)) { - printf("?Sorry, directory creation is disabled\n"); - return(-9); - } -#endif /* IKSD */ - if ((x = cmfld("Name for new directory","",&s,xxstring)) < 0) { - if (x != -3) { - return(x); - } else { - printf("?Directory name required\n"); - return(-9); - } - } - ckstrncpy(line,s,LINBUFSIZ); - s = line; - if ((x = cmcfm()) < 0) return(x); - s = brstrip(s); - bgchk(); /* Set msgflg */ - x = ckmkdir(0,s,&p,msgflg,0); -#ifdef COMMENT - if (msgflg && x == 0) - printf("?Directory already exists\n"); -#endif /* COMMENT */ - return(success = (x < 0) ? 0 : 1); - } - if (cx == XXRMDIR || cx == XXLRMD) { /* RMDIR */ - char *p; -#ifdef LOCUS - if (!locus && cx != XXLRMD) { -#ifdef NOXFER - return(-2); -#else - return(dormt(XZRMD)); -#endif /* NOXFER */ - } -#endif /* LOCUS */ -#ifdef IKSD - if (inserver && !ENABLED(en_rmd)) { - printf("?Sorry, directory removal is disabled\n"); - return(-9); - } -#endif /* IKSD */ - if ((x = cmdir("Name of directory to be removed","",&s,xxstring)) < 0) - return(x); - ckstrncpy(line,s,LINBUFSIZ); - s = line; - if ((x = cmcfm()) < 0) return(x); - s = brstrip(s); - x = ckmkdir(1,s,&p,msgflg,0); - return(success = (x < 0) ? 0 : 1); - } -#endif /* CK_MKDIR */ - -#ifdef TNCODE - if (cx == XXTELOP) - return(dotelopt()); -#endif /* TNCODE */ - -#ifndef NOPUSH - if (cx == XXNPSH) { - if ((z = cmcfm()) < 0) return(z); - nopush = 1; -#ifndef NOSERVER - en_hos = 0; -#endif /* NOSERVER */ -#ifdef PIPESEND - usepipes = 0; -#endif /* PIPESEND */ - return(success = 1); - } -#endif /* NOPUSH */ - -#ifdef OS2 - if (cx == XXNSCR) { - if ((z = cmcfm()) < 0) return(z); - tt_scroll = 0; - return(success = 1); - } -#endif /* OS2 */ - -#ifndef NOSPL - if (cx == XXLOCAL) /* LOCAL variable declarations */ - return(success = dolocal()); -#endif /* NOSPL */ - - if (cx == XXKERMI) { /* The KERMIT command */ - char * list[65]; - extern char **xargv; - extern int xargc; - int i; - if ((y = cmtxt("kermit command-line arguments, -h for help", - "",&s,xxstring)) < 0) - return(y); - ckstrncpy(line,"kermit ",LINBUFSIZ); - ckstrncat(line,s,LINBUFSIZ-8); - xwords(line,64,list,0); - for (i = 1; i < 64; i++) { - if (!list[i]) - break; - } - i--; - xargc = i; - xargv = list; - xargv++; - sstate = cmdlin(); - if (sstate) { - extern int justone; - debug(F000,"KERMIT sstate","",sstate); - justone = 1; /* Force return to command mode */ - proto(); /* after protocol */ - return(success); - } else { - debug(F101,"KERMIT sstate","",sstate); - return(success = 1); /* Not exactly right, but... */ - } - } - if (cx == XXDATE) { /* DATE command */ - extern char cmdatebuf[], * cmdatemsg; - -#ifndef COMMENT - char * dp; - if ((y = cmtxt("date and/or time, or carriage return for current", - "",&s,xxstring)) < 0) - return(y); - s = brstrip(s); - dp = cmcvtdate(s,1); - if (!dp) { - printf("?%s\n",cmdatemsg ? cmdatemsg : "Date conversion error"); - success = 0; - } else { - printf("%s\n",dp); - success = 1; - } -#else - /* This works fine but messes up my "dates" torture-test script */ - - if ((x = cmdate("Date and/or time, or carriage return for current", - "",&s,0,xxstring)) < 0) { - return(x); - } else { - printf("%s\n",cmdatebuf); - success = 1; - } -#endif /* COMMENT */ - return(success); - } -#ifndef NOPUSH -#ifndef NOFRILLS - if (cx == XXEDIT) - return(doedit()); -#endif /* NOFRILLS */ -#endif /* NOPUSH */ - -#ifdef BROWSER /* Defined only ifndef NOPUSH */ - if (cx == XXBROWS) - return(dobrowse()); -#endif /* BROWSER */ - -#ifdef CK_TAPI - if (cx == XXTAPI) { /* Microsoft TAPI */ - return (success = dotapi()); - } -#endif /* CK_TAPI */ - -#ifndef NOXFER - if (cx == XXWHERE) { - extern char * rfspec, * sfspec, * srfspec, * rrfspec; - if ((x = cmcfm()) < 0) return(x); - printf("\nFile most recently...\n\n"); - printf(" Sent: %s\n", sfspec ? sfspec : "(none)"); - if (sfspec && srfspec) { - printf(" Stored as: %s\n", srfspec); - printf("\n"); - } - printf(" Received: %s\n", rrfspec ? rrfspec : "(none)"); - if (rfspec && rrfspec) - printf(" Stored as: %s\n", rfspec); - printf( -"\nIf the full path is not shown, then the file is probably in your current\n" - ); - printf( -"directory or your download directory (if any - SHOW FILE to find out).\n\n" - ); - return(success = 1); - } -#endif /* NOXFER */ - -#ifdef CK_RECALL - if (cx == XXREDO) - return(doredo()); -#endif /* CK_RECALL */ - -#ifdef CKROOT - if (cx == XXCHRT) /* Change Kermit's root directory */ - return(dochroot()); -#endif /* CKROOT */ - -#ifdef CK_KERBEROS - if (cx == XXAUTH) { /* KERBEROS */ - x = cp_auth(); /* Parse it */ -#ifdef IKSD - if (inserver) { - printf("?Command disabled in IKSD.\r\n"); - return(success = 0); - } -#endif /* IKSD */ - if (x < 0) /* Pass parse errors back */ - return(x); - return(success = doauth(cx)); - } -#endif /* CK_KERBEROS */ - -#ifndef NOLOCAL - if (cx == XXTERM) { - return(settrmtyp()); - } -#endif /* NOLOCAL */ - - if (cx == XXSTATUS) { - if ((x = cmcfm()) < 0) return(x); - printf( " %s\n", success ? "SUCCESS" : "FAILURE" ); - return(0); /* Don't change it */ - } - - if (cx == XXFAIL) { - if ((x = cmcfm()) < 0) return(x); - return(success = 0); - } - - if (cx == XXSUCC) { - if ((x = cmcfm()) < 0) return(x); - return(success = 1); - } - - if (cx == XXNLCL) { - extern int nolocal; - if ((x = cmcfm()) < 0) return(x); - nolocal = 1; - return(success = 1); - } - -#ifndef NOXFER - if (cx == XXRASG) /* Shortcuts for REMOTE commands */ - return(dormt(XZASG)); - if (cx == XXRCWD) - return(dormt(XZCWD)); - if (cx == XXRCPY) - return(dormt(XZCPY)); - if (cx == XXRDEL) - return(dormt(XZDEL)); - if (cx == XXRDIR) - return(dormt(XZDIR)); - if (cx == XXRXIT) - return(dormt(XZXIT)); - if (cx == XXRHLP) - return(dormt(XZHLP)); - if (cx == XXRHOS) - return(dormt(XZHOS)); - if (cx == XXRKER) - return(dormt(XZKER)); - if (cx == XXRPWD) - return(dormt(XZPWD)); - if (cx == XXRQUE) - return(dormt(XZQUE)); - if (cx == XXRREN) - return(dormt(XZREN)); - if (cx == XXRMKD) - return(dormt(XZMKD)); - if (cx == XXRRMD) - return(dormt(XZRMD)); - if (cx == XXRSET) - return(dormt(XZSET)); - if (cx == XXRSPA) - return(dormt(XZSPA)); - if (cx == XXRTYP) - return(dormt(XZTYP)); - if (cx == XXRWHO) - return(dormt(XZWHO)); - if (cx == XXRCDUP) - return(dormt(XZCDU)); - if (cx == XXRPRI) - return(dormt(XZPRI)); -#endif /* NOXFER */ - - if (cx == XXRESET) { /* RESET */ - if ((x = cmcfm()) < 0) - return(x); - doclean(0); /* Close all files */ - return(success = 1); - } - -#ifndef NOXFER -#ifndef NOCSETS - if (cx == XXASSOC) /* ASSOCIATE */ - return(doassoc()); -#endif /* NOCSETS */ -#endif /* NOXFER */ - -#ifndef NOSPL - if (cx == XXSHIFT) { /* SHIFT */ - if ((y = cmnum("Number of arguments to shift","1",10,&x,xxstring)) < 0) - return(y); - if ((z = cmcfm()) < 0) - return(z); - return(success = doshift(x)); - } -#endif /* NOSPL */ - -#ifndef NOHELP - if (cx == XXMAN) - return(domanual()); -#endif /* NOHELP */ - -#ifndef NOSPL - if (cx == XXSORT) /* SORT an array */ - return(dosort()); -#endif /* NOSPL */ - - if (cx == XXPURGE) { -#ifdef IKSD - if (inserver && (!ENABLED(en_del) -#ifdef CK_LOGIN - || isguest -#endif /* CK_LOGIN */ - )) { - printf("?Sorry, DELETE is disabled\n"); - return(-9); - } -#endif /* IKSD */ -#ifdef CK_APC - if ((apcactive == APC_LOCAL) || - ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH)))) - return(success = 0); -#endif /* CK_APC */ -#ifdef CKPURGE - return(dopurge()); -#else -#ifdef VMS - if ((x = cmtxt("optional switches followed by filespec", - "",&s,xxstring)) < 0) - return(x); - if (nopush) { - printf("?Sorry, DCL access is disabled\n"); - return(-9); - } - ckstrncpy(line,s,LINBUFSIZ); - s = line; - x = mlook(mactab,"purge",nmac); - return(success = dodo(x,s,cmdstk[cmdlvl].ccflgs)); -#else - return(-2); -#endif /* VMS */ -#endif /* CKPURGE */ - } - -#ifndef NOSPL - if (cx == XXFAST) { - if ((x = cmcfm()) < 0) return(x); - x = mlook(mactab,"fast",nmac); - return(success = dodo(x,NULL,cmdstk[cmdlvl].ccflgs)); - } - if (cx == XXCAU) { - if ((x = cmcfm()) < 0) return(x); - x = mlook(mactab,"cautious",nmac); - return(success = dodo(x,NULL,cmdstk[cmdlvl].ccflgs)); - } - if (cx == XXROB) { - if ((x = cmcfm()) < 0) return(x); - x = mlook(mactab,"robust",nmac); - return(success = dodo(x,NULL,cmdstk[cmdlvl].ccflgs)); - } -#endif /* NOSPL */ - - if (cx == XXSCRN) { /* SCREEN */ - int row, col; - if ((x = cmkey(scntab, nscntab,"screen action","", xxstring)) < 0) - return(x); - switch (x) { /* MOVE-TO (cursor position) */ - case SCN_MOV: - if ((y = cmnum("Row (1-based)","",10,&z,xxstring)) < 0) - return(y); - row = z; - y = cmnum("Column (1-based)","1",10,&z,xxstring); - if (y < 0) - return(y); - col = z; - if ((y = cmcfm()) < 0) - return(y); - if (row < 0 || col < 0) { - printf("?Row and Column must be 1 or greater\n"); - return(-9); - } - if (cmd_rows > 0 && row > cmd_rows) - row = cmd_rows; - if (cmd_cols > 0 && col > cmd_cols) - col = cmd_cols; - y = ck_curpos(row,col); - return(success = (y > -1) ? 1 : 0); - - case SCN_CLR: /* CLEAR */ - if ((y = cmcfm()) < 0) - return(y); - debug(F100,"screen calling ck_cls()","",0); - y = ck_cls(); - return(success = (y > -1) ? 1 : 0); - - case SCN_CLE: /* CLEOL */ - if ((y = cmcfm()) < 0) - return(y); - y = ck_cleol(); - return(success = (y > -1) ? 1 : 0); - } - } - -#ifndef NOHTTP -#ifdef TCPSOCKET - if (cx == XXHTTP) - return(dohttp()); -#endif /* TCPSOCKET */ -#endif /* NOHTTP */ - -#ifndef NOSPL - if (cx == XXARRAY) { /* ARRAY */ -#ifndef NOSHOW - extern int showarray(); -#endif /* NOSHOW */ - if ((x = cmkey(arraytab, narraytab,"Array operation","",xxstring)) < 0) - return(x); - switch (x) { - case ARR_DCL: - return(dodcl(XXDCL)); - case ARR_SRT: - return(dosort()); -#ifndef NOSHOW - case ARR_SHO: - return(showarray()); -#endif /* NOSHOW */ - case ARR_CPY: - return(copyarray()); - case ARR_SET: - case ARR_CLR: - return(clrarray(x)); - case ARR_DST: - return(unarray()); - case ARR_RSZ: - return(rszarray()); - case ARR_EQU: - return(linkarray()); - - default: - printf("?Sorry, not implemented yet - \"%s\"\n",cmdbuf); - return(-9); - } - } - if (cx == XXTRACE) - return(dotrace()); -#endif /* NOSPL */ - -#ifdef CK_PERMS -#ifdef UNIX - if (cx == XXCHMOD) - return(douchmod()); /* Do Unix chmod */ -#endif /* UNIX */ -#endif /* CK_PERMS */ - - if (cx == XXPROMP) - return(doprompt()); - - if (cx == XXGREP) - return(dogrep()); - - if (cx == XXDEBUG) { /* DEBUG */ -#ifndef DEBUG - int dummy = 0; - return(seton(&dummy)); -#else - return(seton(&deblog)); -#endif /* DEBUG */ - } - -#ifdef CKLEARN - if (cx == XXLEARN) { /* LEARN */ - struct FDB of, sw, cm; - int closing = 0, off = 0, on = 0, confirmed = 0; - char c; - - cmfdbi(&sw, /* 2nd FDB - optional /PAGE switch */ - _CMKEY, /* fcode */ - "Script file name, or switch", /* hlpmsg */ - "", /* default */ - "", /* addtl string data */ - 3, /* addtl numeric data 1: tbl size */ - 4, /* addtl numeric data 2: 4 = cmswi */ - xxstring, /* Processing function */ - learnswi, /* Keyword table */ - &of /* Pointer to next FDB */ - ); - cmfdbi(&of,_CMOFI,"","","",0,0,xxstring,NULL,&cm); - cmfdbi(&cm,_CMCFM,"","","",0,0,NULL,NULL,NULL); - line[0] = NUL; - - while (!confirmed) { - x = cmfdb(&sw); /* Parse something */ - if (x < 0) - return(x); - switch (cmresult.fcode) { /* What was it? */ - case _CMOFI: /* Output file name */ - ckstrncpy(line,cmresult.sresult,LINBUFSIZ); - break; - case _CMKEY: /* Switch */ - c = cmgbrk(); - if ((c == ':' || c == '=') && !(cmgkwflgs() & CM_ARG)) { - printf("?This switch does not take an argument\n"); - return(-9); - } - switch (cmresult.nresult) { - case 2: /* /CLOSE */ - closing = 1; /* Fall thru on purpose */ - case 0: /* /OFF */ - off = 1; - on = 0; - break; - case 1: /* /ON */ - on = 1; - off = 0; - break; - } - break; - case _CMCFM: /* Confirmation */ - confirmed++; - break; - } - } - if (closing) { - if (learnfp) { - fclose(learnfp); - learnfp = NULL; - } - makestr(&learnfile,NULL); - } - if (line[0]) { - if (!on && !off) - on = 1; - if (learnfp) { - fclose(learnfp); - learnfp = NULL; - } - makestr(&learnfile,line); - if (learnfile) { - char * modes = "w"; - learnfp = fopen(learnfile,modes); - if (!learnfp) { - debug(F110,"LEARN file open error",learnfile,0); - perror(learnfile); - return(-9); - } else { -#ifdef ZFNQFP - if (zfnqfp(learnfile,TMPBUFSIZ,tmpbuf)) - makestr(&learnfile,tmpbuf); -#endif /* ZFNQFP */ - debug(F110,"LEARN file open ok",learnfile,0); - if (!quiet) { - printf("Recording to %s...\n\n",learnfile); - printf( -" WARNING: If you type your password during script recording, it will appear\n\ - in the file. Be sure to edit it or take other appropriate precautions.\n\n" - ); - } - fputs( "; Scriptfile: ",learnfp); - fputs(learnfile,learnfp); - fputs("\n; Directory: ",learnfp); - fputs(zgtdir(),learnfp); - fputs("\n; Recorded: ",learnfp); - fputs(ckdate(),learnfp); - fputs("\n",learnfp); - } - } - } - if (on) { - learning = 1; - } else if (off) { - learning = 0; - } - debug(F101,"LEARN learning","",learning); - return(success = 1); - } -#endif /* CKLEARN */ - -#ifdef NEWFTP - if (cx == XXUSER || cx == XXACCT) { - if (!ftpisopen()) { - printf("?FTP connection is not open\n"); - return(-9); - } - return(success = (cx == XXUSER) ? doftpusr() : doftpacct()); - } - if (cx == XXSITE || cx == XXPASV) { - if (!ftpisopen()) { - printf("?FTP connection is not open\n"); - return(-9); - } - return(success = (cx == XXSITE) ? doftpsite() : dosetftppsv()); - } -#endif /* NEWFTP */ - - if (cx == XXORIE) { /* ORIENTATION */ - extern char * myname; - int i, y, n = 0; - char * s, *p, vbuf[32]; - char * vars[16]; char * legend[16]; - - if ((y = cmcfm()) < 0) - return(y); - - printf("\nProgram name:\n %s\n\n",myname); - n += 4; - -#ifdef NT - vars[0] = "home"; legend[0] = "Your home directory"; - vars[1] = "directory"; legend[1] = "K95's current directory"; - vars[2] = "exedir"; legend[2] = "K95 Program directory"; - vars[3] = "inidir"; legend[3] = "K95 Initialization file directory"; - vars[4] = "startup"; legend[4] = "Current directory when started"; - - vars[5] = "common"; - legend[5] = "K95 data for all users and K95SITE.INI file"; - - vars[6] = "personal"; legend[6] = "Your personal data directory tree"; - vars[7] = "desktop"; legend[7] = "Your deskop directory tree"; - - vars[8] = "appdata"; - legend[8] = "Your personal K95 data tree and K95CUSTOM.INI file"; - - vars[9] = "download"; legend[9] = "Your K95 download directory"; - vars[10] = "tmpdir"; legend[10] = "Your TEMP directory"; - vars[11] = NULL; legend[11] = NULL; - - for (i = 0; i < 16 && vars[i]; i++) { - printf("%s:\n",legend[i]); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - ckmakmsg(vbuf,32,"\\v(",vars[i],")",NULL); - printf(" Variable: %s\n",vbuf); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - y = TMPBUFSIZ; - s = tmpbuf; - zzstring(vbuf,&s,&y); - line[0] = NUL; - ckGetLongPathName(tmpbuf,line,LINBUFSIZ); - printf(" Long name: %s\n",line); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - line[0] = NUL; - GetShortPathName(tmpbuf,line,LINBUFSIZ); - printf(" Short name: %s\n",line); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - printf("\n"); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - } -#else /* NT */ - - vars[0] = "home"; legend[0] = "Your home directory"; - vars[1] = "directory"; legend[1] = "Kermit's current directory"; - vars[2] = "exedir"; legend[2] = "Kermit's program directory"; - vars[3] = "inidir"; legend[3] = "Initialization file directory"; - vars[4] = "startup"; legend[4] = "Current directory when started"; - vars[5] = "download"; legend[5] = "Kermit download directory"; - vars[6] = NULL; legend[6] = NULL; - - for (i = 0; i < 16 && vars[i]; i++) { - printf("%s:\n",legend[i]); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - ckmakmsg(vbuf,32,"\\v(",vars[i],")",NULL); - printf(" Variable: %s\n",vbuf); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - y = TMPBUFSIZ; - s = tmpbuf; - zzstring(vbuf,&s,&y); - printf(" Value: %s\n",tmpbuf); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - printf("\n"); - if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0; - } -#endif /* NT */ - return(success = 1); - } - -#ifdef NT - if (cx == XXDIALER) { - StartDialer(); - return(success = 1); - } -#endif /* NT */ - - if (cx == XXCONT) { /* CONTINUE */ - if ((x = cmcfm()) < 0) - return(x); - if (!xcmdsrc) { /* At prompt: continue script */ - if (cmdlvl > 0) - popclvl(); /* Pop command level */ - return(success = 1); /* always succeeds */ -#ifndef NOSPL - } else { /* In script: whatever... */ - x = mlook(mactab,"continue",nmac); - /* Don't set success */ - return(dodo(x,NULL,cmdstk[cmdlvl].ccflgs)); -#endif /* NOSPL */ - } - } - if (cx == XXNOTAV) { /* Command in table not available */ - ckstrncpy(tmpbuf,atmbuf,TMPBUFSIZ); - if ((x = cmtxt("Rest of command","",&s,NULL)) < 0) - return(x); - printf("Sorry, \"%s\" not configured in this version of Kermit.\n", - tmpbuf - ); - return(success = 0); - } - return(-2); /* None of the above */ - -} /* end of docmd() */ - -#endif /* NOICP */ diff --git a/.pc/applied-patches b/.pc/applied-patches index d705a33..4220079 100644 --- a/.pc/applied-patches +++ b/.pc/applied-patches @@ -1,3 +1,2 @@ 010_makefile-destdir-support.patch 020_man-hyphen-quoting.patch -030_fix-if-else.patch diff --git a/ckuus6.c b/ckuus6.c index a5abf19..5dcd828 100644 --- a/ckuus6.c +++ b/ckuus6.c @@ -6607,7 +6607,7 @@ doelse() { if (!iftest[cmdlvl]) { /* If IF was false do ELSE part */ if (maclvl > -1 || tlevel > -1) { /* In macro or command file */ debug(F100,"doelse pushing","",0); -#ifndef COMMENT +#ifdef COMMENT pushcmd(NULL); /* save rest of command. */ #else /* This fixes certain obscure problems */ diff --git a/ckuusr.c b/ckuusr.c index 882c0d4..8545f89 100644 --- a/ckuusr.c +++ b/ckuusr.c @@ -7983,7 +7983,8 @@ docmd(cx) int cx; { line[k++] = SP; line[k] = NUL; debug(F111,"XXMACRO A",line,k); - if ((y = cmtxt("Braced list of commands","",&s,xxstring)) < 0) + /* Defer evaluation of variables until the commands are exec'd */ + if ((y = cmtxt("Braced list of commands","",&s,NULL)) < 0) return(y); k = ckstrncpy(line+k,s,LINBUFSIZ-k); debug(F111,"XXMACRO B",line,k);