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

📄 ckuusr.c

📁 C语言核心协议的C语言源代码,用于早期网络通信
💻 C
📖 第 1 页 / 共 3 页
字号:
            }            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 + -