/* minisend.c by Lou Guzik and Joe Yanni 2550 final project summer 1997 */ #include #include #include #include #include #include #include #include #include #include #include #include #include extern int errno; int DEBUG=0; int dooutput=0; int doinput=0; int bold=0; /***********************************************************************/ void usage( char *argv0 ) { fprintf( stderr, "Usage: %s [-options] -h host -p port [\"send\" \"expect\"] \n\n",argv0); fprintf( stderr, " -h host the address of the remote TCP host to use\n"); fprintf( stderr, " -p port the remote TCP port to use\n"); fprintf( stderr, "\nOptions\n -f filename use the file for reading, # starts a comment\n"); fprintf( stderr, " -d debug (use -d -d to be more debug)\n"); fprintf( stderr, " -o write remote output to stdout (redirection via > is a good idea)\n"); fprintf( stderr, " -i write my input to stdout (redirection via > is a good idea)\n"); fprintf( stderr, " -I as -1, but write in bold on a vt100 compatible terminal\n"); fprintf( stderr, " -? this help screen\n"); fprintf( stderr, "\n"); fprintf( stderr, "Escape Codes for Send: \t\t\t for Expect: (only one char)\n"); fprintf( stderr, " \\n Line Feed (ASCII 10) \t\t \\0 NULL (ASCII 0)\n"); fprintf( stderr, " \\t Tab (ASCII 9) \t\t\t \\n Line Feed (ASCII 10)\n"); fprintf( stderr, " \\r Carriage return (ASCII 13) \t \\r Carriage return (ASCII 13)\n"); fprintf( stderr, " \\[ ESC (ASCII 27) \t\t\t \\[ ESC (ASCII 27) \n"); fprintf( stderr, " \\o enable output (see -o) \n"); fprintf( stderr, " \\f disable output \n"); fprintf( stderr, "\n"); fprintf( stderr, "\t\t by Lou Guzik and Joe Yanni IS 2550 Final Project 1997 \n"); exit(1); } /* void usage( char *argv0 ) */ /***********************************************************************/ void minisend( int soc, char *str ) { unsigned int i = 0; unsigned int j = 0; if( DEBUG > 1 ) fprintf( stderr, "minisend() To SEND: %s \n", str); /* IF INPUT STRING IS NOT NULL */ if( str != '\0' ) { /* LOOP THROUGH STRING UNTIL THE END, IF CONTROL CHAR IS FOUND CONVERT IT AND ADJUST STR LENTH */ while( str[j] != '\0' ) { if( DEBUG > 3 ) fprintf( stderr, "str[%d]=%c ", j, str[j] ); /* IF THE CHAR IS \ IT COULD BE THE START OF A CONTROL CHAR */ if( str[j] == '\\' ) { /* INCR ADJUSTED STRING POINTER */ j++; /* LOOK FOR WHAT CONTROL CHAR IT IS AND CONVERT IT TO A ASCII VALUE*/ switch( str[j] ) { case '[': str[i]=27; break; case 'n': str[i]=10; break; case 'r': str[i]=13; break; case 't': str[i]=9; break; case '\\': str[i]='\\'; break; case 'o': dooutput=1; break; case 'f': dooutput=0; break; /* DEFAULT IS NOT A CONTROL CHAR SO CONTINUE THROUGH STRING */ default: j--; str[i] = str[j]; break; } /* switch( str[ j ] ) */ } /* if( str[j] == '\\' ) */ /* ELSE IT IS NOT A CONTROL CHAR, MAKE NO ADJUSTMENT TO STRING */ else { str[i] = str[j]; } /* INCREMENT INPUT AND ADJUSTED STRING POINTERS */ i++; j++; } /* while( str[j] != '\0' ) */ /* CLOSE THE END OF THE STRING */ str[i]='\0'; if( DEBUG ) fprintf( stderr, "\ntcp_send() SENDING: %s \n", str); /* WRITE TO REMOTE SOCKET */ write( soc, str, strlen(str) ); /* IF USER HAS SELECTED TO DISPLAY INPUT TO SEND< DISPLAY IT */ if( doinput ) { if(bold) printf("\033[4m"); printf("%s",str); if(bold) printf("\033[0m"); } } /* if( strcmp( s, "" ) != 0 ) */ } /* void minisend(int soc, char *s) */ /***********************************************************************/ void miniexpect( int soc, char *expected ) { char *chptr; char *buf; int exp=8; int i=0; int ch; unsigned int n=0; /* CONVERT \n NEW LINE CHAR IN EXPECTED STRING */ if( strcmp(expected, "\\n") == 0 ) { *(expected) = 10; *(expected+1) ='\0'; } /* CONVERT \r CR CHAR IN EXPECTED STRING */ if( strcmp(expected, "\\r") == 0 ) { *(expected) = 13; *(expected+1) ='\0'; } /* CONVERT \0 NULL CHAR IN EXPECTED STRING */ if( strcmp(expected, "\\0") == 0 ) { *(expected) = 0; *(expected+1) ='\0'; } /* CONVERT \[ ESC CHAR IN EXPECTED STRING */ if( strcmp(expected, "\\[") == 0 ) { *(expected) = 27; *(expected+1) ='\0'; } /* BUF IS A REALLOCED POINTER */ buf = (char*) malloc(1<%s<--\n\n",expected); if( DEBUG > 1 ) fprintf( stderr, "\n"); /* READ DATA UNTIL SOCKET IS CLOSED BY SERVER OR EXPECTED STRING IS FOUND */ while( n=read( soc, buf+i, (1< 2 ) fprintf( stderr, "%s\n", buf ); if( n <= 0 ) { if( DEBUG > 1 ) fprintf( stderr, "loop: n=0 \n"); break; } i += n; /* IF THE BUF IS FULL TO i,,exp SIZE THEN REALLOC THE BUF */ if( i == (1< 1 ) fprintf( stderr, "loop: strstr(buf=exp) \n"); *(buf+i) = '\0'; break; } } /* while( n=read( soc, buf+i, (1< 6 ) params_ok = params_ok | 100; /* PARSE THE COMMAND LINE PARAMETERS */ while( (ch=getopt(argc, argv, "doiI?p:f:h:")) != EOF ) { if( DEBUG ) fprintf( stderr, " %c", ch ); switch( ch ) { case 'd': DEBUG++; break; case 'o': dooutput=1; break; case 'i': doinput=1; break; case 'I': doinput=1; bold=1; break; /* TRY TO DO SOME CHECKING IF THE COMMAND LINE PARAMETERS ARE CORRECT */ case 'p': strcpy( port, optarg); params_ok = params_ok | 10; break; case 'f': strcpy( filename, optarg); break; /* TRY TO DO SOME CHECKING IF THE COMMAND LINE PARAMETERS ARE CORRECT */ case 'h': strcpy( host, optarg); params_ok = params_ok | 1; break; case '?': default: /* usage( argv[0] ); */ break; } /* switch( ch ) */ } /* while( (ch=getopt(argc, argv, "doiI?p:f:h:") != EOF ) */ if(DEBUG > 1) fprintf( stderr, "\nparams_ok=%d argc=%d\n", params_ok, argc); /* TRY TO DO SOME CHECKING IF THE COMMAND LINE PARAMETERS ARE CORRECT */ if( params_ok != 111 ) usage( argv[0] ); if(DEBUG) fprintf( stderr, "\nConnecting with %s, port %s ... ",host, port); /* OPEN THE SOCKET */ soc=connectsock( host, port, "tcp" ); if(DEBUG) fprintf( stderr, "-OK-\n"); /* SEND THE INPUT STRING */ if( strcmp(filename,"") == 0 ) { minisend( soc, argv[argc-2] ); miniexpect( soc, argv[argc-1] ); } /* ELSE IF INPUT FILE IS TO BE USED */ else { fp=fopen( filename, "r"); if( fp == NULL ) { fprintf( stderr, "Cannot open input file %s\n", filename); exit(4); } /* IF FILE IS EMPTY GO TO END */ if( feof(fp) ) goto end_loop; /* SET FLAG TO XMIT FOR THE FIRST TIME */ xmit=1; /* LOOP THROUGH EACH LINE IN THE FILE */ loop: fgets( str, 20000, fp ); /* IF END OF FILE GOTO END */ if( feof(fp) ) goto end_loop; /* REPLACE THE LAST \n TO NULL FOR OUTPUT TO STDOUT */ if( strchr(str,'\n') != NULL ) *(strchr( str, '\n')) = '\0'; /* IF NOT A COMMENT LINE OR NOT A BLANK LINE THEN PROCESS*/ if( *(str) != NULL && *(str) != '#' ) /* # is a comment */ { if( xmit ) { minisend( soc, str); /* TOGGLE FLAG FOR EXPECT */ xmit=0; } else { miniexpect( soc, str); /* TOGGLE FLAG FOR XMIT */ xmit=1; } } goto loop; end_loop: /* CLEANUP AND QUIT OUT OF PROGRAM */ fclose(fp); } close( soc ); return(0); } /* int main( int argc, char *argv[] ) */