/* sample child process */ #define MAXARG 15 #include #include #include main() { extern int os9forkc(); extern char **environ; char *argblk[MAXARG]; char argument[MAXARG][32]; static int sock = 0; /* file discriptor for socket input */ int retval; int pipe_in; char message[512]; char replay[512]; static char response[] = "I am sending response"; static char bad_command[] = "bad command"; int i, ii, j, k, inword; char c; int com_id, first_arg; int pathout1, patherr1, PipePath; retval = read(sock, message, sizeof message); if (retval < 0) fprintf(stderr,"Error at getting message\n"); message[retval] = '\0'; inword = 0; for(i = 0, j = -1; (c = message[i]) != '\0'; i++){ if (c != ' '){ if (!inword){ j++; k = 0; argument[j][k++] = c; } else argument[j][k++] = c; inword = 1; } else { if(inword) argument[j][k] = '\0'; inword = 0; if ( j == ( MAXARG -1 )) break; } } first_arg = 1; /********************** Correzione fatta per permettere di leggere la pressione a Jamagdi 30/7/94 */ if (strcmp(&argument[0][0],"zibibbo") && strcmp(&argument[0][0],"pressione") ){ setTRUNid(); } if (strcmp(&argument[0][0],"zibibbo")) first_arg = 0; for ( i = first_arg, ii=0; i < j + 1; i++, ii++){ argblk[ii] = &argument[i][0]; } argblk[ii] = 0; if (i < 1){ printf(" bad command received \n"); exit(0); } /* change the paths */ pathout1 = dup(1); patherr1 = dup(2); close(1); close(2); if( open("/PIPE", S_IREAD+S_IWRITE) == -1 ){ exit(_errmsg(errno ," cannot create sampl \n")); } dup(1); if ((com_id = os9exec(os9forkc,argblk[0],argblk,environ,0,0,3)) == -1){ retval = write(sock, bad_command, sizeof bad_command); if (retval < 0) fprintf(stderr,"Error at sending message\n"); retval = read(sock, message, sizeof message); if (retval < 0) fprintf(stderr,"Error at getting message\n"); message[retval] = '\0'; if (strcmp(message,"ROGER") != 0) fprintf(stderr," bad Aknowledgement: %s\n"); retval = write(sock, "FINE", strlen("FINE")); if (retval < 0) fprintf(stderr,"Error at sending message\n"); exit(_errmsg(-1 ," error returned from os9exec(%s) \n", argblk[0])); } PipePath = dup(1); close(1); close(2); dup(pathout1); dup(patherr1); close (pathout1); close (patherr1); while( (retval = readln (PipePath, replay, 512)) > 0){ if (replay[retval-1] == '\n') replay[retval-1] = '\0'; retval = write(sock, replay, retval); if (retval < 0) fprintf(stderr,"Error at sending message\n"); retval = read(sock, message, sizeof message); if (retval < 0) fprintf(stderr,"Error at getting message\n"); message[retval] = '\0'; if (strcmp(message,"ROGER") != 0) fprintf(stderr," bad Aknowledgement: %s\n"); } retval = write(sock, "FINE", strlen("FINE")); if (retval < 0) fprintf(stderr,"Error at sending message\n"); /* retval = write(sock, bad_command, sizeof bad_command); if (retval < 0) fprintf(stderr,"Error at sending message\n"); retval = write(sock, "FINE", strlen("FINE")); if (retval < 0) fprintf(stderr,"Error at sending message\n"); retval = read(sock, message, sizeof message); if (retval < 0) fprintf(stderr,"Error at getting message\n"); message[retval] = '\0'; if (strcmp(message,"ROGER") != 0) fprintf(stderr," bad Aknowledgement: %s\n"); */ exit(); } setTRUNid() /* set UID to [1.0] if current user is SUPER */ { int i; i = getuid() & 0xFFFFFFFF; i = (( i & 0xFFFF0000 ) >> 16 ); if( !i ) { i = ( ( 1 << 16 ) | 0 ) & 0xFFFFFFFF; i = setuid( i ); } }