⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ckuusr.c

📁 Kermit Kermit文件运输协议 Kermit文件运输协议是用于在PC之间交换文件的一种简单的文件运输协议。该协议是哥仑比亚大学开发的
💻 C
📖 第 1 页 / 共 3 页
字号:
                    return(0);                  /* and return. */
                }
            }
            cmsetp(psave);              /* Restore old prompt. */
            if ((x == cmcfm()) < 0) return(-2);
        }
    }
    sstate = 'r';                       /* All ok, set start state. */
    if (local) displa = 1;
    return(0);

/* Form Feed */
case XXHLP:                             /* Help */
    x = cmkey(cmdtab,ncmd,"C-Kermit command","help");
    return(dohlp(x));

case XXLOG:                             /* Log */
    x = cmkey(logtab,nlog,"What to log","");
    if (x == -3) {
        printf("?You must specify what is to be logged\n");
        return(-2);
    }
    if (x < 0) return(x);
    return(dolog(x));

case XXLOGI:                            /* Send script remote system */
    if ((x = cmtxt("Text of login script","",&s)) < 0) return(x);
    return( login(s) );                 /* Return 0=completed, -2=failed */

case XXREC:                             /* Receive */
    cmarg2 = "";
    x = cmofi("Name under which to store the file, or CR","",&cmarg2);
    if ((x == -1) || (x == -2)) return(x);
    debug(F111,"cmofi cmarg2",cmarg2,x);
    if ((x = cmcfm()) < 0) return(x);
    sstate = 'v';
    if (local) displa = 1;
    return(0);

case XXREM:                             /* Remote */
    if (!local) {
        printf("\nYou have to 'set line' first\n");
        return(-2);
    }
    x = cmkey(remcmd,nrmt,"Remote Kermit server command","");
    if (x == -3) {
        printf("?You must specify a command for the remote server\n");
        return(-2);
    }
    return(dormt(x));

/* Form Feed */
case XXSEN:                             /* Send */
    cmarg = cmarg2 = "";
    if ((x = cmifi("File(s) to send","",&s,&y)) < 0) {
        if (x == -3) {
            printf("?A file specification is required\n");
            return(-2);
        }
        return(x);
    }
    nfils = -1;                         /* Files come from internal list. */
    strcpy(line,s);                     /* Save copy of string just parsed. */
    debug(F101,"Send: wild","",y);
    *cmarg2 = '\0';                     /* Initialize send-as name */
    if (y == 0) {
        if ((x = cmtxt("Name to send it with","",&cmarg2)) < 0) return(x);
    } else {
        if ((x = cmcfm()) < 0) return(x);
    }
    cmarg = line;                       /* File to send */
    debug(F110,"Sending:",cmarg,0);
    if (*cmarg2 != '\0') debug(F110," as:",cmarg2,0);
    sstate = 's';                       /* Set start state */
    if (local) displa = 1;
    return(0);

case XXSER:                             /* Server */
    if ((x = cmcfm()) < 0) return(x);
    sstate = 'x';
    if (local) displa = 1;
    return(0);

case XXSET:                             /* Set */
    x = cmkey(prmtab,nprm,"Parameter","");
    if (x == -3) {
        printf("?You must specify a parameter to set\n");
        return(-2);
    }
    if (x < 0) return(x);
    return(doprm(x));

/* Form Feed */
/* XXSHE code by H. Fischer; copyright rights assigned to Columbia Univ */
/*
 Adapted to use getpwuid to find login shell because many systems do not
 have SHELL in environment, and to use direct calling of shell rather
 than intermediate system() call. -- H. Fischer
*/
case XXSHE:                             /* Local shell command */
    {
    int pid;
    if (cmtxt("Unix shell command to execute","",&s) < 0) return(-1);
    conres();                           /* Make console normal  */
#ifdef MSDOS
    zxcmd(s);
#else
#ifdef AMIGA
    zxcmd(s);
#else
#ifdef vax11c

    system(s);                          /* Best we can do for VMS? */

#else                                   /* All Unix systems... */

    if ((pid = fork()) == 0) {          /* Make child */
        char *shpath, *shname, *shptr;  /* For finding desired shell */
        struct passwd *p;
        extern struct passwd * getpwuid();
        extern int getuid();
        char *defShel = "/bin/sh";      /* Default */

        p = getpwuid( getuid() );       /* Get login data */
        if ( p == (struct passwd *) NULL || !*(p->pw_shell) )
            shpath = defShel;
        else
            shpath = p->pw_shell;
        shptr = shname = shpath;
        while (*shptr != '\0')
            if (*shptr++ == '/') shname = shptr;
        if (*s == NUL)                  /* Interactive shell requested? */
            execl(shpath,shname,"-i",NULL);    /* Yes, do that */
        else                            /* Otherwise, */
            execl(shpath,shname,"-c",s,NULL);  /* exec the given command */
        exit(GOOD_EXIT); }              /* Just punt if it didnt work */

    else {                              /* Parent */

        int wstat;                      /* Kermit must wait for child */
        int (*istat)(), (*qstat)();

        istat = signal(SIGINT,SIG_IGN); /* Let the fork handle keyboard */
        qstat = signal(SIGQUIT,SIG_IGN); /* interrupts itself... */

        while (((wstat = wait(0)) != pid) && (wstat != -1)) /* Wait for fork */
            ;
        signal(SIGINT,istat);           /* Restore interrupts */
        signal(SIGQUIT,qstat);
    }
#endif
#endif
#endif
    concb(escape);                      /* Console back in cbreak mode */
    return(0);
}

/* Form Feed */
case XXSHO:                             /* Show */
    x = cmkey(shotab,2,"","parameters");
    if (x < 0) return(x);
    if (y = (cmcfm()) < 0) return(y);
    switch (x) {

        case SHPAR:
            shopar();
            break;

        case SHVER:
            printf3("\nVersions:\n %s\n %s\n",versio,protv);
            printf2(" %s\n",fnsv);
            printf3(" %s\n %s\n",cmdv,userv);
            printf3(" %s for%s\n",ckxv,ckxsys);
            printf3(" %s for%s\n",ckzv,ckzsys);
            printf2(" %s\n",connv);
            printf3(" %s\n %s\n\n",dialv,loginv);
            break;

        default:
            printf("\nNothing to show...\n");
            break;
    }
    return(0);

case XXSPA:                             /* space */
    if ((x = cmcfm()) < 0) return(x);
    system(SPACMD);
    return(0);

case XXSTA:                             /* statistics */
    if ((x = cmcfm()) < 0) return(x);
    printf("\nMost recent transaction --\n");
    printf2(" files: %ld\n",filcnt);
    printf2(" total file characters  : %ld\n",tfc);
    printf2(" communication line in  : %ld\n",tlci);
    printf2(" communication line out : %ld\n",tlco);
    printf2(" elapsed time           : %d sec\n",tsecs);
    if (filcnt > 0) {
        if (tsecs > 0) {
            long lx;
            lx = (tfc / tsecs) * 10;
            printf2(" effective baud rate    : %ld\n",lx);
            if (speed > 0) {
                lx = (lx * 100) / speed;
                printf2(" efficiency             : %ld %%\n",lx);
            }
        }
        printf2(" block check type used  : %d\n",bctu);
        printf(" compression            : ");
        if (rptflg) printf2("yes [%c]\n",rptq); else printf("no\n");
        printf(" 8th bit prefixing      : ");
        if (ebqflg) printf2("yes [%c]\n",ebq); else printf("no\n\n");
    } else printf("\n");
    return(0);

/* Form Feed */
case XXTAK:                             /* take */
    if (tlevel > MAXTAKE-1) {
        printf("?Take files nested too deeply\n");
        return(-2);
    }
    if ((y = cmifi("C-Kermit command file","",&s,&x)) < 0) {
        if (y == -3) {
            printf("?A file specification is required\n");
            return(-2);
        } else return(y);
    }
    if (x != 0) {
        printf("?Wildcards not allowed in command file name\n");
        return(-2);
    }
    strcpy(line,s);                     /* Make a safe copy of the string */
    if ((y = cmcfm()) < 0) return(y);
    if ((tfile[++tlevel] = fopen(line,"r")) == NULL) {
        perror(line);
        debug(F110,"Failure to open",line,0);
        tlevel--;
    }
    return(0);

default:
    printf2("Not available - %s\n",cmdbuf);
    return(-2);
    }
}

/* Form Feed */
/*  S H O P A R  --  Show Parameters  */

shopar() {

    int i;
    extern struct keytab mdmtab[]; extern int nmdm;

    puts("\nCommunications Parameters:");
    printf3(" Line: %s, speed: %d, mode: ",ttname,speed);
    if (local) printf("local"); else printf("remote");

    for (i = 0; i < nmdm; i++) {
        if (mdmtab[i].val == mdmtyp) {
            printf2(", modem-dialer: %s",mdmtab[i].kwd);
            break;
        }
    }
    printf("\n Parity: ");
    switch (parity) {
        case 'e': printf("even");  break;
        case 'o': printf("odd");   break;
        case 'm': printf("mark");  break;
        case 's': printf("space"); break;
        case 0:   printf("none");  break;
        default:  printf2("invalid - %d",parity); break;
    }
    printf(", duplex: ");
    if (duplex) printf("half, "); else printf("full, ");
    printf("flow: ");
    if (flow == 1) printf("xon/xoff");
        else if (flow == 0) printf("none");
        else printf2("%d",flow);
    printf(", handshake: ");
    if (turn) printf2("%d\n",turnch); else printf("none\n");

    printf("\nProtocol Parameters:   Send    Receive");
    if (timef || spsizf) printf("    (* = override)");
    printf3("\n Timeout:      %11d%9d", rtimo,  timint);
    if (timef) printf("*");
    printf3("\n Padding:      %11d%9d\n", npad,   mypadn);
    printf3(  " Pad Character:%11d%9d\n", padch,  mypadc);
    printf3(  " Packet Start: %11d%9d\n", mystch, stchr);
    printf3(  " Packet End:   %11d%9d\n", seol,   eol);
    printf2(  " Packet Length:%11d", spsiz);
    printf( spsizf ? "*" : " " ); printf2("%8d\n", rpsiz);

    printf3("\nBlock Check Type: %d, Delay: %d\n",bctr,delay);
    if (ebqflg) printf2("8th-Bit Prefix:      '%c'\n",ebq);
    if (rptflg) printf2("Repeat-Count Prefix: '%c'\n",rptq);

    printf("\nFile parameters:\n File Names:   ");
    if (fncnv) printf2("%-12s","converted"); else printf2("%-12s","literal");
#ifdef DEBUG
    printf("   Debugging Log:    ");
    if (deblog) printf2("%s",debfil); else printf("none");
#endif
    printf("\n File Type:    ");
    if (binary) printf2("%-12s","binary"); else printf2("%-12s","text");
    printf("   Packet Log:       ");
    if (pktlog) printf(pktfil); else printf("none");
    printf("\n File Warning: ");
    if (warn) printf2("%-12s","on"); else printf2("%-12s","off");
    printf("   Session Log:      ");
    if (seslog) printf(sesfil); else printf("none");
    printf("\n File Display: ");
    if (quiet) printf2("%-12s","off"); else printf2("%-12s","on");
#ifdef TLOG
    printf("   Transaction Log:  ");
    if (tralog) printf(trafil); else printf("none");
#endif
    printf("\n\nIncomplete File Disposition: ");
    if (keep) printf("keep"); else printf("discard");
#ifdef KERMRC
    printf2(", Init file: %s",KERMRC);
#endif
    puts("\n");
}

/* Form Feed */
/*  D O C O N E C T  --  Do the connect command  */

/*  Note, we don't call this directly from dial, because we need to give */
/*  the user a chance to change parameters (e.g. parity) after the */
/*  connection is made. */

doconect() {
    int x;
    conres();                           /* Put console back to normal */
    x = conect();                       /* Connect */
    concb(escape);                      /* Put console into cbreak mode, */
    return(x);                          /* for more command parsing. */
}


/*  D O L O G  --  Do the log command  */

dolog(x) int x; {
    int y; char *s;

    switch (x) {

        case LOGD:
#ifdef DEBUG
            y = cmofi("Name of debugging log file","debug.log",&s);
#else
            y = -2; s = "";
            printf2("%s","- Sorry, debug log not available\n");
#endif
            break;

        case LOGP:
            y = cmofi("Name of packet log file","packet.log",&s);
            break;

        case LOGS:
            y = cmofi("Name of session log file","session.log",&s);
            break;

        case LOGT:
#ifdef TLOG
            y = cmofi("Name of transaction log file","transact.log",&s);
#else
            y = -2; s = "";
            printf2("%s","- Sorry, transaction log not available\n");
#endif
            break;

        default:
            printf2("\n?Unexpected log designator - %d\n",x);
            return(-2);
    }
    if (y < 0) return(y);

    strcpy(line,s);
    s = line;
    if ((y = cmcfm()) < 0) return(y);

/* cont'd... */

/* Form Feed */
/* ...dolog, cont'd */


    switch (x) {

        case LOGD:
            return(deblog = debopn(s));

        case LOGP:
            zclose(ZPFILE);
            y = zopeno(ZPFILE,s);
            if (y > 0) strcpy(pktfil,s); else *pktfil = '\0';
            return(pktlog = y);

        case LOGS:
            zclose(ZSFILE);
            y = zopeno(ZSFILE,s);
            if (y > 0) strcpy(sesfil,s); else *sesfil = '\0';
            return(seslog = y);

        case LOGT:
            zclose(ZTFILE);
            tralog = zopeno(ZTFILE,s);
            if (tralog > 0) {
                strcpy(trafil,s);
                tlog(F110,"Transaction Log:",versio,0l);
                tlog(F100,ckxsys,"",0);
                ztime(&s);
                tlog(F100,s,"",0l);
            }
            else *trafil = '\0';
            return(tralog);

        default:
            return(-2);
    }
}


/*  D E B O P N  --  Open a debugging file  */

debopn(s) char *s; {
#ifdef DEBUG
    char *tp;
    zclose(ZDFILE);
    deblog = zopeno(ZDFILE,s);
    if (deblog > 0) {
        strcpy(debfil,s);
        debug(F110,"Debug Log ",versio,0);
        debug(F100,ckxsys,"",0);
        ztime(&tp);
        debug(F100,tp,"",0);
    } else *debfil = '\0';
    return(deblog);
#else
    return(0);
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -