Annotation of 43BSDReno/contrib/kermit/ckuscr.c, revision 1.1

1.1     ! root        1: char *loginv = "Script Command, V2.0(007) 5 Jul 85";
        !             2: 
        !             3: /*  C K U S C R  --  Login script for logging onto remote system */
        !             4: 
        !             5: /*
        !             6:  This module should work under all versions of Unix.  It calls externally
        !             7:  defined system-depended functions for i/o.
        !             8: 
        !             9:  The module expects a login string of the expect send [expect send] ...
        !            10:  format.  It is intended to operate similarly to the way the common
        !            11:  uucp "L.sys" login entries work.  Conditional responses are supported
        !            12:  expect[-send-expect[...]] as with uucp.  The send keyword EOT sends a
        !            13:  control-d, and the keyword BREAK sends a break.  Letters prefixed
        !            14:  by '~' are '~b' backspace, '~s' space, '~n' linefeed, '~r' return, '~x' xon,
        !            15:  '~t' tab, '~q' ? (not allowed on kermit command lines), '~' ~, '~'', 
        !            16:  '~"', '~c' don't append return, '~o[o[o]]' octal character.  As with
        !            17:  some uucp systems, sent strings are followed by ~r (not ~n) unless they
        !            18:  end with ~c. Null expect strings (e.g., ~0 or --) cause a short
        !            19:  delay, and are useful for sending sequences requiring slight pauses.
        !            20: 
        !            21:  Author: Herm Fischer (HFISCHER@USC-ECLB)
        !            22:  Contributed to Columbia University for inclusion in C-Kermit.
        !            23:  Copyright (C) 1985, Herman Fischer, 16400 Ventura Blvd, Encino CA 91436
        !            24:  Permission is granted to any individual or institution to use, copy, or
        !            25:  redistribute this software so long as it is not sold for profit, provided this
        !            26:  copyright notice is retained. 
        !            27: */
        !            28: 
        !            29: #include "ckcdeb.h"
        !            30: #include <stdio.h>
        !            31: #include <ctype.h>
        !            32: #include <signal.h>
        !            33: #include <setjmp.h>
        !            34: #include "ckcker.h"
        !            35: 
        !            36: extern int local, speed, flow, seslog, mdmtyp;
        !            37: extern char ttname[];
        !            38: extern CHAR dopar();
        !            39: static char * chstr();
        !            40: 
        !            41: static int EXP_ALRM = 15;              /* Time to wait for expect string */
        !            42: #define SND_ALRM       15              /* Time to allow for sending string */
        !            43: #define NULL_EXP       2               /* Time to pause on null expect strg*/ 
        !            44: #define DEL_MSEC       300             /* milliseconds to pause on ~d */
        !            45: 
        !            46: #define SBUFL 300                      /* Login Sequence buffer */
        !            47: static char seq_buf[SBUFL], *s;
        !            48: static int got_it, no_cr;
        !            49: 
        !            50: /*  connect state parent/child communication signal handlers */
        !            51: 
        !            52: static jmp_buf alrmRng;                /* Envir ptr for connect errors */
        !            53: 
        !            54: scrtime() {                            /* modem read failure handler, */
        !            55:     longjmp(alrmRng,1);                /* notifies parent process to stop */
        !            56: }
        !            57: 
        !            58: 
        !            59: /*
        !            60:  Sequence interpreter -- pick up next sequence from command string,
        !            61:  decode escapes and place into seq_buf
        !            62: 
        !            63:  If string contains a ~d (delay) then sequenc returns a 1 expecting
        !            64:  to be called again after the ~d executes.
        !            65: */
        !            66: static 
        !            67: sequenc()  {
        !            68: 
        !            69:     int i;
        !            70:     char c, oct_char;
        !            71: 
        !            72:     no_cr = 0;                         /* output needs cr appended */
        !            73: 
        !            74:     for (i=0; i<SBUFL; ) {             
        !            75:        if (*s == '\0' || *s == '-' || isspace(*s) ) { /* done */
        !            76:            seq_buf[i] = '\0';
        !            77:            return(0) ;
        !            78:        }
        !            79: 
        !            80:        if (*s == '~') {                /* escape character */
        !            81:            switch (c = *(++s) ) {
        !            82:                case 'n':       seq_buf[i++] = '\n'; break;
        !            83:                case 'r':       seq_buf[i++] = '\r'; break;
        !            84:                case 't':       seq_buf[i++] = '\t'; break;
        !            85:                case 'b':       seq_buf[i++] = '\b'; break;
        !            86:                case 'q':       seq_buf[i++] = '?';  break;
        !            87:                case '~':       seq_buf[i++] = '~';  break;
        !            88:                case '\'':      seq_buf[i++] = '\''; break;
        !            89:                case '\"':      seq_buf[i++] = '\"'; break;
        !            90:                case 's':       seq_buf[i++] = ' ';  break;
        !            91:                case 'x':       seq_buf[i++] = '\021'; break;
        !            92:                case 'c':       no_cr = 1; break;
        !            93:                case 'd': {                     /* send what we have and then */
        !            94:                    seq_buf[i] = '\0';          /* expect to send rest after */
        !            95:                    no_cr = 1;                  /* sender delays a little */
        !            96:                    s++;
        !            97:                    return(1);
        !            98:                    }
        !            99:                case 'w': {                     /* wait count */
        !           100:                    EXP_ALRM = 15;              /* default to 15 sec */
        !           101:                    if ( isdigit( *(s+1) ) ) { 
        !           102:                        EXP_ALRM = (*(++s)) & 15;
        !           103:                        if ( isdigit( *(s+1) ) ) {
        !           104:                            EXP_ALRM = EXP_ALRM*10 + ( (*(++s)) & 15 );
        !           105:                            }
        !           106:                        }
        !           107:                    break;
        !           108:                    }
        !           109:                default:
        !           110:                    if ( isdigit(c) ) {         /* octal character */
        !           111:                        oct_char = (c & 7);     /* most significant digit */
        !           112:                        if (isdigit( *(s+1) ) ) {
        !           113:                            oct_char = (oct_char<<3) | ( (*(++s)) & 7 ) ;
        !           114:                            if (isdigit( *(s+1) ) ) {
        !           115:                                oct_char = (oct_char<<3) | ( (*(++s)) & 7 ) ;
        !           116:                            }
        !           117:                        }
        !           118:                        seq_buf[i++] = oct_char;
        !           119:                        break;
        !           120:                    }
        !           121:            }
        !           122:        }
        !           123:        else seq_buf[i++] = *s;         /* plain old character */
        !           124:        s++;
        !           125:     }
        !           126:     seq_buf[i] = '\0';
        !           127:     return(0);                 /* end of space, return anyway */
        !           128: }
        !           129: 
        !           130: 
        !           131: /*
        !           132:  Receive sequence -- see if expected response comes return success
        !           133:  (or failure) in got_it
        !           134: */ 
        !           135: static 
        !           136: recvSeq()  {
        !           137:    
        !           138:     char *e, got[7], trace[300];
        !           139:     int i, l;
        !           140:     
        !           141:        sequenc();
        !           142:        l = strlen(e=seq_buf);          /* no more than 7 chars allowed */
        !           143:        if (l > 7) {
        !           144:            e += l-7;
        !           145:            l = 7;
        !           146:        }
        !           147: 
        !           148:        tlog(F111,"expecting sequence",e,(long) l);
        !           149:        if (l == 0) {           /* null sequence, just delay a little */
        !           150:            sleep (NULL_EXP);
        !           151:            got_it = 1;
        !           152:            tlog(F100,"got it (null sequence)","",0l);
        !           153:            return;
        !           154:        }
        !           155:        *trace = '\0';
        !           156:        for (i=0; i<7; i++) got[i]='\0';
        !           157: 
        !           158:        signal(SIGALRM,scrtime);        /* did we get it? */
        !           159:        if (!setjmp(alrmRng)) { /* not timed out yet */
        !           160:            alarm(EXP_ALRM);
        !           161:            while (!got_it) {
        !           162:                for (i=0; i<(l-1); i++) got[i] = got[i+1]; /* shift over one */
        !           163:                got[l-1] = ttinc(0) & 0177;             /* next char */
        !           164:                if (strlen(trace) < sizeof(trace)-2 ) 
        !           165:                        strcat(trace,chstr(got[l-1]));
        !           166:                got_it = (!strncmp(seq_buf, got, l) ) ;
        !           167:            }
        !           168:        } else got_it = 0;              /* timed out here */
        !           169: 
        !           170:        alarm(0);
        !           171:        signal(SIGALRM,SIG_IGN);
        !           172:        tlog(F110,"received sequence: ",trace,0l);
        !           173:        tlog(F101,"returning with got-it code","",(long) got_it);
        !           174:        return;
        !           175: }
        !           176: 
        !           177: 
        !           178: /*
        !           179:  Output A Sequence starting at pointer s,
        !           180:  return 0 if okay,
        !           181:  1 if failed to read (modem hangup or whatever)
        !           182: */
        !           183: static int
        !           184: outSeq()  {
        !           185:     char *sb;
        !           186:     int l;
        !           187:     int delay;
        !           188:     int retCode = 0;
        !           189: 
        !           190:   while(1) {
        !           191:     delay = sequenc();  
        !           192:     l = strlen(seq_buf);
        !           193:     tlog(F111,"sending sequence ",seq_buf,(long) l);
        !           194:     signal(SIGALRM,scrtime);
        !           195:     if (!setjmp(alrmRng)) {
        !           196:        alarm(SND_ALRM);
        !           197:        if (!strcmp(seq_buf,"EOT")) ttoc(dopar('\004'));
        !           198:        else if (!strcmp(seq_buf,"BREAK")) ttsndb();
        !           199:        else {
        !           200:            if (l > 0) {
        !           201:                for ( sb=seq_buf; *sb; sb++) *sb = dopar(*sb);
        !           202:                ttol(seq_buf,l);                /* with parity */
        !           203:            }
        !           204:            if (!no_cr) ttoc( dopar('\r') );
        !           205:        }
        !           206:     }
        !           207:         else retCode |= -1;                    /* else -- alarm rang */
        !           208:     alarm(0);
        !           209:     signal(SIGALRM,SIG_IGN);
        !           210:     if (!delay) return ( retCode );
        !           211:     msleep(DEL_MSEC);          /* delay, and loop to next stuff to send */
        !           212:     }
        !           213: }
        !           214: 
        !           215: 
        !           216: /*  L O G I N  --  Login to remote system */
        !           217: 
        !           218: login(cmdstr) char *cmdstr; {
        !           219: 
        !           220:        int (*saveAlm)();       /* save incomming alarm function */
        !           221:        char *e;
        !           222: 
        !           223:        s = cmdstr;                     /* make global to ckuscr.c */
        !           224: 
        !           225:        tlog(F100,loginv,"",0l);
        !           226: 
        !           227:        if (!local) {
        !           228:            printf("Sorry, you must 'set line' first\n");
        !           229:            return(-2);
        !           230:        }
        !           231:        if (speed < 0) {
        !           232:            printf("Sorry, you must 'set speed' first\n");
        !           233:            return(-2);
        !           234:         }
        !           235:        if (ttopen(ttname,&local,mdmtyp) < 0) {
        !           236:            sprintf(seq_buf,"Sorry, can't open %s",ttname);
        !           237:            perror(seq_buf);
        !           238:            return(-2);
        !           239:        }
        !           240:        printf("Executing script thru %s, speed %d.\r\n",ttname,speed);
        !           241:        *seq_buf=0;
        !           242:        for (e=s; *e; e++) strcat(seq_buf, chstr(*e) );
        !           243:        printf("The logon string is: %s\r\n",seq_buf);
        !           244:        tlog(F110,"Logon command string: ",seq_buf, 0l);
        !           245: 
        !           246: /* Condition console terminal and communication line */            
        !           247: 
        !           248:        if (ttvt(speed,flow) < 0) {
        !           249:            printf("Sorry, Can't condition communication line\n");
        !           250:            return(-2);
        !           251:        }
        !           252:                                /* save initial timer interrupt value */
        !           253:        saveAlm = signal(SIGALRM,SIG_IGN);
        !           254: 
        !           255:        ttflui();               /* flush stale input */
        !           256: 
        !           257: /* cont'd... */
        !           258: 
        !           259: 
        !           260: /* ...login, cont'd */
        !           261: 
        !           262: /* start expect - send sequence */
        !           263: 
        !           264:     while (*s) {               /* while not done with buffer */
        !           265: 
        !           266:        while (*s && isspace(*s)) s++;  /* skip over separating whitespaces */
        !           267:                                /* gather up expect sequence */
        !           268:        got_it = 0;
        !           269:        recvSeq();
        !           270: 
        !           271:        while (!got_it) {
        !           272:                                /* no, is there a conditional send */
        !           273:            if (*s++ != '-') goto failRet;      /* no -- return failure */
        !           274:                
        !           275:                        /* start of conditional send */
        !           276:            ttflui();                           /* flush out input buffer */
        !           277:            if (outSeq()) goto failRet;         /* if unable to send! */
        !           278: 
        !           279:            if (*s++ != '-') goto failRet;      /* must have condit respon.*/
        !           280:            recvSeq();
        !           281:        }       /* loop back and check got_it */
        !           282: 
        !           283:        while (*s && !isspace(*s++) ) ;         /* skip over conditionals */
        !           284:        while (*s && isspace(*s)) s++;  /* skip over separating whitespaces */
        !           285:        ttflui();                       /* Flush */
        !           286:        if (*s) if (outSeq()) goto failRet;     /* if any */
        !           287:     }
        !           288:     signal(SIGALRM,saveAlm);
        !           289:     printf("Logged on!\r\n");
        !           290:     tlog(F100,"Logged on!","",0l);
        !           291:     return(0);
        !           292: 
        !           293: failRet:
        !           294:     signal(SIGALRM,saveAlm);
        !           295:     printf("Sorry, logon failed\r\n");
        !           296:     tlog(F100,"Logon failed","",0l);
        !           297:     return(-2);
        !           298: }
        !           299: 
        !           300: 
        !           301: /*  C H S T R  --  Make printable string from a character */
        !           302: 
        !           303: static char *
        !           304: chstr(c) char c; {
        !           305:     static char sc[4];
        !           306: 
        !           307:     if (c < SP) sprintf(sc, "^%c",ctl(c) );
        !           308:     else sprintf(sc, "%c", c);
        !           309:   
        !           310:     return(sc);
        !           311: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.