📄 cmds.c
字号:
do_chmod(argc, argv)
int argc;
char *argv[];
{
if (argc < 2 && !another(&argc, &argv, "mode"))
goto usage;
if ((argc < 3 && !another(&argc, &argv, "file-name")) || argc > 3) {
usage:
printf("usage: %s mode file-name\n", argv[0]);
code = -1;
return;
}
(void)command("SITE CHMOD %s %s", argv[1], argv[2]);
}
void
do_umask(argc, argv)
int argc;
char *argv[];
{
int oldverbose = verbose;
verbose = 1;
(void)command(argc == 1 ? "SITE UMASK" : "SITE UMASK %s", argv[1]);
verbose = oldverbose;
}
void
idle(argc, argv)
int argc;
char *argv[];
{
int oldverbose = verbose;
verbose = 1;
(void)command(argc == 1 ? "SITE IDLE" : "SITE IDLE %s", argv[1]);
verbose = oldverbose;
}
/*
* Ask the other side for help.
*/
void
rmthelp(argc, argv)
int argc;
char *argv[];
{
int oldverbose = verbose;
verbose = 1;
(void)command(argc == 1 ? "HELP" : "HELP %s", argv[1]);
verbose = oldverbose;
}
/*
* Terminate session and exit.
*/
/*VARARGS*/
void
quit(argc, argv)
int argc;
char *argv[];
{
if (connected)
disconnect(0, 0);
pswitch(1);
if (connected) {
disconnect(0, 0);
}
exit(0);
}
/*
* Terminate session, but don't exit.
*/
void
disconnect(argc, argv)
int argc;
char *argv[];
{
if (!connected)
return;
(void)command("QUIT");
if (cout) {
(void)fclose(cout);
}
cout = NULL;
connected = 0;
data = -1;
if (!proxy) {
macnum = 0;
}
}
void
account(argc, argv)
int argc;
char *argv[];
{
char *ap;
if (argc > 2) {
printf("usage: %s [password]\n", argv[0]);
code = -1;
return;
}
else if (argc == 2)
ap = argv[1];
else
ap = getpass("Account:");
(void)command("ACCT %s", ap);
}
jmp_buf abortprox;
void
proxabort(notused)
int notused;
{
alarmtimer(0);
if (!proxy) {
pswitch(1);
}
if (connected) {
proxflag = 1;
}
else {
proxflag = 0;
}
pswitch(0);
longjmp(abortprox, 1);
}
void
doproxy(argc, argv)
int argc;
char *argv[];
{
struct cmd *c;
int cmdpos;
sig_t oldintr;
if (argc < 2 && !another(&argc, &argv, "command")) {
printf("usage: %s command\n", argv[0]);
code = -1;
return;
}
c = getcmd(argv[1]);
if (c == (struct cmd *) -1) {
puts("?Ambiguous command.");
(void)fflush(stdout);
code = -1;
return;
}
if (c == 0) {
puts("?Invalid command.");
(void)fflush(stdout);
code = -1;
return;
}
if (!c->c_proxy) {
puts("?Invalid proxy command.");
(void)fflush(stdout);
code = -1;
return;
}
if (setjmp(abortprox)) {
code = -1;
return;
}
oldintr = signal(SIGINT, proxabort);
pswitch(1);
if (c->c_conn && !connected) {
puts("Not connected.");
(void)fflush(stdout);
pswitch(0);
(void)signal(SIGINT, oldintr);
code = -1;
return;
}
cmdpos = (int)strcspn(line, " \t");
if (cmdpos > 0) /* remove leading "proxy " from input buffer */
memmove(line, line + cmdpos + 1, strlen(line) - cmdpos + 1);
(*c->c_handler)(argc-1, argv+1);
if (connected) {
proxflag = 1;
}
else {
proxflag = 0;
}
pswitch(0);
(void)signal(SIGINT, oldintr);
}
void
setcase(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &mcase, "Case mapping");
}
void
setcr(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &crflag, "Carriage Return stripping");
}
void
setntrans(argc, argv)
int argc;
char *argv[];
{
if (argc == 1) {
ntflag = 0;
puts("Ntrans off.");
code = ntflag;
return;
}
ntflag++;
code = ntflag;
(void)strncpy(ntin, argv[1], sizeof(ntin) - 1);
ntin[sizeof(ntin) - 1] = '\0';
if (argc == 2) {
ntout[0] = '\0';
return;
}
(void)strncpy(ntout, argv[2], sizeof(ntout) - 1);
ntout[sizeof(ntout) - 1] = '\0';
}
char *
dotrans(name)
char *name;
{
static char new[MAXPATHLEN];
char *cp1, *cp2 = new;
int i, ostop, found;
for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++)
continue;
for (cp1 = name; *cp1; cp1++) {
found = 0;
for (i = 0; *(ntin + i) && i < 16; i++) {
if (*cp1 == *(ntin + i)) {
found++;
if (i < ostop) {
*cp2++ = *(ntout + i);
}
break;
}
}
if (!found) {
*cp2++ = *cp1;
}
}
*cp2 = '\0';
return (new);
}
void
setnmap(argc, argv)
int argc;
char *argv[];
{
char *cp;
if (argc == 1) {
mapflag = 0;
puts("Nmap off.");
code = mapflag;
return;
}
if ((argc < 3 && !another(&argc, &argv, "mapout")) || argc > 3) {
printf("usage: %s [mapin mapout]\n", argv[0]);
code = -1;
return;
}
mapflag = 1;
code = 1;
cp = strchr(altarg, ' ');
if (proxy) {
while(*++cp == ' ')
continue;
altarg = cp;
cp = strchr(altarg, ' ');
}
*cp = '\0';
(void)strncpy(mapin, altarg, MAXPATHLEN - 1);
while (*++cp == ' ')
continue;
(void)strncpy(mapout, cp, MAXPATHLEN - 1);
}
char *
domap(name)
char *name;
{
static char new[MAXPATHLEN];
char *cp1 = name, *cp2 = mapin;
char *tp[9], *te[9];
int i, toks[9], toknum = 0, match = 1;
for (i=0; i < 9; ++i) {
toks[i] = 0;
}
while (match && *cp1 && *cp2) {
switch (*cp2) {
case '\\':
if (*++cp2 != *cp1) {
match = 0;
}
break;
case '$':
if (*(cp2+1) >= '1' && (*cp2+1) <= '9') {
if (*cp1 != *(++cp2+1)) {
toks[toknum = *cp2 - '1']++;
tp[toknum] = cp1;
while (*++cp1 && *(cp2+1)
!= *cp1);
te[toknum] = cp1;
}
cp2++;
break;
}
/* FALLTHROUGH */
default:
if (*cp2 != *cp1) {
match = 0;
}
break;
}
if (match && *cp1) {
cp1++;
}
if (match && *cp2) {
cp2++;
}
}
if (!match && *cp1) /* last token mismatch */
{
toks[toknum] = 0;
}
cp1 = new;
*cp1 = '\0';
cp2 = mapout;
while (*cp2) {
match = 0;
switch (*cp2) {
case '\\':
if (*(cp2 + 1)) {
*cp1++ = *++cp2;
}
break;
case '[':
LOOP:
if (*++cp2 == '$' &&
isdigit((unsigned char)*(cp2+1))) {
if (*++cp2 == '0') {
char *cp3 = name;
while (*cp3) {
*cp1++ = *cp3++;
}
match = 1;
}
else if (toks[toknum = *cp2 - '1']) {
char *cp3 = tp[toknum];
while (cp3 != te[toknum]) {
*cp1++ = *cp3++;
}
match = 1;
}
}
else {
while (*cp2 && *cp2 != ',' &&
*cp2 != ']') {
if (*cp2 == '\\') {
cp2++;
}
else if (*cp2 == '$' &&
isdigit((unsigned char)*(cp2+1))) {
if (*++cp2 == '0') {
char *cp3 = name;
while (*cp3) {
*cp1++ = *cp3++;
}
}
else if (toks[toknum =
*cp2 - '1']) {
char *cp3=tp[toknum];
while (cp3 !=
te[toknum]) {
*cp1++ = *cp3++;
}
}
}
else if (*cp2) {
*cp1++ = *cp2++;
}
}
if (!*cp2) {
puts(
"nmap: unbalanced brackets.");
return (name);
}
match = 1;
cp2--;
}
if (match) {
while (*++cp2 && *cp2 != ']') {
if (*cp2 == '\\' && *(cp2 + 1)) {
cp2++;
}
}
if (!*cp2) {
puts(
"nmap: unbalanced brackets.");
return (name);
}
break;
}
switch (*++cp2) {
case ',':
goto LOOP;
case ']':
break;
default:
cp2--;
goto LOOP;
}
break;
case '$':
if (isdigit((unsigned char)*(cp2 + 1))) {
if (*++cp2 == '0') {
char *cp3 = name;
while (*cp3) {
*cp1++ = *cp3++;
}
}
else if (toks[toknum = *cp2 - '1']) {
char *cp3 = tp[toknum];
while (cp3 != te[toknum]) {
*cp1++ = *cp3++;
}
}
break;
}
/* intentional drop through */
default:
*cp1++ = *cp2;
break;
}
cp2++;
}
*cp1 = '\0';
if (!*new) {
return (name);
}
return (new);
}
void
setpassive(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &passivemode,
verbose ? "Passive mode" : NULL);
}
void
setsunique(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &sunique, "Store unique");
}
void
setrunique(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &runique, "Receive unique");
}
/* change directory to parent directory */
void
cdup(argc, argv)
int argc;
char *argv[];
{
int r;
r = command("CDUP");
if (r == ERROR && code == 500) {
if (verbose)
puts("CDUP command not recognized, trying XCUP.");
r = command("XCUP");
}
if (r == COMPLETE)
dirchange = 1;
}
/*
* Restart transfer at specific point
*/
void
restart(argc, argv)
int argc;
char *argv[];
{
if (argc > 2) {
printf("usage: %s [restart_point]\n", argv[0]);
code = -1;
return;
}
if (argc == 2) {
quad_t rp;
char *ep;
rp = strtoq(argv[1], &ep, 10);
if (rp < 0 || *ep != '\0')
printf("restart: Invalid offset `%s'\n", argv[1]);
else
restart_point = rp;
}
if (restart_point == 0)
puts("No restart point defined");
else
printf("Restarting at %d for next get, put or append\n",
(unsigned int)restart_point); /* replaced long long for EFI port */
}
/*
* Show remote system type
*/
void
syst(argc, argv)
int argc;
char *argv[];
{
(void)command("SYST");
}
void
macdef(argc, argv)
int argc;
char *argv[];
{
char *tmp;
int c;
if (macnum == 16) {
puts("Limit of 16 macros have already been defined.");
code = -1;
return;
}
if ((argc < 2 && !another(&argc, &argv, "macro name")) || argc > 2) {
printf("usage: %s macro_name\n", argv[0]);
code = -1;
return;
}
if (interactive)
puts(
"Enter macro line by line, terminating it with a null line.");
(void)strncpy(macros[macnum].mac_name, argv[1],
sizeof(macros[macnum].mac_name) - 1);
macros[macnum].mac_name[sizeof(macros[macnum].mac_name) - 1] = '\0';
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 = getchar()) == EOF) {
puts("macdef: end of file encountered.");
code = -1;
return;
}
if ((*tmp = c) == '\n') {
if (tmp == macros[macnum].mac_start) {
macros[macnum++].mac_end = tmp;
code = 0;
return;
}
if (*(tmp-1) == '\0') {
macros[macnum++].mac_end = tmp - 1;
code = 0;
return;
}
*tmp = '\0';
}
tmp++;
}
while (1) {
while ((c = getchar()) != '\n' && c != EOF)
/* LOOP */;
if (c == EOF || getchar() == '\n') {
puts("Macro not defined - 4K buffer exceeded.");
code = -1;
return;
}
}
}
/*
* Restrict FTP data port range to a high group of "safe" ports
*/
void
setrestrict(argc, argv)
int argc;
char *argv[];
{
code = togglevar(argc, argv, &restricted_data_ports,
verbose ? "Restricted data ports" : NULL);
}
/*
* Get size of file on remote machine
*/
void
sizecmd(argc, argv)
int argc;
char *argv[];
{
off_t size;
if ((argc < 2 && !another(&argc, &argv, "filename")) || argc > 2) {
printf("usage: %s filename\n", argv[0]);
code = -1;
return;
}
size = remotesize(argv[1], 1);
if (size != -1)
printf("%s\t%d\n", argv[1], (unsigned int)size); /* replaced long long for EFI port */
code = (int) size; /* cast added for EFI port */
}
/*
* Get last modification time of file on remote machine
*/
void
modtime(argc, argv)
int argc;
char *argv[];
{
time_t mtime;
if ((argc < 2 && !another(&argc, &argv, "filename")) || argc > 2) {
printf("usage: %s filename\n", argv[0]);
code = -1;
return;
}
mtime = remotemodtime(argv[1], 1);
if (mtime != -1)
printf("%s\t%s", argv[1], asctime(localtime(&mtime)));
code = mtime;
}
/*
* Show status on remote machine
*/
void
rmtstatus(argc, argv)
int argc;
char *argv[];
{
(void)command(argc > 1 ? "STAT %s" : "STAT" , argv[1]);
}
/*
* Get file if modtime is more recent than current file
*/
void
newer(argc, argv)
int argc;
char *argv[];
{
if (getit(argc, argv, -1, "w"))
printf("Local file \"%s\" is newer than remote file \"%s\".\n",
argv[2], argv[1]);
}
/*
* Display one file through $PAGER (defaults to "more").
*/
void
page(argc, argv)
int argc;
char *argv[];
{
int ohash, overbose;
char *p, *pager, *oldargv1;
if ((argc < 2 && !another(&argc, &argv, "filename")) || argc > 2) {
printf("usage: %s filename\n", argv[0]);
code = -1;
return;
}
oldargv1 = argv[1];
if (!globulize(&argv[1])) {
code = -1;
return;
}
p = getenv("PAGER");
if (p == NULL)
p = PAGER;
if ((pager = malloc(strlen(p) + 2)) == NULL)
errx(1, "Can't allocate memory for $PAGER");
(void)sprintf(pager, "|%s", p);
ohash = hash;
overbose = verbose;
hash = verbose = 0;
recvrequest("RETR", pager, argv[1], "r+w", 1, 0);
(void)free(pager);
hash = ohash;
verbose = overbose;
if (oldargv1 != argv[1]) /* free up after globulize() */
free(argv[1]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -