DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T i ┃
Length: 7773 (0x1e5d) Types: TextFile Names: »input_sh_f.c«
└─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6 └─ ⟦0c25cb74a⟧ »DATA« └─⟦038380b96⟧ └─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7 └─ ⟦f494b5154⟧ »DATA« └─⟦038380b96⟧ └─ ⟦this⟧ »input_sh_f.c« └─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6 └─ ⟦0c25cb74a⟧ »DATA« └─⟦0732ea0cf⟧ └─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7 └─ ⟦f494b5154⟧ »DATA« └─⟦0732ea0cf⟧ └─ ⟦this⟧ »../../dtia/release_apollo_2.1/input_sh_f.c« └─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6 └─ ⟦0c25cb74a⟧ »DATA« └─⟦25fab149a⟧ └─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7 └─ ⟦f494b5154⟧ »DATA« └─⟦25fab149a⟧ └─ ⟦this⟧ »../../dtia/release_sun_2.1/input_sh_f.c« └─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6 └─ ⟦0c25cb74a⟧ »DATA« └─⟦be254d495⟧ └─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7 └─ ⟦f494b5154⟧ »DATA« └─⟦be254d495⟧ └─ ⟦this⟧ »../../dtia/release_aix_2.1/input_sh_f.c« └─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6 └─ ⟦0c25cb74a⟧ »DATA« └─⟦c67979795⟧ └─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7 └─ ⟦f494b5154⟧ »DATA« └─⟦c67979795⟧ └─ ⟦this⟧ »../../dtia/release_hp_2.1/input_sh_f.c«
#ifndef lint #ifndef DEBUG static char SCCS_id[] = "@(#)input_sh_f.c 2.1 90/08/02 19:04:59 Copyright(c) 1990 by Rational."; #else static char SCCS_id[] = "@(#)input_sh_f.c DEBUG 2.1 90/08/02 19:04:59 Copyright(c) 1990 by Rational."; #endif #endif #define INPUT_SH_F #include "talk.h" #undef INPUT_SH_F extern int errno; static int error_number= E_OK; static int timeout=0; static int interrupted=FALSE; void fct_SIGALRM() { #ifdef DEBUG1 trace_msg("INTERRUPTED (SIGALRM)\n"); #endif interrupted=TRUE; } static int what_to_do(fin,fout) { int field; char *input; do { if (rw_read_int(fin,&field)== -1) return -1; switch (field) { case F_INPUT: if (rw_read_str(fin,&input)== -1) return -1; #ifdef DEBUG trace_string("in","Std_Input",input); #endif if (some_input_to_remote_shell( FALSE, input, (int *)NULL)== -1) return -1; break; case F_ABORT: #ifdef DEBUG trace_msg("\tABORT\n"); #endif if (kill_remote_shell()== -1) return -1; break; case F_CONTINUE: break; default: return E_INTERNAL_ERROR; } } while (field==F_INPUT); return field; } int timeout_fct(fin,fout) { if (rw_write_int(fout,F_TIMEOUT)== -1) return -1; switch (what_to_do(fin,fout)) { case F_ABORT: return E_COMMAND_TIMED_OUT; case F_CONTINUE: return E_OK; default: return E_INTERNAL_ERROR; } } int wr_output(fin,fout,s,lg) int fin,fout; char *s; int lg; { #ifdef DEBUG trace_bnd_string("out","Std_Output",s,lg); #endif if (rw_write_int(fout,F_STD_OUTPUT)== -1) return -1; if (rw_write_str_bnd(fout,s,lg)== -1) return -1; switch (what_to_do(fin,fout)) { case F_ABORT: case F_CONTINUE: return E_OK; default: return -1; } } static int wr_error(fin,fout,s,lg) int fin,fout; char *s; int lg; { #ifdef DEBUG trace_bnd_string("out","Std_Error",s,lg); #endif if (rw_write_int(fout,F_STD_ERROR)== -1) return -1; if (rw_write_str_bnd(fout,s,lg)== -1) return -1; switch (what_to_do(fin,fout)) { case F_ABORT: case F_CONTINUE: return E_OK; default: return -1; } } static void fill_string(s,n1,n2) char *s; int n1,n2; { char *p; for (p=s;(*p!='X') && (*p!='\0');p++); if (*p == '\0') return; sprintf(p,"%-6d",n1); for (p=p+6,*p=' ';(*p!='X') && (*p!='\0');p++); if (*p == '\0') return; sprintf(p,"%-6d",n2); } int input_to_shell_f_input_in(str,init_done) char *str; int *init_done; { #define NIL_STR_STOP ";kill -XXXXXX XXXXXX" #define CSH_STR_STOP ";set exit_status=$status;kill -XXXXXX XXXXXX" #define KSH_STR_STOP ";exit_status=$?;kill -XXXXXX XXXXXX" #define SH_STR_STOP ";exit_status=$?;kill -XXXXXX XXXXXX" int error; static char nil_str_stop[]=NIL_STR_STOP; static char csh_str_stop[]=CSH_STR_STOP; static char ksh_str_stop[]=KSH_STR_STOP; static char sh_str_stop[]=SH_STR_STOP; char *str_stop; if (is_bourneshell()) { strcpy(sh_str_stop,SH_STR_STOP); fill_string(sh_str_stop,SIGALRM,getpid()); str_stop = sh_str_stop; } else if (is_kshell()) { strcpy(csh_str_stop,KSH_STR_STOP); fill_string(ksh_str_stop,SIGALRM,getpid()); str_stop = ksh_str_stop; } else if (is_cshell()) { strcpy(csh_str_stop,CSH_STR_STOP); fill_string(csh_str_stop,SIGALRM,getpid()); str_stop = csh_str_stop; } else { strcpy(nil_str_stop,NIL_STR_STOP); fill_string(nil_str_stop,SIGALRM,getpid()); str_stop = nil_str_stop; } error_number = E_OK; error = some_input_to_remote_shell(TRUE,str,init_done); if (error == -1) error_number = errno; interrupted = FALSE; signal(SIGALRM,fct_SIGALRM); if (error == E_OK) { error = some_input_to_remote_shell( FALSE, str_stop, (int *)NULL); if (error == E_OK) error = some_input_to_remote_shell( FALSE, "\n", (int *)NULL); if (error == -1) error_number = errno; } return E_OK; } int input_to_shell_f_timeout_in(i) int i; { timeout=i; return E_OK; } static int synchro(fin,fout) int fin,fout; { fd_set mask_r; struct timeval time_out; /* this is to make sure no trailing output arrives after the interrupt */ /* in case the interrupt (thought it is sent after) arrives before */ /* the ouput message (sent before) */ while (1) { #ifdef DEBUG1 trace_msg("Top Level Synchro\n"); #endif time_out.tv_sec=0; time_out.tv_usec=1000; FD_ZERO(&mask_r); set_remote_shell_masks_rw(&mask_r,(fd_set *)NULL); switch (select(getdtablesize(),&mask_r,(fd_set *)NULL, (fd_set *)NULL, &time_out)) { case -1: #ifdef DEBUG1 trace_msg("Synchro Select returns <-1>\n"); #endif return E_INTERNAL_ERROR; case 0: #ifdef DEBUG1 trace_msg("Synchro Select returns <0>\n"); #endif return E_OK; default: #ifdef DEBUG1 trace_msg("Synchro Select returns < >0 >\n"); #endif if (is_it_remote_shell_read(&mask_r)) { if (read_remote_shell(&mask_r,wr_output, wr_error,fin,fout)== -1) { #ifdef DEBUG1 trace_msg("Synchro Read_Remote_Shell returns <-1>\n"); #endif return E_INTERNAL_ERROR; } } } } } static jmp_buf critical_env; static void critical_alrm() { #ifdef DEBUG1 trace_msg("CRITICAL "); #endif fct_SIGALRM(); longjmp(critical_env,1); } int input_to_shell_f_end(fin,fout) int fin,fout; { static fd_set mask_r; struct timeval time_start; struct timeval time_current; struct timeval time_out; long elapsed_time; int ret_select; if (error_number != E_OK) return error_number; else { gettimeofday(&time_start,(struct timezone *)NULL); while (1) { #ifdef DEBUG1 trace_msg("Top Level Input_To_Shell_F_End\n"); #endif FD_ZERO(&mask_r); set_remote_shell_masks_rw(&mask_r,(fd_set *)NULL); gettimeofday(&time_current,(struct timezone *)NULL); elapsed_time=time_current.tv_sec-time_start.tv_sec; if (elapsed_time>(long)timeout) elapsed_time=(long)timeout; time_out.tv_sec=(long)(timeout-elapsed_time); time_out.tv_usec=(long)0; if (time_out.tv_sec > MAXTVSEC) time_out.tv_sec=MAXTVSEC; if (elapsed_time==(long)timeout) { FD_ZERO(&mask_r); } #ifdef DEBUG1 trace_msg("Input_To_Shell_F_End Before Critical Section\n"); #endif if (interrupted) return synchro(fin,fout); else { if (setjmp(critical_env) == 0) { #ifdef DEBUG1 trace_msg("Critical Env Set\n"); #endif signal(SIGALRM,critical_alrm); if (interrupted) { signal(SIGALRM,fct_SIGALRM); return synchro(fin,fout); } else { #ifdef DEBUG1 trace_msg("Input_To_Shell_F_End Before Select\n"); #endif if (is_eof_reached()) { signal(SIGALRM,fct_SIGALRM); return E_OK; } else { ret_select = select( getdtablesize(), &mask_r, (fd_set *)NULL, (fd_set *)NULL, &time_out ); } signal(SIGALRM,fct_SIGALRM); } } else { #ifdef DEBUG1 trace_msg("Returning From Critical Section\n"); #endif signal(SIGALRM,fct_SIGALRM); return synchro(fin,fout); } } #ifdef DEBUG1 trace_msg2("Ret_Select is <%d>\n",ret_select); #endif switch (ret_select) { case -1: #ifdef DEBUG1 trace_msg("Input_To_Shell_F_End Select returns <-1>\n"); #endif if (errno==EINTR) { /* Probably the SIGALRM */ if (interrupted) return synchro(fin,fout); } return errno; case 0: #ifdef DEBUG1 trace_msg("Input_To_Shell_F_End Select returns <0>\n"); #endif /* TIMEOUT */ error_number = timeout_fct(fin,fout); if (error_number == E_OK) gettimeofday(&time_start, (struct timezone *)NULL); else return error_number; break; default: #ifdef DEBUG1 trace_msg("Input_To_Shell_F_End Select returns < >0 >\n"); #endif if (read_remote_shell(&mask_r, wr_output,wr_error, fin,fout)== -1) { #ifdef DEBUG1 trace_msg("Input_To_Shell_F_End Read_Remote_Shell returns <-1>\n"); #endif return errno; } } } } }