ftp (from BSDi, circa FreeBSD 2.0)

https://www.gno.org/svn/gno/trunk/usr.bin/ftp/
This commit is contained in:
Kelvin Sherlock 2012-07-09 22:56:12 -04:00
parent dc8ac93eeb
commit 07cac015d4
22 changed files with 7793 additions and 0 deletions

17
bin/ftp/Makefile Normal file
View File

@ -0,0 +1,17 @@
# $Id: Makefile 478 1998-02-17 02:44:05Z gdr $
PROG= ftp
MAIN= main
SRCS= main.c cmdtab.c domacro.c ruserpass.c ftp.c glob.c cmds.c ftp_var.c
HAS_BSD_MANPAGE = true # use ftp.1G rather than ftp.1
STACK= 2048
LDADD= -lnetdb
DEBUG= 25
.INCLUDE: /src/gno/prog.mk
#%.o : %.c
# $(CC) -o $@ $(CFLAGS) $(__OFLAG) -c $<
# @gsh -c ${mktmp cd $(OBJ_DIR); nameobj -p $@}

2028
bin/ftp/cmds.c Normal file

File diff suppressed because it is too large Load Diff

74
bin/ftp/cmds.h Normal file
View File

@ -0,0 +1,74 @@
int another (int *pargc, char ***pargv, char *prompt);
void changetype (int newtype, int show);
void setbinary (int argc, char **argv);
void setascii (int argc, char **argv);
void settenex (int argc, char **argv);
int getit (int argc, char **argv, int restartit, char *mode);
char *remglob (char **argv, int doswitch);
char *onoff (int bool);
void setbell (int argc, char **argv);
void settrace (int argc, char **argv);
void sethash (int argc, char **argv);
void setverbose (int argc, char **argv);
void setport (int argc, char **argv);
void setprompt (int argc, char **argv);
void setglob (int argc, char **argv);
void mabort (int sig, int code);
void pwd (int argc, char **argv);
void quote1 (char *initial, int argc, char **argv);
void quit (int argc, char **argv);
void disconnect (int argc, char **argv);
int confirm (char *cmd, char *file);
void fatal (char *msg);
int globulize (char *cpp[]);
void proxabort (int sig, int code);
void setcase (int argc, char **argv);
void setcr (int argc, char **argv);
char *dotrans (char *name);
char *domap (char *name);
void setsunique (int argc, char **argv);
void setrunique (int argc, char **argv);
void cdup (int argc, char **argv);
void syst (int argc, char **argv);
void ftpsetdebug (int argc, char **argv);
void setpeer (int argc, char **argv);
void settype (int argc, char **argv);
void ftpsetmode (int argc, char **argv);
void setform (int argc, char **argv);
void setstruct (int argc, char **argv);
void put (int argc, char **argv);
void mput (int argc, char **argv);
void reget (int argc, char **argv);
void get (int argc, char **argv);
void mget (int argc, char **argv);
void status (int argc, char **argv);
void cd (int argc, char **argv);
void lcd (int argc, char **argv);
void delete (int argc, char **argv);
void mdelete (int argc, char **argv);
void renamefile (int argc, char **argv);
void ls (int argc, char **argv);
void mls (int argc, char **argv);
void shell (int argc, char **argv);
void user (int argc, char **argv);
void makedir (int argc, char **argv);
void removedir (int argc, char **argv);
void quote (int argc, char **argv);
void site (int argc, char **argv);
void do_chmod (int argc, char **argv);
void do_umask (int argc, char **argv);
void idle (int argc, char **argv);
void rmthelp (int argc, char **argv);
void account (int argc, char **argv);
void doproxy (int argc, char **argv);
void setntrans (int argc, char **argv);
void setnmap (int argc, char **argv);
void restart (int argc, char **argv);
void macdef (int argc, char **argv);
void sizecmd (int argc, char **argv);
void modtime (int argc, char **argv);
void rmtstatus (int argc, char **argv);
void newer (int argc, char **argv);
void reset (int argc, char **argv);

156
bin/ftp/cmdtab.c Normal file
View File

@ -0,0 +1,156 @@
#ifdef __ORCAC__
segment "ftpmain ";
#endif
static char sccsid[] = "@(#)cmdtab.c 5.10 (Berkeley) 6/1/90";
#include "ftp.var.h"
#include "cmds.h"
#include "main.h"
#include "domacro.h"
/*
* User FTP -- Command Tables.
*/
char accounthelp[] = "send account command to remote server";
char appendhelp[] = "append to a file";
char asciihelp[] = "set ascii transfer type";
char beephelp[] = "beep when command completed";
char binaryhelp[] = "set binary transfer type";
char casehelp[] = "toggle mget upper/lower case id mapping";
char cdhelp[] = "change remote working directory";
char cduphelp[] = "change remote working directory to parent directory";
char chmodhelp[] = "change file permissions of remote file";
char connecthelp[] = "connect to remote tftp";
char crhelp[] = "toggle carriage return stripping on ascii gets";
char deletehelp[] = "delete remote file";
char debughelp[] = "toggle/set debugging mode";
char dirhelp[] = "list contents of remote directory";
char disconhelp[] = "terminate ftp session";
char domachelp[] = "execute macro";
char formhelp[] = "set file transfer format";
char globhelp[] = "toggle metacharacter expansion of local file names";
char hashhelp[] = "toggle printing `#' for each buffer transferred";
char helphelp[] = "print local help information";
char idlehelp[] = "get (set) idle timer on remote side";
char lcdhelp[] = "change local working directory";
char lshelp[] = "list contents of remote directory";
char macdefhelp[] = "define a macro";
char mdeletehelp[] = "delete multiple files";
char mdirhelp[] = "list contents of multiple remote directories";
char mgethelp[] = "get multiple files";
char mkdirhelp[] = "make directory on the remote machine";
char mlshelp[] = "list contents of multiple remote directories";
char modtimehelp[] = "show last modification time of remote file";
char modehelp[] = "set file transfer mode";
char mputhelp[] = "send multiple files";
char newerhelp[] = "get file if remote file is newer than local file ";
char nlisthelp[] = "nlist contents of remote directory";
char nmaphelp[] = "set templates for default file name mapping";
char ntranshelp[] = "set translation table for default file name mapping";
char porthelp[] = "toggle use of PORT cmd for each data connection";
char prompthelp[] = "force interactive prompting on multiple commands";
char proxyhelp[] = "issue command on alternate connection";
char pwdhelp[] = "print working directory on remote machine";
char quithelp[] = "terminate ftp session and exit";
char quotehelp[] = "send arbitrary ftp command";
char receivehelp[] = "receive file";
char regethelp[] = "get file restarting at end of local file";
char remotehelp[] = "get help from remote server";
char renamehelp[] = "rename file";
char restarthelp[]= "restart file transfer at bytecount";
char rmdirhelp[] = "remove directory on the remote machine";
char rmtstatushelp[]="show status of remote machine";
char runiquehelp[] = "toggle store unique for local files";
char resethelp[] = "clear queued command replies";
char sendhelp[] = "send one file";
char sitehelp[] = "send site specific command to remote server\n\t\tTry \"rhelp site\" or \"site help\" for more information";
char shellhelp[] = "escape to the shell";
char sizecmdhelp[] = "show size of remote file";
char statushelp[] = "show current status";
char structhelp[] = "set file transfer structure";
char suniquehelp[] = "toggle store unique on remote machine";
char systemhelp[] = "show remote system type";
char tenexhelp[] = "set tenex file transfer type";
char tracehelp[] = "toggle packet tracing";
char typehelp[] = "set file transfer type";
char umaskhelp[] = "get (set) umask on remote side";
char userhelp[] = "send new user information";
char verbosehelp[] = "toggle verbose mode";
struct cmd cmdtab[] = {
{ "!", shellhelp, 0, 0, 0, shell },
{ "$", domachelp, 1, 0, 0, domacro },
{ "account", accounthelp, 0, 1, 1, account},
{ "append", appendhelp, 1, 1, 1, put },
{ "ascii", asciihelp, 0, 1, 1, setascii },
{ "bell", beephelp, 0, 0, 0, setbell },
{ "binary", binaryhelp, 0, 1, 1, setbinary },
{ "bye", quithelp, 0, 0, 0, quit },
{ "case", casehelp, 0, 0, 1, setcase },
{ "cd", cdhelp, 0, 1, 1, cd },
{ "cdup", cduphelp, 0, 1, 1, cdup },
{ "chmod", chmodhelp, 0, 1, 1, do_chmod },
{ "close", disconhelp, 0, 1, 1, disconnect },
{ "cr", crhelp, 0, 0, 0, setcr },
{ "delete", deletehelp, 0, 1, 1, delete },
{ "debug", debughelp, 0, 0, 0, ftpsetdebug },
{ "dir", dirhelp, 1, 1, 1, ls },
{ "disconnect", disconhelp, 0, 1, 1, disconnect },
{ "form", formhelp, 0, 1, 1, setform },
{ "get", receivehelp, 1, 1, 1, get },
{ "glob", globhelp, 0, 0, 0, setglob },
{ "hash", hashhelp, 0, 0, 0, sethash },
{ "help", helphelp, 0, 0, 1, help },
{ "idle", idlehelp, 0, 1, 1, idle },
{ "image", binaryhelp, 0, 1, 1, setbinary },
{ "lcd", lcdhelp, 0, 0, 0, lcd },
{ "ls", lshelp, 1, 1, 1, ls },
{ "macdef", macdefhelp, 0, 0, 0, macdef },
{ "mdelete", mdeletehelp, 1, 1, 1, mdelete },
{ "mdir", mdirhelp, 1, 1, 1, mls },
{ "mget", mgethelp, 1, 1, 1, mget },
{ "mkdir", mkdirhelp, 0, 1, 1, makedir },
{ "mls", mlshelp, 1, 1, 1, mls },
{ "mode", modehelp, 0, 1, 1, ftpsetmode },
{ "modtime", modtimehelp, 0, 1, 1, modtime },
{ "mput", mputhelp, 1, 1, 1, mput },
{ "newer", newerhelp, 1, 1, 1, newer },
{ "nmap", nmaphelp, 0, 0, 1, setnmap },
{ "nlist", nlisthelp, 1, 1, 1, ls },
{ "ntrans", ntranshelp, 0, 0, 1, setntrans },
{ "open", connecthelp, 0, 0, 1, setpeer },
{ "prompt", prompthelp, 0, 0, 0, setprompt },
{ "proxy", proxyhelp, 0, 0, 1, doproxy },
{ "sendport", porthelp, 0, 0, 0, setport },
{ "put", sendhelp, 1, 1, 1, put },
{ "pwd", pwdhelp, 0, 1, 1, pwd },
{ "quit", quithelp, 0, 0, 0, quit },
{ "quote", quotehelp, 1, 1, 1, quote },
{ "recv", receivehelp, 1, 1, 1, get },
{ "reget", regethelp, 1, 1, 1, reget },
{ "rstatus", rmtstatushelp, 0, 1, 1, rmtstatus },
{ "rhelp", remotehelp, 0, 1, 1, rmthelp },
{ "rename", renamehelp, 0, 1, 1, renamefile },
{ "reset", resethelp, 0, 1, 1, reset },
{ "restart", restarthelp, 1, 1, 1, restart },
{ "rmdir", rmdirhelp, 0, 1, 1, removedir },
{ "runique", runiquehelp, 0, 0, 1, setrunique },
{ "send", sendhelp, 1, 1, 1, put },
{ "site", sitehelp, 0, 1, 1, site },
{ "size", sizecmdhelp, 1, 1, 1, sizecmd },
{ "status", statushelp, 0, 0, 1, status },
{ "struct", structhelp, 0, 1, 1, setstruct },
{ "system", systemhelp, 0, 1, 1, syst },
{ "sunique", suniquehelp, 0, 0, 1, setsunique },
{ "tenex", tenexhelp, 0, 1, 1, settenex },
{ "trace", tracehelp, 0, 0, 0, settrace },
{ "type", typehelp, 0, 1, 1, settype },
{ "user", userhelp, 0, 1, 1, user },
{ "umask", umaskhelp, 0, 1, 1, do_umask },
{ "verbose", verbosehelp, 0, 0, 0, setverbose },
{ "?", helphelp, 0, 0, 1, help },
{ 0 },
};
int NCMDS = (sizeof (cmdtab) / sizeof (cmdtab[0])) - 1;

121
bin/ftp/domacro.c Normal file
View File

@ -0,0 +1,121 @@
#ifdef __ORCAC__
segment "ftpmain ";
#endif
static char sccsid[] = "@(#)domacro.c 1.8 (Berkeley) 9/28/90";
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#include <sys/ttychars.h>
#include "ftp.var.h"
#include "cmds.h"
#include "main.h"
#include "domacro.h"
void domacro (int argc, char **argv)
{
int i, j;
char *cp1, *cp2;
int count = 2, loopflg = 0;
static char line2[200];
struct cmd *c;
if (argc < 2 && !another(&argc, &argv, "macro name")) {
printf("Usage: %s macro_name.\n", argv[0]);
code = -1;
return;
}
for (i = 0; i < macnum; ++i) {
if (!strncmp(argv[1], macros[i].mac_name, 9)) {
break;
}
}
if (i == macnum) {
printf("'%s' macro not found.\n", argv[1]);
code = -1;
return;
}
(void) strcpy(line2, line);
TOP:
cp1 = macros[i].mac_start;
while (cp1 != macros[i].mac_end) {
while (isspace(*cp1)) {
cp1++;
}
cp2 = line;
while (*cp1 != '\0') {
switch(*cp1) {
case '\\':
*cp2++ = *++cp1;
break;
case '$':
if (isdigit(*(cp1+1))) {
j = 0;
while (isdigit(*++cp1)) {
j = 10*j + *cp1 - '0';
}
cp1--;
if (argc - 2 >= j) {
(void) strcpy(cp2, argv[j+1]);
cp2 += strlen(argv[j+1]);
}
break;
}
if (*(cp1+1) == 'i') {
loopflg = 1;
cp1++;
if (count < argc) {
(void) strcpy(cp2, argv[count]);
cp2 += strlen(argv[count]);
}
break;
}
/* intentional drop through */
default:
*cp2++ = *cp1;
break;
}
if (*cp1 != '\0') {
cp1++;
}
}
*cp2 = '\0';
makeargv();
c = getcmd(margv[0]);
if (c == (struct cmd *)-1) {
printf("?Ambiguous command\n");
code = -1;
}
else if (c == 0) {
printf("?Invalid command\n");
code = -1;
}
else if (c->c_conn && !connected) {
printf("Not connected.\n");
code = -1;
}
else {
if (verbose) {
printf("%s\n",line);
}
(*c->c_handler)(margc, margv);
if (bell && c->c_bell) {
(void) putchar('\007');
}
(void) strcpy(line, line2);
makeargv();
argc = margc;
argv = margv;
}
if (cp1 != macros[i].mac_end) {
cp1++;
}
}
if (loopflg && ++count < argc) {
goto TOP;
}
}

1
bin/ftp/domacro.h Normal file
View File

@ -0,0 +1 @@
void domacro (int argc, char **argv);

1136
bin/ftp/ftp.1 Normal file

File diff suppressed because it is too large Load Diff

1042
bin/ftp/ftp.1G Normal file

File diff suppressed because it is too large Load Diff

1405
bin/ftp/ftp.c Normal file

File diff suppressed because it is too large Load Diff

9
bin/ftp/ftp.desc Normal file
View File

@ -0,0 +1,9 @@
Name: ftp
Version: 1.0 (October 1997)
Shell: GNO & GS/TCP
Author: Derek Taubert (from BSDi code)
Contact: taubert@geeks.org
Where: /usr/bin
FTP: ground.icaen.uiowa.edu apple2.caltech.edu ftp.gno.org
File transfer program.

21
bin/ftp/ftp.h Normal file
View File

@ -0,0 +1,21 @@
char *hookup (char *host, int port);
char *getlogin (void);
int login (char *host);
void cmdabort (int sig, int code);
int command (char *string, ...);
int getreply (int expecteof);
int empty (struct fd_set *mask, int sec);
void abortsend (int sig, int code);
void sendrequest (char *cmd, char *local, char *remote, int printnames);
void abortrecv (int sig, int code);
void recvrequest (char *cmd, char *local, char *remote, char *lmode, int printnames);
int initconn (void);
FILE *dataconn (char *lmode);
void ptransfer (char *direction, long bytes, struct timeval *t0, struct timeval *t1);
void tvsub (struct timeval *tdiff, struct timeval *t1, struct timeval *t0);
void psabort (int sig, int code);
void pswitch (int flag);
void abortpt (int sig, int code);
void proxtrans (char *cmd, char *local, char *remote);
char *gunique (char *local);
void abort_remote (FILE *din);

31
bin/ftp/ftp.rez Normal file
View File

@ -0,0 +1,31 @@
/*
* Resources for ftp version and comment
*
* $Id: ftp.rez 395 1998-01-24 08:21:33Z taubert $
*/
#define PROG "ftp"
#define DESC "File transfer program."
#include "Types.rez"
/*
* Version
*/
resource rVersion (1, purgeable3) {
{ 1, 0, 0, /* Version 1.0.0 */
release, /* development|alpha|beta|final|release */
0 }, /* non-final release number */
verUS, /* Country */
PROG, /* Program name */
DESC " Released with GNO/ME and GS/TCP."
};
/*
* Comment
*/
resource rComment (1, purgeable3) {
PROG " v1.0 (October 1997)\n"
"GNO utility: " DESC "\n"
"Ported from BSDi code by Derek Taubert."
};

122
bin/ftp/ftp.var.h Normal file
View File

@ -0,0 +1,122 @@
/*
* Copyright (c) 1985, 1989 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)ftp_var.h 5.9 (Berkeley) 6/1/90
*/
/*
* FTP global variables.
*/
/*
* Options and other state info.
*/
extern int trace; /* trace packets exchanged */
extern int hash; /* print # for each buffer transferred */
extern int sendport; /* use PORT cmd for each data connection */
extern int verbose; /* print messages coming back from server */
extern int connected; /* connected to server */
extern int fromatty; /* input is from a terminal */
extern int interactive; /* interactively prompt on m* cmds */
extern int debug; /* debugging level */
extern int bell; /* ring bell on cmd completion */
extern int doglob; /* glob local file names */
extern int autologin; /* establish user account on connection */
extern int proxy; /* proxy server connection active */
extern int proxflag; /* proxy connection exists */
extern int sunique; /* store files on server with unique name */
extern int runique; /* store local files with unique name */
extern int mcase; /* map upper to lower case for mget names */
extern int ntflag; /* use ntin ntout tables for name translation */
extern int mapflag; /* use mapin mapout templates on file names */
extern int code; /* return/reply code for ftp command */
extern int crflag; /* if 1, strip car. rets. on ascii gets */
extern char pasv[64]; /* passive port for proxy data connection */
extern char *altarg; /* argv[1] with no shell-like preprocessing */
extern char ntin[17]; /* input translation table */
extern char ntout[17]; /* output translation table */
#include <sys/param.h>
extern char mapin[MAXPATHLEN]; /* input map template */
extern char mapout[MAXPATHLEN]; /* output map template */
extern char typename[32]; /* name of file transfer type */
extern int type; /* requested file transfer type */
extern int curtype; /* current file transfer type */
extern char structname[32]; /* name of file transfer structure */
extern int stru; /* file transfer structure */
extern char formname[32]; /* name of file transfer format */
extern int form; /* file transfer format */
extern char modename[32]; /* name of file transfer mode */
extern int mode; /* file transfer mode */
extern char bytename[32]; /* local byte size in ascii */
extern int bytesize; /* local byte size in binary */
extern char *hostname; /* name of host connected to */
extern int unix_server; /* server is unix, can use binary for ascii */
extern int unix_proxy; /* proxy is unix, can use binary for ascii */
extern struct servent *sp; /* service spec for tcp/ftp */
#include <setjmp.h>
extern jmp_buf toplevel; /* non-local goto stuff for cmd scanner */
extern char line[200]; /* input line buffer */
extern char *stringbase; /* current scan point in line buffer */
extern char argbuf[200]; /* argument storage buffer */
extern char *argbase; /* current storage point in arg buffer */
extern int margc; /* count of arguments on input line */
extern char *margv[20]; /* args parsed from input line */
extern int cpend; /* flag: if != 0, then pending server reply */
extern int mflag; /* flag: if != 0, then active multi command */
extern int options; /* used during socket creation */
/*
* Format of command table.
*/
struct cmd {
char *c_name; /* name of command */
char *c_help; /* help string */
char c_bell; /* give bell when command completes */
char c_conn; /* must be connected to use command */
char c_proxy; /* proxy server may execute */
void (*c_handler)(int argc, char **argv); /* function to call */
};
struct macel {
char mac_name[9]; /* macro name */
char *mac_start; /* start of macro in macbuf */
char *mac_end; /* end of macro in macbuf */
};
extern int macnum; /* number of defined macros */
extern struct macel macros[16];
extern char macbuf[4096];

91
bin/ftp/ftp_var.c Normal file
View File

@ -0,0 +1,91 @@
#ifdef __ORCAC__
segment "ftpglobals";
#endif
/*
* FTP global variables.
*/
/*
* Options and other state info.
*/
int trace; /* trace packets exchanged */
int hash; /* print # for each buffer transferred */
int sendport; /* use PORT cmd for each data connection */
int verbose; /* print messages coming back from server */
int connected; /* connected to server */
int fromatty; /* input is from a terminal */
int interactive; /* interactively prompt on m* cmds */
int debug; /* debugging level */
int bell; /* ring bell on cmd completion */
int doglob; /* glob local file names */
int autologin; /* establish user account on connection */
int proxy; /* proxy server connection active */
int proxflag; /* proxy connection exists */
int sunique; /* store files on server with unique name */
int runique; /* store local files with unique name */
int mcase; /* map upper to lower case for mget names */
int ntflag; /* use ntin ntout tables for name translation */
int mapflag; /* use mapin mapout templates on file names */
int code; /* return/reply code for ftp command */
int crflag; /* if 1, strip car. rets. on ascii gets */
char pasv[64]; /* passive port for proxy data connection */
char *altarg; /* argv[1] with no shell-like preprocessing */
char ntin[17]; /* input translation table */
char ntout[17]; /* output translation table */
#include <sys/param.h>
char mapin[MAXPATHLEN]; /* input map template */
char mapout[MAXPATHLEN]; /* output map template */
char typename[32]; /* name of file transfer type */
int type; /* requested file transfer type */
int curtype; /* current file transfer type */
char structname[32]; /* name of file transfer structure */
int stru; /* file transfer structure */
char formname[32]; /* name of file transfer format */
int form; /* file transfer format */
char modename[32]; /* name of file transfer mode */
int mode; /* file transfer mode */
char bytename[32]; /* local byte size in ascii */
int bytesize; /* local byte size in binary */
char *hostname; /* name of host connected to */
int unix_server; /* server is unix, can use binary for ascii */
int unix_proxy; /* proxy is unix, can use binary for ascii */
struct servent *sp; /* service spec for tcp/ftp */
#include <setjmp.h>
jmp_buf toplevel; /* non-local goto stuff for cmd scanner */
char line[200]; /* input line buffer */
char *stringbase; /* current scan point in line buffer */
char argbuf[200]; /* argument storage buffer */
char *argbase; /* current storage point in arg buffer */
int margc; /* count of arguments on input line */
char *margv[20]; /* args parsed from input line */
int cpend; /* flag: if != 0, then pending server reply */
int mflag; /* flag: if != 0, then active multi command */
int options; /* used during socket creation */
/*
* Format of command table.
*/
struct cmd {
char *c_name; /* name of command */
char *c_help; /* help string */
char c_bell; /* give bell when command completes */
char c_conn; /* must be connected to use command */
char c_proxy; /* proxy server may execute */
void (*c_handler)(int argc, char **argv); /* function to call */
};
struct macel {
char mac_name[9]; /* macro name */
char *mac_start; /* start of macro in macbuf */
char *mac_end; /* end of macro in macbuf */
};
int macnum; /* number of defined macros */
struct macel macros[16];
char macbuf[4096];

609
bin/ftp/glob.c Normal file
View File

@ -0,0 +1,609 @@
#ifdef __ORCAC__
segment "ftpmain ";
#endif
static char sccsid[] = "@(#)glob.c 5.9 (Berkeley) 2/25/91";
/*
* C-shell glob for random programs.
*/
#include <sys/param.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ftp.var.h"
#include "cmds.h"
#include "main.h"
#include "domacro.h"
#include "ruserpass.h"
#include "ftp.h"
#include "glob.h"
static void ginit (char **agargv);
static void collect (char *as);
static void acollect (char *as);
static void sort (void);
static void expand (char *as);
static void matchdir (char *pattern);
static int execbrc (char *p, char *s);
static int match (char *s, char *p);
static int amatch (char *s, char *p);
static int Gmatch (char *s, char *p);
static void Gcat (char *s1, char *s2);
static void addpath (char c);
static void rscan (char **t, int (*f)(char));
static int tglob (char c);
static char *strspl (char *cp, char *dp);
static char *strend (char *cp);
#define QUOTE 0200
#define TRIM 0177
#define eq(a,b) (strcmp(a, b)==0)
#define GAVSIZ (NCARGS/6)
#define isdir(d) ((d.st_mode & S_IFMT) == S_IFDIR)
static char **gargv; /* Pointer to the (stack) arglist */
static int gargc; /* Number args in gargv */
static int gnleft;
static short gflag;
char *globerr;
char *home;
extern int errno;
static int globcnt;
char *globchars = "`{[*?";
static char *gpath, *gpathp, *lastgpathp;
static int globbed;
static char *entp;
static char **sortbas;
char **ftpglob (char *v)
{
static char agpath[BUFSIZ];
static char *agargv[GAVSIZ];
char *vv[2];
vv[0] = strspl(v, "");
vv[1] = 0;
gflag = 0;
rscan (vv, tglob);
if (gflag == 0)
return (copyblk(vv));
else
blkfree(vv); /* free what strspl() created */
globerr = 0;
gpath = agpath; gpathp = gpath; *gpathp = 0;
lastgpathp = &gpath[sizeof agpath - 2];
ginit(agargv); globcnt = 0;
collect(v);
if (globcnt == 0 && (gflag&1)) {
blkfree(gargv), gargv = 0;
return (0);
} else
return (gargv = copyblk(gargv));
}
static void ginit (char **agargv)
{
agargv[0] = 0; gargv = agargv; sortbas = agargv; gargc = 0;
gnleft = NCARGS - 4;
}
static void collect (char *as)
{
if (eq(as, "{") || eq(as, "{}")) {
Gcat(as, "");
sort();
} else
acollect(as);
}
static void acollect (char *as)
{
int ogargc;
ogargc = gargc;
gpathp = gpath; *gpathp = 0; globbed = 0;
expand(as);
if (gargc != ogargc)
sort();
}
static void sort (void)
{
char **p1, **p2, *c;
char **Gvp;
Gvp = &gargv[gargc];
p1 = sortbas;
while (p1 < Gvp-1) {
p2 = p1;
while (++p2 < Gvp)
if (strcmp(*p1, *p2) > 0)
c = *p1, *p1 = *p2, *p2 = c;
p1++;
}
sortbas = Gvp;
}
static void expand (char *as)
{
char *cs;
char *sgpathp, *oldcs;
static struct stat stb;
sgpathp = gpathp;
cs = as;
if (*cs == '~' && gpathp == gpath) {
addpath('~');
for (cs++; letter(*cs) || digit(*cs) || *cs == '-';)
addpath(*cs++);
if (!*cs || *cs == '/') {
if (gpathp != gpath + 1) {
*gpathp = 0;
if (gethdir(gpath + 1))
globerr = "Unknown user name after ~";
(void) strcpy(gpath, gpath + 1);
} else
(void) strcpy(gpath, home);
gpathp = strend(gpath);
}
}
while (!any(*cs, globchars)) {
if (*cs == 0) {
if (!globbed)
Gcat(gpath, "");
else if (stat(gpath, &stb) >= 0) {
Gcat(gpath, "");
globcnt++;
}
goto endit;
}
addpath(*cs++);
}
oldcs = cs;
while (cs > as && *cs != '/')
cs--, gpathp--;
if (*cs == '/')
cs++, gpathp++;
*gpathp = 0;
if (*oldcs == '{') {
(void) execbrc(cs, ((char *)0));
return;
}
matchdir(cs);
endit:
gpathp = sgpathp;
*gpathp = 0;
}
static void matchdir (char *pattern)
{
static struct stat stb;
struct dirent *dp;
DIR *dirp;
dirp = opendir(gpath);
if (dirp == NULL) {
if (globbed)
return;
goto patherr2;
}
if (fstat(dirp->dd_fd, &stb) < 0)
goto patherr1;
if (!isdir(stb)) {
errno = ENOTDIR;
goto patherr1;
}
while ((dp = readdir(dirp)) != NULL) {
if (dp->d_ino == 0)
continue;
if (match(dp->d_name, pattern)) {
Gcat(gpath, dp->d_name);
globcnt++;
}
}
closedir(dirp);
return;
patherr1:
closedir(dirp);
patherr2:
globerr = "Bad directory components";
}
static int execbrc (char *p, char *s)
{
static char restbuf[BUFSIZ + 2];
char *pe, *pm, *pl;
int brclev = 0;
char *lm, savec, *sgpathp;
for (lm = restbuf; *p != '{'; *lm++ = *p++)
continue;
for (pe = ++p; *pe; pe++)
switch (*pe) {
case '{':
brclev++;
continue;
case '}':
if (brclev == 0)
goto pend;
brclev--;
continue;
case '[':
for (pe++; *pe && *pe != ']'; pe++)
continue;
continue;
}
pend:
brclev = 0;
for (pl = pm = p; pm <= pe; pm++)
switch (*pm & (QUOTE|TRIM)) {
case '{':
brclev++;
continue;
case '}':
if (brclev) {
brclev--;
continue;
}
goto doit;
case ','|QUOTE:
case ',':
if (brclev)
continue;
doit:
savec = *pm;
*pm = 0;
(void) strcpy(lm, pl);
(void) strcat(restbuf, pe + 1);
*pm = savec;
if (s == 0) {
sgpathp = gpathp;
expand(restbuf);
gpathp = sgpathp;
*gpathp = 0;
} else if (amatch(s, restbuf))
return (1);
sort();
pl = pm + 1;
if (brclev)
return (0);
continue;
case '[':
for (pm++; *pm && *pm != ']'; pm++)
continue;
if (!*pm)
pm--;
continue;
}
if (brclev)
goto doit;
return (0);
}
static int match (char *s, char *p)
{
int c;
char *sentp;
char sglobbed;
sglobbed = globbed;
if (*s == '.' && *p != '.')
return (0);
sentp = entp;
entp = s;
c = amatch(s, p);
entp = sentp;
globbed = sglobbed;
return (c);
}
static int amatch (char *s, char *p)
{
int scc;
int ok, lc;
char *sgpathp;
static struct stat stb;
int c, cc;
globbed = 1;
for (;;) {
scc = *s++ & TRIM;
switch (c = *p++) {
case '{':
return (execbrc(p - 1, s - 1));
case '[':
ok = 0;
lc = 077777;
while (cc = *p++) {
if (cc == ']') {
if (ok)
break;
return (0);
}
if (cc == '-') {
if (lc <= scc && scc <= *p++)
ok++;
} else
if (scc == (lc = cc))
ok++;
}
if (cc == 0)
if (ok)
p--;
else
return 0;
continue;
case '*':
if (!*p)
return (1);
if (*p == '/') {
p++;
goto slash;
}
s--;
do {
if (amatch(s, p))
return (1);
} while (*s++);
return (0);
case 0:
return (scc == 0);
default:
if (c != scc)
return (0);
continue;
case '?':
if (scc == 0)
return (0);
continue;
case '/':
if (scc)
return (0);
slash:
s = entp;
sgpathp = gpathp;
while (*s)
addpath(*s++);
addpath('/');
if (stat(gpath, &stb) == 0 && isdir(stb))
if (*p == 0) {
Gcat(gpath, "");
globcnt++;
} else
expand(p);
gpathp = sgpathp;
*gpathp = 0;
return (0);
}
}
}
static int Gmatch (char *s, char *p)
{
int scc;
int ok, lc;
int c, cc;
for (;;) {
scc = *s++ & TRIM;
switch (c = *p++) {
case '[':
ok = 0;
lc = 077777;
while (cc = *p++) {
if (cc == ']') {
if (ok)
break;
return (0);
}
if (cc == '-') {
if (lc <= scc && scc <= *p++)
ok++;
} else
if (scc == (lc = cc))
ok++;
}
if (cc == 0)
if (ok)
p--;
else
return 0;
continue;
case '*':
if (!*p)
return (1);
for (s--; *s; s++)
if (Gmatch(s, p))
return (1);
return (0);
case 0:
return (scc == 0);
default:
if ((c & TRIM) != scc)
return (0);
continue;
case '?':
if (scc == 0)
return (0);
continue;
}
}
}
static void Gcat (char *s1, char *s2)
{
int len;
len = strlen(s1) + strlen(s2) + 1;
if (len >= gnleft || gargc >= GAVSIZ - 1)
globerr = "Arguments too long";
else {
gargc++;
gnleft -= len;
gargv[gargc] = 0;
gargv[gargc - 1] = strspl(s1, s2);
}
}
static void addpath (char c)
{
if (gpathp >= lastgpathp)
globerr = "Pathname too long";
else {
*gpathp++ = c;
*gpathp = 0;
}
}
static void rscan (char **t, int (*f)(char))
{
char *p, c;
while (p = *t++) {
if (f == tglob)
if (*p == '~')
gflag |= 2;
else if (eq(p, "{") || eq(p, "{}"))
continue;
while (c = *p++)
(*f)(c);
}
}
static int tglob (char c)
{
if (any(c, globchars))
gflag |= c == '{' ? 2 : 1;
return (c);
}
int letter (char c)
{
return (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_');
}
int digit (char c)
{
return (c >= '0' && c <= '9');
}
int any (int c, char *s)
{
while (*s)
if (*s++ == c)
return(1);
return(0);
}
int blklen (char **av)
{
int i;
i = 0;
while (*av++)
i++;
return (i);
}
char **blkcpy (char **oav, char **bv)
{
char **av;
av = oav;
while (*av++ = *bv++)
continue;
return (oav);
}
void blkfree (char **av0)
{
char **av;
av = av0;
while (*av)
free(*av++);
}
static char *strspl (char *cp, char *dp)
{
char *ep;
ep = malloc((unsigned)(strlen(cp) + strlen(dp) + 1));
if (ep == (char *)0)
fatal("Out of memory");
(void) strcpy(ep, cp);
(void) strcat(ep, dp);
return (ep);
}
char **copyblk (char **v)
{
char **nv;
nv = (char **)malloc((unsigned)((blklen(v) + 1) * sizeof(char **)));
if (nv == (char **)0)
fatal("Out of memory");
return (blkcpy(nv, v));
}
static char *strend (char *cp)
{
while (*cp)
cp++;
return (cp);
}
/*
* Extract a home directory from the password file
* The argument points to a buffer where the name of the
* user whose home directory is sought is currently.
* We write the home directory of the user back there.
*/
int gethdir (char *home)
{
struct passwd *pp = getpwnam(home);
if (!pp || home + strlen(pp->pw_dir) >= lastgpathp)
return (1);
(void) strcpy(home, pp->pw_dir);
return (0);
}

9
bin/ftp/glob.h Normal file
View File

@ -0,0 +1,9 @@
char **ftpglob (char *v);
int letter (char c);
int digit (char c);
int any (int c, char *s);
int blklen (char **av);
char **blkcpy (char **oav, char **bv);
void blkfree (char **av0);
char **copyblk (char **v);
int gethdir (char *home);

470
bin/ftp/main.c Normal file
View File

@ -0,0 +1,470 @@
#ifdef __ORCAC__
segment "ftpmain ";
#endif
char copyright[] =
"@(#) Copyright (c) 1985, 1989 Regents of the University of California.\n\
All rights reserved.\n";
static char sccsid[] = "@(#)main.c 5.18 (Berkeley) 3/1/91";
/*
* FTP User Program -- Command Interface.
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/ftp.h>
#include <gno/gno.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <netdb.h>
#include <pwd.h>
#include "ftp.var.h"
#include "ftp.h"
#include "cmds.h"
#include "domacro.h"
#include "main.h"
extern char *home;
int
main (int argc, char **argv)
{
char *cp;
int top;
struct passwd *pw = NULL;
static char homedir[MAXPATHLEN];
sp = getservbyname("ftp", "tcp");
if (sp == 0) {
fprintf(stderr, "ftp: ftp/tcp: unknown service\n");
exit(1);
}
doglob = 1;
interactive = 1;
autologin = 1;
argc--, argv++;
while (argc > 0 && **argv == '-') {
for (cp = *argv + 1; *cp; cp++)
switch (*cp) {
case 'd':
options |= SO_DEBUG;
debug++;
break;
case 'v':
verbose++;
break;
case 't':
trace++;
break;
case 'i':
interactive = 0;
break;
case 'n':
autologin = 0;
break;
case 'g':
doglob = 0;
break;
default:
fprintf(stdout,
"ftp: %c: unknown option\n", *cp);
exit(1);
}
argc--, argv++;
}
fromatty = isatty(fileno(stdin));
if (fromatty)
verbose++;
cpend = 0; /* no pending replies */
proxy = 0; /* proxy not active */
crflag = 1; /* strip c.r. on ascii gets */
sendport = -1; /* not using ports */
/*
* Set up the home directory in case we're globbing.
*/
cp = getlogin();
if (cp != NULL) {
pw = getpwnam(cp);
}
if (pw == NULL)
pw = getpwuid(getuid());
if (pw != NULL) {
home = homedir;
strcpy(home, pw->pw_dir);
}
if (argc > 0) {
if (setjmp(toplevel))
exit(0);
signal(SIGINT, intr);
signal(SIGPIPE, lostpeer);
setpeer(argc + 1, argv - 1);
}
top = setjmp(toplevel) == 0;
if (top) {
signal(SIGINT, intr);
signal(SIGPIPE, lostpeer);
}
for (;;) {
cmdscanner(top);
top = 1;
}
}
#pragma databank 1
void
intr (int sig, int code)
{
longjmp (toplevel, 1);
}
void
lostpeer (int sig, int code)
{
extern FILE *cout;
extern int data;
if (connected) {
if (cout != NULL) {
#ifdef HAVE_SHUTDOWN
shutdown(fileno(cout), 1+1);
#endif
fclose(cout);
cout = NULL;
}
if (data >= 0) {
#ifdef HAVE_SHUTDOWN
shutdown(data, 1+1);
#endif
close(data);
data = -1;
}
connected = 0;
}
pswitch(1);
if (connected) {
if (cout != NULL) {
#ifdef HAVE_SHUTDOWN
shutdown(fileno(cout), 1+1);
#endif
fclose(cout);
cout = NULL;
}
connected = 0;
}
proxflag = 0;
pswitch(0);
}
#pragma databank 0
/*
* Command parser.
*/
int
cmdscanner (int top)
{
struct cmd *c;
int l;
if (!top)
putchar('\n');
for (;;) {
if (fromatty) {
printf("ftp> ");
fflush(stdout);
}
if (fgets(line, 200, stdin) == NULL)
quit(0, NULL);
l = strlen(line);
if (l == 0)
break;
if (line[--l] == '\n') {
if (l == 0)
break;
line[l] = '\0';
} else if (l == sizeof(line) - 2) {
printf("sorry, input line too long\n");
while ((l = getchar()) != '\n' && l != EOF)
/* void */;
break;
} /* else it was a line without a newline */
makeargv();
if (margc == 0) {
continue;
}
c = getcmd(margv[0]);
if (c == (struct cmd *)-1) {
printf("?Ambiguous command\n");
continue;
}
if (c == 0) {
printf("?Invalid command\n");
continue;
}
if (c->c_conn && !connected) {
printf("Not connected.\n");
continue;
}
(*c->c_handler)(margc, margv);
if (bell && c->c_bell)
putchar('\007');
if (c->c_handler != help)
break;
}
signal(SIGINT, intr);
signal(SIGPIPE, lostpeer);
}
struct cmd *
getcmd (char *name)
{
extern struct cmd cmdtab[];
char *p, *q;
struct cmd *c, *found;
int nmatches, longest;
longest = 0;
nmatches = 0;
found = 0;
for (c = cmdtab; p = c->c_name; c++) {
for (q = name; *q == *p++; q++)
if (*q == 0) /* exact match? */
return (c);
if (!*q) { /* the name was a prefix */
if (q - name > longest) {
longest = q - name;
nmatches = 1;
found = c;
} else if (q - name == longest)
nmatches++;
}
}
if (nmatches > 1)
return ((struct cmd *)-1);
return (found);
}
/*
* Slice a string up into argc/argv.
*/
int slrflag;
void
makeargv (void)
{
char **argp;
margc = 0;
argp = margv;
stringbase = line; /* scan from first of buffer */
argbase = argbuf; /* store from first of buffer */
slrflag = 0;
while (*argp++ = slurpstring())
margc++;
}
/*
* Parse string into argbuf;
* implemented with FSM to
* handle quoting and strings
*/
char *
slurpstring (void)
{
int got_one = 0;
char *sb = stringbase;
char *ap = argbase;
char *tmp = argbase; /* will return this if token found */
if (*sb == '!' || *sb == '$') { /* recognize ! as a token for shell */
switch (slrflag) { /* and $ as token for macro invoke */
case 0:
slrflag++;
stringbase++;
return ((*sb == '!') ? "!" : "$");
/* NOTREACHED */
case 1:
slrflag++;
altarg = stringbase;
break;
default:
break;
}
}
S0:
switch (*sb) {
case '\0':
goto OUT;
case ' ':
case '\t':
sb++; goto S0;
default:
switch (slrflag) {
case 0:
slrflag++;
break;
case 1:
slrflag++;
altarg = sb;
break;
default:
break;
}
goto S1;
}
S1:
switch (*sb) {
case ' ':
case '\t':
case '\0':
goto OUT; /* end of token */
case '\\':
sb++; goto S2; /* slurp next character */
case '"':
sb++; goto S3; /* slurp quoted string */
default:
*ap++ = *sb++; /* add character to token */
got_one = 1;
goto S1;
}
S2:
switch (*sb) {
case '\0':
goto OUT;
default:
*ap++ = *sb++;
got_one = 1;
goto S1;
}
S3:
switch (*sb) {
case '\0':
goto OUT;
case '"':
sb++; goto S1;
default:
*ap++ = *sb++;
got_one = 1;
goto S3;
}
OUT:
if (got_one)
*ap++ = '\0';
argbase = ap; /* update storage pointer */
stringbase = sb; /* update scan pointer */
if (got_one) {
return(tmp);
}
switch (slrflag) {
case 0:
slrflag++;
break;
case 1:
slrflag++;
altarg = (char *) 0;
break;
default:
break;
}
return((char *)0);
}
/*
* Help command.
* Call each command handler with argc == 0 and argv[0] == name.
*/
void
help (int argc, char **argv)
{
extern struct cmd cmdtab[];
struct cmd *c;
if (argc == 1) {
int i, j, w, k;
int columns, width = 0, lines;
extern int NCMDS;
printf("Commands may be abbreviated. Commands are:\n\n");
for (c = cmdtab; c < &cmdtab[NCMDS]; c++) {
int len = strlen(c->c_name);
if (len > width)
width = len;
}
width = (width + 8) &~ 7;
columns = 80 / width;
if (columns == 0)
columns = 1;
lines = (NCMDS + columns - 1) / columns;
for (i = 0; i < lines; i++) {
for (j = 0; j < columns; j++) {
c = cmdtab + j * lines + i;
if (c->c_name && (!proxy || c->c_proxy)) {
printf("%s", c->c_name);
}
else if (c->c_name) {
for (k=0; k < strlen(c->c_name); k++) {
putchar(' ');
}
}
if (c + lines >= &cmdtab[NCMDS]) {
printf("\n");
break;
}
w = strlen(c->c_name);
while (w < width) {
w = (w + 8) &~ 7;
putchar('\t');
}
}
}
return;
}
while (--argc > 0) {
char *arg;
arg = *++argv;
c = getcmd(arg);
if (c == (struct cmd *)-1)
printf("?Ambiguous help command %s\n", arg);
else if (c == (struct cmd *)0)
printf("?Invalid help command %s\n", arg);
else
printf("%10s\t%s\n", c->c_name, c->c_help);
}
}

7
bin/ftp/main.h Normal file
View File

@ -0,0 +1,7 @@
void intr (int sig, int code);
void lostpeer (int sig, int code);
int cmdscanner (int top);
struct cmd *getcmd (char *name);
void makeargv (void);
char *slurpstring (void);
void help (int argc, char **argv);

39
bin/ftp/pathnames.h Normal file
View File

@ -0,0 +1,39 @@
/*
* Copyright (c) 1989 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)pathnames.h 5.2 (Berkeley) 6/1/90
*/
#include <paths.h>
#undef _PATH_TMP
#define _PATH_TMP "/tmp/ftpXXXXXX"

252
bin/ftp/ruserpass.c Normal file
View File

@ -0,0 +1,252 @@
#ifdef __ORCAC__
segment "ftpmain ";
#endif
static char sccsid[] = "@(#)ruserpass.c 5.3 (Berkeley) 3/1/91";
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <utmp.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/stat.h>
#include <errno.h>
#include <netdb.h>
#include "ftp.var.h"
#include "cmds.h"
#include "main.h"
#include "domacro.h"
#include "ruserpass.h"
static FILE *cfile;
#define DEFAULT 1
#define LOGIN 2
#define PASSWD 3
#define ACCOUNT 4
#define MACDEF 5
#define ID 10
#define MACH 11
static char tokval[100];
static struct toktab {
char *tokstr;
int tval;
} toktab[]= {
"default", DEFAULT,
"login", LOGIN,
"password", PASSWD,
"passwd", PASSWD,
"account", ACCOUNT,
"machine", MACH,
"macdef", MACDEF,
0, 0
};
static int token (void)
{
char *cp;
int c;
struct toktab *t;
if (feof(cfile))
return (0);
while ((c = getc(cfile)) != EOF &&
(c == '\n' || c == '\t' || c == ' ' || c == ','))
continue;
if (c == EOF)
return (0);
cp = tokval;
if (c == '"') {
while ((c = getc(cfile)) != EOF && c != '"') {
if (c == '\\')
c = getc(cfile);
*cp++ = c;
}
} else {
*cp++ = c;
while ((c = getc(cfile)) != EOF
&& c != '\n' && c != '\t' && c != ' ' && c != ',') {
if (c == '\\')
c = getc(cfile);
*cp++ = c;
}
}
*cp = 0;
if (tokval[0] == 0)
return (0);
for (t = toktab; t->tokstr; t++)
if (!strcmp(t->tokstr, tokval))
return (t->tval);
return (ID);
}
int ruserpass (char *host, char **aname, char **apass, char **aacct)
{
char *hdir, *tmp;
static char buf[BUFSIZ];
static char myname[MAXHOSTNAMELEN];
char *mydomain;
int t, i, c, usedefault = 0;
static struct stat stb;
hdir = getenv("HOME");
if (hdir == NULL)
hdir = ".";
sprintf(buf, "%s/.netrc", hdir);
cfile = fopen(buf, "r");
if (cfile == NULL) {
if (errno != ENOENT)
perror(buf);
return(0);
}
if (gethostname(myname, sizeof(myname)) < 0)
myname[0] = '\0';
if ((mydomain = index(myname, '.')) == NULL)
mydomain = "";
next:
while ((t = token())) switch(t) {
case DEFAULT:
usedefault = 1;
/* FALL THROUGH */
case MACH:
if (!usedefault) {
if (token() != ID)
continue;
/*
* Allow match either for user's input host name
* or official hostname. Also allow match of
* incompletely-specified host in local domain.
*/
if (strcasecmp(host, tokval) == 0)
goto match;
if (strcasecmp(hostname, tokval) == 0)
goto match;
if ((tmp = index(hostname, '.')) != NULL &&
strcasecmp(tmp, mydomain) == 0 &&
strncasecmp(hostname, tokval, tmp-hostname) == 0 &&
tokval[tmp - hostname] == '\0')
goto match;
if ((tmp = index(host, '.')) != NULL &&
strcasecmp(tmp, mydomain) == 0 &&
strncasecmp(host, tokval, tmp - host) == 0 &&
tokval[tmp - host] == '\0')
goto match;
continue;
}
match:
while ((t = token()) && t != MACH && t != DEFAULT) switch(t) {
case LOGIN:
if (token())
if (*aname == 0) {
*aname = malloc((unsigned) strlen(tokval) + 1);
strcpy(*aname, tokval);
} else {
if (strcmp(*aname, tokval))
goto next;
}
break;
case PASSWD:
if (strcmp(*aname, "anonymous") &&
fstat(fileno(cfile), &stb) >= 0 &&
(stb.st_mode & 077) != 0) {
fprintf(stderr, "Error - .netrc file not correct mode.\n");
fprintf(stderr, "Remove password or correct mode.\n");
goto bad;
}
if (token() && *apass == 0) {
*apass = malloc((unsigned) strlen(tokval) + 1);
strcpy(*apass, tokval);
}
break;
case ACCOUNT:
if (fstat(fileno(cfile), &stb) >= 0
&& (stb.st_mode & 077) != 0) {
fprintf(stderr, "Error - .netrc file not correct mode.\n");
fprintf(stderr, "Remove account or correct mode.\n");
goto bad;
}
if (token() && *aacct == 0) {
*aacct = malloc((unsigned) strlen(tokval) + 1);
strcpy(*aacct, tokval);
}
break;
case MACDEF:
if (proxy) {
fclose(cfile);
return(0);
}
while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t');
if (c == EOF || c == '\n') {
printf("Missing macdef name argument.\n");
goto bad;
}
if (macnum == 16) {
printf("Limit of 16 macros have already been defined\n");
goto bad;
}
tmp = macros[macnum].mac_name;
*tmp++ = c;
for (i=0; i < 8 && (c=getc(cfile)) != EOF &&
!isspace(c); ++i) {
*tmp++ = c;
}
if (c == EOF) {
printf("Macro definition missing null line terminator.\n");
goto bad;
}
*tmp = '\0';
if (c != '\n') {
while ((c=getc(cfile)) != EOF && c != '\n');
}
if (c == EOF) {
printf("Macro definition missing null line terminator.\n");
goto bad;
}
if (macnum == 0) {
macros[macnum].mac_start = macbuf;
}
else {
macros[macnum].mac_start = macros[macnum-1].mac_end + 1;
}
tmp = macros[macnum].mac_start;
while (tmp != macbuf + 4096) {
if ((c=getc(cfile)) == EOF) {
printf("Macro definition missing null line terminator.\n");
goto bad;
}
*tmp = c;
if (*tmp == '\n') {
if (*(tmp-1) == '\0') {
macros[macnum++].mac_end = tmp - 1;
break;
}
*tmp = '\0';
}
tmp++;
}
if (tmp == macbuf + 4096) {
printf("4K macro buffer exceeded\n");
goto bad;
}
break;
default:
fprintf(stderr, "Unknown .netrc keyword %s\n", tokval);
break;
}
goto done;
}
done:
fclose(cfile);
return(0);
bad:
fclose(cfile);
return(-1);
}

1
bin/ftp/ruserpass.h Normal file
View File

@ -0,0 +1 @@
int ruserpass (char *host, char **aname, char **apass, char **aacct);

152
bin/ftp/tags Normal file
View File

@ -0,0 +1,152 @@
ACCOUNT ruserpass.c /^#define ACCOUNT 4$/
DEFAULT ruserpass.c /^#define DEFAULT 1$/
GAVSIZ glob.c /^#define GAVSIZ (NCARGS\/6)$/
Gcat glob.c /^static void Gcat (char \*s1, char \*s2)$/
Gmatch glob.c /^static int Gmatch (char \*s, char \*p)$/
HASHBYTES ftp.c /^#define HASHBYTES 1024$/
ID ruserpass.c /^#define ID 10$/
LOGIN ruserpass.c /^#define LOGIN 2$/
MACDEF ruserpass.c /^#define MACDEF 5$/
MACH ruserpass.c /^#define MACH 11$/
Mmain main.c /^main (int argc, char \*\*argv)$/
PASSWD ruserpass.c /^#define PASSWD 3$/
QUOTE glob.c /^#define QUOTE 0200$/
TRIM glob.c /^#define TRIM 0177$/
UC ftp.c /^#define UC(b) (((unsigned int)b)&0xff)$/
_PATH_TMP pathnames.h /^#define _PATH_TMP "\/tmp\/ftpXXXXXX"$/
abort_remote ftp.c /^void abort_remote (FILE \*din)$/
abortpt ftp.c /^void abortpt (int sig, int code)$/
abortrecv ftp.c /^void abortrecv (int sig, int code)$/
abortsend ftp.c /^void abortsend (int sig, int code)$/
account cmds.c /^void account (int argc, char \*\*argv)$/
acollect glob.c /^static void acollect (char \*as)$/
addpath glob.c /^static void addpath (char c)$/
amatch glob.c /^static int amatch (char \*s, char \*p)$/
another cmds.c /^int another (int \*pargc, char \*\*\*pargv, char /
any glob.c /^int any (int c, char \*s)$/
blkcpy glob.c /^char \*\*blkcpy (char \*\*oav, char \*\*bv)$/
blkfree glob.c /^void blkfree (char \*\*av0)$/
blklen glob.c /^int blklen (char \*\*av)$/
cd cmds.c /^void cd (int argc, char \*\*argv)$/
cdup cmds.c /^void cdup (int argc, char \*\*argv)$/
changetype cmds.c /^void changetype (int newtype, int show)$/
cmd ftp.var.c /^struct cmd {$/
cmdabort ftp.c /^void cmdabort (int sig, int code)$/
cmdscanner main.c /^cmdscanner (int top)$/
collect glob.c /^static void collect (char \*as)$/
command ftp.c /^int command (char \*string, \.\.\.)$/
comvars ftp.c /^static struct comvars {$/
confirm cmds.c /^int confirm (char \*cmd, char \*file)$/
copyblk glob.c /^char \*\*copyblk (char \*\*v)$/
dataconn ftp.c /^FILE \*dataconn (char \*lmode)$/
delete cmds.c /^void delete (int argc, char \*\*argv)$/
digit glob.c /^int digit (char c)$/
disconnect cmds.c /^void disconnect (int argc, char \*\*argv)$/
do_chmod cmds.c /^void do_chmod (int argc, char \*\*argv)$/
do_umask cmds.c /^void do_umask (int argc, char \*\*argv)$/
domacro domacro.c /^void domacro (int argc, char \*\*argv)$/
domap cmds.c /^char \*domap (char \*name)$/
doproxy cmds.c /^void doproxy (int argc, char \*\*argv)$/
dotrans cmds.c /^char \*dotrans (char \*name)$/
empty ftp.c /^int empty (struct fd_set \*mask, int sec)$/
eq glob.c /^#define eq(a,b) (strcmp(a, b)==0)$/
execbrc glob.c /^static int execbrc (char \*p, char \*s)$/
expand glob.c /^static void expand (char \*as)$/
fatal cmds.c /^void fatal (char \*msg)$/
ftpglob glob.c /^char \*\*ftpglob (char \*v)$/
ftpsetdebug cmds.c /^void ftpsetdebug (int argc, char \*\*argv)$/
get cmds.c /^void get (int argc, char \*\*argv)$/
getcmd main.c /^getcmd (char \*name)$/
gethdir glob.c /^int gethdir (char \*home)$/
getit cmds.c /^int getit (int argc, char \*\*argv, int restartit,/
getlogin ftp.c /^char \*getlogin (void)$/
getreply ftp.c /^int getreply (int expecteof)$/
gettimeofday ftp.c /^int gettimeofday(struct timeval \*tp, struct timez/
ginit glob.c /^static void ginit (char \*\*agargv)$/
globulize cmds.c /^int globulize (char \*cpp\[\])$/
gunique ftp.c /^char \*gunique (char \*local)$/
help main.c /^help (int argc, char \*\*argv)$/
hookup ftp.c /^char \*hookup (char \*host, int port)$/
idle cmds.c /^void idle (int argc, char \*\*argv)$/
initconn ftp.c /^int initconn (void)$/
intr main.c /^intr (int sig, int code)$/
isdir glob.c /^#define isdir(d) ((d\.st_mode & S_IFMT) == S_IFDIR/
lcd cmds.c /^void lcd (int argc, char \*\*argv)$/
letter glob.c /^int letter (char c)$/
login ftp.c /^int login (char \*host)$/
lostpeer main.c /^lostpeer (int sig, int code)$/
ls cmds.c /^void ls (int argc, char \*\*argv)$/
mabort cmds.c /^void mabort (int sig, int code)$/
macdef cmds.c /^void macdef (int argc, char \*\*argv)$/
macel ftp.var.c /^struct macel {$/
makeargv main.c /^makeargv (void)$/
makedir cmds.c /^void makedir (int argc, char \*\*argv)$/
match glob.c /^static int match (char \*s, char \*p)$/
matchdir glob.c /^static void matchdir (char \*pattern)$/
mdelete cmds.c /^void mdelete (int argc, char \*\*argv)$/
mget cmds.c /^void mget (int argc, char \*\*argv)$/
mls cmds.c /^void mls (int argc, char \*\*argv)$/
modtime cmds.c /^void modtime (int argc, char \*\*argv)$/
mput cmds.c /^void mput (int argc, char \*\*argv)$/
newer cmds.c /^void newer (int argc, char \*\*argv)$/
nz ftp.c /^#define nz(x) ((x) == 0 ? 1 : (x))$/
onoff cmds.c /^char \*onoff (int bool)$/
proxabort cmds.c /^void proxabort (int sig, int code)$/
proxtrans ftp.c /^void proxtrans (char \*cmd, char \*local, char \*r/
psabort ftp.c /^void psabort (int sig, int code)$/
pswitch ftp.c /^void pswitch (int flag)$/
ptransfer ftp.c /^void ptransfer(char \*direction, long bytes, struc/
put cmds.c /^void put (int argc, char \*\*argv)$/
pwd cmds.c /^void pwd (int argc, char \*\*argv)$/
quit cmds.c /^void quit (int argc, char \*\*argv)$/
quote cmds.c /^void quote (int argc, char \*\*argv)$/
quote1 cmds.c /^void quote1 (char \*initial, int argc, char \*\*ar/
recvrequest ftp.c /^void recvrequest (char \*cmd, char \*local, char /
reget cmds.c /^void reget (int argc, char \*\*argv)$/
remglob cmds.c /^char \*remglob (char \*\*argv, int doswitch)$/
removedir cmds.c /^void removedir (int argc, char \*\*argv)$/
renamefile cmds.c /^void renamefile (int argc, char \*\*argv)$/
reset cmds.c /^void reset (int argc, char \*\*argv)$/
restart cmds.c /^void restart (int argc, char \*\*argv)$/
rmthelp cmds.c /^void rmthelp (int argc, char \*\*argv)$/
rmtstatus cmds.c /^void rmtstatus (int argc, char \*\*argv)$/
rscan glob.c /^static void rscan (char \*\*t, int (\*f)(char))$/
ruserpass ruserpass.c /^int ruserpass (char \*host, char \*\*aname, char /
sendrequest ftp.c /^void sendrequest (char \*cmd, char \*local, char /
setascii cmds.c /^void setascii (int argc, char \*\*argv)$/
setbell cmds.c /^void setbell (int argc, char \*\*argv)$/
setbinary cmds.c /^void setbinary (int argc, char \*\*argv)$/
setcase cmds.c /^void setcase (int argc, char \*\*argv)$/
setcr cmds.c /^void setcr (int argc, char \*\*argv)$/
setform cmds.c /^void setform (int argc, char \*\*argv)$/
setglob cmds.c /^void setglob (int argc, char \*\*argv)$/
sethash cmds.c /^void sethash (int argc, char \*\*argv)$/
setmode cmds.c /^void setmode (int argc, char \*\*argv)$/
setnmap cmds.c /^void setnmap (int argc, char \*\*argv)$/
setntrans cmds.c /^void setntrans (int argc, char \*\*argv)$/
setpeer cmds.c /^void setpeer (int argc, char \*\*argv)$/
setport cmds.c /^void setport (int argc, char \*\*argv)$/
setprompt cmds.c /^void setprompt (int argc, char \*\*argv)$/
setrunique cmds.c /^void setrunique (int argc, char \*\*argv)$/
setstruct cmds.c /^void setstruct (int argc, char \*\*argv)$/
setsunique cmds.c /^void setsunique (int argc, char \*\*argv)$/
settenex cmds.c /^void settenex (int argc, char \*\*argv)$/
settrace cmds.c /^void settrace (int argc, char \*\*argv)$/
settype cmds.c /^void settype (int argc, char \*\*argv)$/
setverbose cmds.c /^void setverbose (int argc, char \*\*argv)$/
shell cmds.c /^void shell (int argc, char \*\*argv)$/
site cmds.c /^void site (int argc, char \*\*argv)$/
sizecmd cmds.c /^void sizecmd (int argc, char \*\*argv)$/
slurpstring main.c /^slurpstring (void)$/
sort glob.c /^static void sort (void)$/
status cmds.c /^void status (int argc, char \*\*argv)$/
strend glob.c /^static char \*strend (char \*cp)$/
strspl glob.c /^static char \*strspl (char \*cp, char \*dp)$/
syst cmds.c /^void syst (int argc, char \*\*argv)$/
tglob glob.c /^static int tglob (char c)$/
token ruserpass.c /^static int token (void)$/
toktab ruserpass.c /^static struct toktab {$/
tvadd ftp.c /^void tvadd (struct timeval \*tsum, struct timeval /
tvsub ftp.c /^void tvsub (struct timeval \*tdiff, struct timeval/
types cmds.c /^struct types {$/
user cmds.c /^void user (int argc, char \*\*argv)$/