📄 cmds.c
字号:
char *argv[];
{
code = togglevar(argc, argv, &bell, "Bell mode");
}
#ifndef SMALL
/*
* Set command line editing
*/
/*VARARGS*/
void
setedit(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &editing, "Editing mode");
controlediting();
}
#endif /* !SMALL */
/*
* Turn on packet tracing.
*/
/*VARARGS*/
void
settrace(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &trace, "Packet tracing");
}
/*
* Toggle hash mark printing during transfers, or set hash mark bytecount.
*/
/*VARARGS*/
void
sethash(argc, argv)
int argc;
char *argv[];
{
if (argc == 1)
hash = !hash;
else if (argc != 2) {
printf("usage: %s [ on | off | bytecount ]\n", argv[0]);
code = -1;
return;
} else if (strcasecmp(argv[1], "on") == 0)
hash = 1;
else if (strcasecmp(argv[1], "off") == 0)
hash = 0;
else {
int nmark;
char *ep;
nmark = strtol(argv[1], &ep, 10);
if (nmark < 1 || *ep != '\0') {
printf("mark: bad bytecount value `%s'.\n", argv[1]);
code = -1;
return;
}
mark = nmark;
hash = 1;
}
printf("Hash mark printing %s", onoff(hash));
if (hash)
printf(" (%d bytes/hash mark)", mark);
puts(".");
code = hash;
}
/*
* Turn on printing of server echo's.
*/
/*VARARGS*/
void
setverbose(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &verbose, "Verbose mode");
}
/*
* Toggle PORT cmd use before each data connection.
*/
/*VARARGS*/
void
setport(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &sendport, "Use of PORT cmds");
}
/*
* Toggle transfer progress bar.
*/
/*VARARGS*/
void
setprogress(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &progress, "Progress bar");
}
/*
* Turn on interactive prompting during mget, mput, and mdelete.
*/
/*VARARGS*/
void
setprompt(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &interactive, "Interactive mode");
}
/*
* Toggle gate-ftp mode, or set gate-ftp server
*/
/*VARARGS*/
void
setgate(argc, argv)
int argc;
char *argv[];
{
static char gsbuf[MAXHOSTNAMELEN];
if (argc > 3) {
printf("usage: %s [ on | off | gateserver [ port ] ]\n",
argv[0]);
code = -1;
return;
} else if (argc < 2) {
gatemode = !gatemode;
} else {
if (argc == 2 && strcasecmp(argv[1], "on") == 0)
gatemode = 1;
else if (argc == 2 && strcasecmp(argv[1], "off") == 0)
gatemode = 0;
else {
if (argc == 3) {
char *ep;
long port;
port = strtol(argv[2], &ep, 10);
if (port < 0 || port > 0xffff || *ep != '\0') {
printf("%s: bad gateport value.\n",
argv[2]);
code = -1;
return;
}
gateport = htons(port);
}
strncpy(gsbuf, argv[1], sizeof(gsbuf) - 1);
gsbuf[sizeof(gsbuf) - 1] = '\0';
gateserver = gsbuf;
gatemode = 1;
}
}
if (gatemode && (gateserver == NULL || *gateserver == '\0')) {
printf(
"Disabling gate-ftp mode - no gate-ftp server defined.\n");
gatemode = 0;
} else {
printf("Gate ftp: %s, server %s, port %d.\n", onoff(gatemode),
*gateserver ? gateserver : "(none)", ntohs(gateport));
}
code = gatemode;
}
/*
* Toggle metacharacter interpretation on local file names.
*/
/*VARARGS*/
void
setglob(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &doglob, "Globbing");
}
/*
* Toggle preserving modification times on retreived files.
*/
/*VARARGS*/
void
setpreserve(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &preserve, "Preserve modification times");
}
/*
* Set debugging mode on/off and/or set level of debugging.
*/
/*VARARGS*/
void
setdebug(argc, argv)
int argc;
char *argv[];
{
if (argc > 2) {
printf("usage: %s [ on | off | debuglevel ]\n", argv[0]);
code = -1;
return;
} else if (argc == 2) {
if (strcasecmp(argv[1], "on") == 0)
debug = 1;
else if (strcasecmp(argv[1], "off") == 0)
debug = 0;
else {
char *ep;
long val;
val = strtol(argv[1], &ep, 10);
if (val < 0 || val > INT_MAX || *ep != '\0') {
printf("%s: bad debugging value.\n", argv[1]);
code = -1;
return;
}
debug = (int)val;
}
} else
debug = !debug;
if (debug)
options |= SO_DEBUG;
else
options &= ~SO_DEBUG;
printf("Debugging %s (debug=%d).\n", onoff(debug), debug);
code = debug > 0;
}
/*
* Set current working directory on remote machine.
*/
void
cd(argc, argv)
int argc;
char *argv[];
{
int r;
if ((argc < 2 && !another(&argc, &argv, "remote-directory")) ||
argc > 2) {
printf("usage: %s remote-directory\n", argv[0]);
code = -1;
return;
}
r = command("CWD %s", argv[1]);
if (r == ERROR && code == 500) {
if (verbose)
puts("CWD command not recognized, trying XCWD.");
r = command("XCWD %s", argv[1]);
}
if (r == COMPLETE)
dirchange = 1;
}
/*
* Set current working directory on local machine.
*/
void
lcd(argc, argv)
int argc;
char *argv[];
{
char buf[MAXPATHLEN];
char *oldargv1;
if (argc < 2)
argc++, argv[1] = home;
if (argc != 2) {
printf("usage: %s local-directory\n", argv[0]);
code = -1;
return;
}
oldargv1 = argv[1];
if (!globulize(&argv[1])) {
code = -1;
return;
}
if (chdir(argv[1]) < 0) {
warn("local: %s", argv[1]);
code = -1;
} else {
if (getcwd(buf, sizeof(buf)) != NULL)
printf("Local directory now %s\n", buf);
else
warn("getcwd: %s", argv[1]);
code = 0;
}
if (oldargv1 != argv[1]) /* free up after globulize() */
free(argv[1]);
}
/*
* Delete a single file.
*/
void
delete(argc, argv)
int argc;
char *argv[];
{
if ((argc < 2 && !another(&argc, &argv, "remote-file")) || argc > 2) {
printf("usage: %s remote-file\n", argv[0]);
code = -1;
return;
}
(void)command("DELE %s", argv[1]);
}
/*
* Delete multiple files.
*/
void
mdelete(argc, argv)
int argc;
char *argv[];
{
sig_t oldintr;
int ointer;
char *cp;
if (argc < 2 && !another(&argc, &argv, "remote-files")) {
printf("usage: %s remote-files\n", argv[0]);
code = -1;
return;
}
mname = argv[0];
mflag = 1;
oldintr = signal(SIGINT, mabort);
(void)setjmp(jabort);
while ((cp = remglob(argv, 0, NULL)) != NULL) {
if (*cp == '\0') {
mflag = 0;
continue;
}
if (mflag && confirm(argv[0], cp)) {
(void)command("DELE %s", cp);
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
if (confirm("Continue with", "mdelete")) {
mflag++;
}
interactive = ointer;
}
}
}
(void)signal(SIGINT, oldintr);
mflag = 0;
}
/*
* Rename a remote file.
*/
void
renamefile(argc, argv)
int argc;
char *argv[];
{
if (argc < 2 && !another(&argc, &argv, "from-name"))
goto usage;
if ((argc < 3 && !another(&argc, &argv, "to-name")) || argc > 3) {
usage:
printf("usage: %s from-name to-name\n", argv[0]);
code = -1;
return;
}
if (command("RNFR %s", argv[1]) == CONTINUE)
(void)command("RNTO %s", argv[2]);
}
/*
* Get a directory listing of remote files.
*/
void
ls(argc, argv)
int argc;
char *argv[];
{
const char *cmd;
char *oldargv2, *globargv2;
if (argc < 2)
argc++, argv[1] = NULL;
if (argc < 3)
argc++, argv[2] = "-";
if (argc > 3) {
printf("usage: %s remote-directory local-file\n", argv[0]);
code = -1;
return;
}
cmd = strcmp(argv[0], "nlist") == 0 ? "NLST" : "LIST";
oldargv2 = argv[2];
if (strcmp(argv[2], "-") && !globulize(&argv[2])) {
code = -1;
return;
}
globargv2 = argv[2];
if (strcmp(argv[2], "-") && *argv[2] != '|')
if (!globulize(&argv[2]) || !confirm("output to local-file:",
argv[2])) {
code = -1;
goto freels;
}
recvrequest(cmd, argv[2], argv[1], "w", 0, 0);
/* flush results in case commands are coming from a pipe */
fflush(stdout);
freels:
if (argv[2] != globargv2) /* free up after globulize() */
free(argv[2]);
if (globargv2 != oldargv2)
free(globargv2);
}
/*
* Get a directory listing of multiple remote files.
*/
void
mls(argc, argv)
int argc;
char *argv[];
{
sig_t oldintr;
int ointer, i;
int dolist;
char mode[1], *dest, *odest;
if (argc < 2 && !another(&argc, &argv, "remote-files"))
goto usage;
if (argc < 3 && !another(&argc, &argv, "local-file")) {
usage:
printf("usage: %s remote-files local-file\n", argv[0]);
code = -1;
return;
}
odest = dest = argv[argc - 1];
argv[argc - 1] = NULL;
if (strcmp(dest, "-") && *dest != '|')
if (!globulize(&dest) ||
!confirm("output to local-file:", dest)) {
code = -1;
return;
}
dolist = strcmp(argv[0], "mls");
mname = argv[0];
mflag = 1;
oldintr = signal(SIGINT, mabort);
(void)setjmp(jabort);
for (i = 1; mflag && i < argc-1; ++i) {
*mode = (i == 1) ? 'w' : 'a';
recvrequest(dolist ? "LIST" : "NLST", dest, argv[i], mode,
0, 0);
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
if (confirm("Continue with", argv[0])) {
mflag ++;
}
interactive = ointer;
}
}
(void)signal(SIGINT, oldintr);
mflag = 0;
if (dest != odest) /* free up after globulize() */
free(dest);
}
/*
* Do a shell escape
*/
/*ARGSUSED*/
void
shell(argc, argv)
int argc;
char *argv[];
{
#if EFI32 || EFI64 /* just ret under EFI */
extern shellemulate( int argc, char *argv[] );
shellemulate(--argc, ++argv);
return;
#else
pid_t pid;
sig_t old1, old2;
char shellnam[MAXPATHLEN], *shell, *namep;
int wait_status;
old1 = signal (SIGINT, SIG_IGN);
old2 = signal (SIGQUIT, SIG_IGN);
if ((pid = fork()) == 0) {
for (pid = 3; pid < 20; pid++)
(void)close(pid);
(void)signal(SIGINT, SIG_DFL);
(void)signal(SIGQUIT, SIG_DFL);
shell = getenv("SHELL");
if (shell == NULL)
shell = _PATH_BSHELL;
namep = strrchr(shell, '/');
if (namep == NULL)
namep = shell;
shellnam[0] = '-';
(void)strncpy(shellnam + 1, ++namep, sizeof(shellnam) - 2);
shellnam[sizeof(shellnam) - 1] = '\0';
if (strcmp(namep, "sh") != 0)
shellnam[0] = '+';
if (debug) {
puts(shell);
(void)fflush(stdout);
}
if (argc > 1) {
execl(shell, shellnam, "-c", altarg, (char *)0);
}
else {
execl(shell, shellnam, (char *)0);
}
warn("%s", shell);
code = -1;
exit(1);
}
if (pid > 0)
while (wait(&wait_status) != pid)
;
(void)signal(SIGINT, old1);
(void)signal(SIGQUIT, old2);
if (pid == -1) {
warn("Try again later");
code = -1;
}
else {
code = 0;
}
#endif /* EFI32 || EFI64 */
}
/*
* Send new user information (re-login)
*/
void
user(argc, argv)
int argc;
char *argv[];
{
char acct[80];
int n, aflag = 0;
if (argc < 2)
(void)another(&argc, &argv, "username");
if (argc < 2 || argc > 4) {
printf("usage: %s username [password] [account]\n", argv[0]);
code = -1;
return;
}
n = command("USER %s", argv[1]);
if (n == CONTINUE) {
if (argc < 3 )
argv[2] = getpass("Password: "), argc++;
n = command("PASS %s", argv[2]);
}
if (n == CONTINUE) {
if (argc < 4) {
(void)fputs("Account: ", stdout);
(void)fflush(stdout);
(void)fgets(acct, sizeof(acct) - 1, stdin);
acct[strlen(acct) - 1] = '\0';
argv[3] = acct; argc++;
}
n = command("ACCT %s", argv[3]);
aflag++;
}
if (n != COMPLETE) {
puts("Login failed.");
return;
}
if (!aflag && argc == 4) {
(void)command("ACCT %s", argv[3]);
}
connected = -1;
}
/*
* Print working directory on remote machine.
*/
/*VARARGS*/
void
pwd(argc, argv)
int argc;
char *argv[];
{
int oldverbose = verbose;
/*
* If we aren't verbose, this doesn't do anything!
*/
verbose = 1;
if (command("PWD") == ERROR && code == 500) {
puts("PWD command not recognized, trying XPWD.");
(void)command("XPWD");
}
verbose = oldverbose;
}
/*
* Print working directory on local machine.
*/
void
lpwd(argc, argv)
int argc;
char *argv[];
{
char buf[MAXPATHLEN];
if (getcwd(buf, sizeof(buf)) != NULL)
printf("Local directory %s\n", buf);
else
warn("getcwd");
code = 0;
}
/*
* Make a directory.
*/
void
makedir(argc, argv)
int argc;
char *argv[];
{
if ((argc < 2 && !another(&argc, &argv, "directory-name")) ||
argc > 2) {
printf("usage: %s directory-name\n", argv[0]);
code = -1;
return;
}
if (command("MKD %s", argv[1]) == ERROR && code == 500) {
if (verbose)
puts("MKD command not recognized, trying XMKD.");
(void)command("XMKD %s", argv[1]);
}
}
/*
* Remove a directory.
*/
void
removedir(argc, argv)
int argc;
char *argv[];
{
if ((argc < 2 && !another(&argc, &argv, "directory-name")) ||
argc > 2) {
printf("usage: %s directory-name\n", argv[0]);
code = -1;
return;
}
if (command("RMD %s", argv[1]) == ERROR && code == 500) {
if (verbose)
puts("RMD command not recognized, trying XRMD.");
(void)command("XRMD %s", argv[1]);
}
}
/*
* Send a line, verbatim, to the remote machine.
*/
void
quote(argc, argv)
int argc;
char *argv[];
{
if (argc < 2 && !another(&argc, &argv, "command line to send")) {
printf("usage: %s line-to-send\n", argv[0]);
code = -1;
return;
}
quote1("", argc, argv);
}
/*
* Send a SITE command to the remote machine. The line
* is sent verbatim to the remote machine, except that the
* word "SITE" is added at the front.
*/
void
site(argc, argv)
int argc;
char *argv[];
{
if (argc < 2 && !another(&argc, &argv, "arguments to SITE command")) {
printf("usage: %s line-to-send\n", argv[0]);
code = -1;
return;
}
quote1("SITE ", argc, argv);
}
/*
* Turn argv[1..argc) into a space-separated string, then prepend initial text.
* Send the result as a one-line command and get response.
*/
void
quote1(initial, argc, argv)
const char *initial;
int argc;
char *argv[];
{
int i, len, len1;
char buf[BUFSIZ]; /* must be >= sizeof(line) */
len = snprintf(buf, sizeof(buf), "%s", initial);
if (len >= 0 && len < sizeof(buf)) {
for (i = 1; i < argc; i++) {
len1 = snprintf(&buf[len], sizeof(buf) - len,
i == 1 ? "%s" : " %s", argv[i]);
if (len1 < 0 || len1 > (int) (sizeof(buf) - len)) /* cast added for EFI port */
break;
len += len1;
}
}
if (command(buf) == PRELIM) {
while (getreply(0) == PRELIM)
continue;
}
}
void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -