Annotation of 43BSDReno/contrib/kermit/ckuscr.c, revision 1.1.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.