cmds.c
来自「一个类似windows」· C语言 代码 · 共 2,374 行 · 第 1/4 页
C
2,374 行
proxabort()
{
extern int proxy;
if (!proxy) {
pswitch(1);
}
if (connected) {
proxflag = 1;
}
else {
proxflag = 0;
}
pswitch(0);
longjmp(abortprox,1);
}
#endif
void doproxy(argc,argv)
int argc;
const char *argv[];
{
register struct cmd *c;
struct cmd *getcmd();
// extern struct cmd cmdtab[];
extern jmp_buf abortprox;
if (argc < 2) {
(void) strcat(line, " ");
printf("(command) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 2) {
printf("usage:%s command\n", argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
c = getcmd(argv[1]);
if (c == (struct cmd *) -1) {
printf("?Ambiguous command\n");
(void) fflush(stdout);
code = -1;
return;
}
if (c == 0) {
printf("?Invalid command\n");
(void) fflush(stdout);
code = -1;
return;
}
if (!c->c_proxy) {
printf("?Invalid proxy command\n");
(void) fflush(stdout);
code = -1;
return;
}
if (setjmp(abortprox)) {
code = -1;
return;
}
// oldintr = signal(SIGINT, proxabort);
pswitch(1);
if (c->c_conn && !connected) {
printf("Not connected\n");
(void) fflush(stdout);
pswitch(0);
// (void) signal(SIGINT, oldintr);
code = -1;
return;
}
(*c->c_handler)(argc-1, argv+1);
if (connected) {
proxflag = 1;
}
else {
proxflag = 0;
}
pswitch(0);
// (void) signal(SIGINT, oldintr);
}
void setcase()
{
mcase = !mcase;
printf("Case mapping %s.\n", onoff(mcase));
(void) fflush(stdout);
code = mcase;
}
void setcr()
{
crflag = !crflag;
printf("Carriage Return stripping %s.\n", onoff(crflag));
(void) fflush(stdout);
code = crflag;
}
void setntrans(argc,argv)
int argc;
char *argv[];
{
if (argc == 1) {
ntflag = 0;
printf("Ntrans off.\n");
(void) fflush(stdout);
code = ntflag;
return;
}
ntflag++;
code = ntflag;
(void) strncpy(ntin, argv[1], 16);
ntin[16] = '\0';
if (argc == 2) {
ntout[0] = '\0';
return;
}
(void) strncpy(ntout, argv[2], 16);
ntout[16] = '\0';
}
const char *
dotrans(name)
const char *name;
{
static char new[MAXPATHLEN];
const char *cp1;
char *cp2 = new;
register int i, ostop, found;
for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++);
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
setpassive(argc, argv)
int argc;
char *argv[];
{
passivemode = !passivemode;
printf("Passive mode %s.\n", onoff(passivemode));
(void) fflush(stdout);
code = passivemode;
}
void setnmap(argc, argv)
int argc;
const char *argv[];
{
char *cp;
if (argc == 1) {
mapflag = 0;
printf("Nmap off.\n");
(void) fflush(stdout);
code = mapflag;
return;
}
if (argc < 3) {
(void) strcat(line, " ");
printf("(mapout) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 3) {
printf("Usage: %s [mapin mapout]\n",argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
mapflag = 1;
code = 1;
cp = index(altarg, ' ');
if (proxy) {
while(*++cp == ' ');
altarg = cp;
cp = index(altarg, ' ');
}
*cp = '\0';
(void) strncpy(mapin, altarg, MAXPATHLEN - 1);
while (*++cp == ' ');
(void) strncpy(mapout, cp, MAXPATHLEN - 1);
}
const char *
domap(name)
const char *name;
{
static char new[MAXPATHLEN];
const char *cp1 = name;
char *cpn, *cp2 = mapin;
const 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;
}
cpn = new;
*cpn = '\0';
cp2 = mapout;
while (*cp2) {
match = 0;
switch (*cp2) {
case '\\':
if (*(cp2 + 1)) {
*cpn++ = *++cp2;
}
break;
case '[':
LOOP:
if (*++cp2 == '$' && isdigit(*(cp2+1))) {
if (*++cp2 == '0') {
const char *cp3 = name;
while (*cp3) {
*cpn++ = *cp3++;
}
match = 1;
}
else if (toks[toknum = *cp2 - '1']) {
const char *cp3 = tp[toknum];
while (cp3 != te[toknum]) {
*cpn++ = *cp3++;
}
match = 1;
}
}
else {
while (*cp2 && *cp2 != ',' &&
*cp2 != ']') {
if (*cp2 == '\\') {
cp2++;
}
else if (*cp2 == '$' &&
isdigit(*(cp2+1))) {
if (*++cp2 == '0') {
const char *cp3 = name;
while (*cp3) {
*cpn++ = *cp3++;
}
}
else if (toks[toknum =
*cp2 - '1']) {
const char *cp3=tp[toknum];
while (cp3 !=
te[toknum]) {
*cpn++ = *cp3++;
}
}
}
else if (*cp2) {
*cpn++ = *cp2++;
}
}
if (!*cp2) {
printf("nmap: unbalanced brackets\n");
(void) fflush(stdout);
return(name);
}
match = 1;
cp2--;
}
if (match) {
while (*++cp2 && *cp2 != ']') {
if (*cp2 == '\\' && *(cp2 + 1)) {
cp2++;
}
}
if (!*cp2) {
printf("nmap: unbalanced brackets\n");
(void) fflush(stdout);
return(name);
}
break;
}
switch (*++cp2) {
case ',':
goto LOOP;
case ']':
break;
default:
cp2--;
goto LOOP;
}
break;
case '$':
if (isdigit(*(cp2 + 1))) {
if (*++cp2 == '0') {
const char *cp3 = name;
while (*cp3) {
*cpn++ = *cp3++;
}
}
else if (toks[toknum = *cp2 - '1']) {
const char *cp3 = tp[toknum];
while (cp3 != te[toknum]) {
*cpn++ = *cp3++;
}
}
break;
}
/* intentional drop through */
default:
*cpn++ = *cp2;
break;
}
cp2++;
}
*cpn = '\0';
if (!*new) {
return(name);
}
return(new);
}
void setsunique()
{
sunique = !sunique;
printf("Store unique %s.\n", onoff(sunique));
(void) fflush(stdout);
code = sunique;
}
void setrunique()
{
runique = !runique;
printf("Receive unique %s.\n", onoff(runique));
(void) fflush(stdout);
code = runique;
}
/* change directory to perent directory */
void cdup()
{
if (command("CDUP") == ERROR && code == 500) {
if (verbose) {
printf("CDUP command not recognized, trying XCUP\n");
(void) fflush(stdout);
}
(void) command("XCUP");
}
}
/* restart transfer at specific point */
void restart(argc, argv)
int argc;
char *argv[];
{
extern long atol();
if (argc != 2)
printf("restart: offset not specified\n");
else {
restart_point = atol(argv[1]);
printf("restarting at %ld. %s\n", restart_point,
"execute get, put or append to initiate transfer");
}
(void) fflush(stdout);
}
/* show remote system type */
void syst()
{
(void) command("SYST");
}
void macdef(argc, argv)
int argc;
const char *argv[];
{
char *tmp;
int c;
if (macnum == 16) {
printf("Limit of 16 macros have already been defined\n");
(void) fflush(stdout);
code = -1;
return;
}
if (argc < 2) {
(void) strcat(line, " ");
printf("(macro name) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc != 2) {
printf("Usage: %s macro_name\n",argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
if (interactive) {
printf("Enter macro line by line, terminating it with a null line\n");
(void) fflush(stdout);
}
(void) strncpy(macros[macnum].mac_name, argv[1], 8);
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) {
printf("macdef:end of file encountered\n");
(void) fflush(stdout);
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') {
printf("Macro not defined - 4k buffer exceeded\n");
(void) fflush(stdout);
code = -1;
return;
}
}
}
/*
* get size of file on remote machine
*/
void sizecmd(argc, argv)
const char *argv[];
{
if (argc < 2) {
(void) strcat(line, " ");
printf("(filename) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 2) {
printf("usage:%s filename\n", argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
(void) command("SIZE %s", argv[1]);
}
/*
* get last modification time of file on remote machine
*/
void modtime(argc, argv)
const char *argv[];
{
int overbose;
if (argc < 2) {
(void) strcat(line, " ");
printf("(filename) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 2) {
printf("usage:%s filename\n", argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
overbose = verbose;
if (debug == 0)
verbose = -1;
if (command("MDTM %s", argv[1]) == COMPLETE) {
int yy, mo, day, hour, min, sec;
sscanf(reply_string, "%*s %04d%02d%02d%02d%02d%02d", &yy, &mo,
&day, &hour, &min, &sec);
/* might want to print this in local time */
printf("%s\t%02d/%02d/%04d %02d:%02d:%02d GMT\n", argv[1],
mo, day, yy, hour, min, sec);
} else
printf("%s\n", reply_string);
verbose = overbose;
(void) fflush(stdout);
}
/*
* show status on reomte machine
*/
void rmtstatus(argc, argv)
const 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)
const char *argv[];
{
if (getit(argc, argv, -1, "w")) {
printf("Local file \"%s\" is newer than remote file \"%s\"\n",
argv[1], argv[2]);
(void) fflush(stdout);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?