Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!crdgw1!uunet!mcsun!cernvax!cernvax.cern.ch From: burow@cernvax.cern.ch (burkhard burow) Newsgroups: comp.sys.sgi Subject: tftp from C Message-ID: <5538@cernvax.cern.ch> Date: 4 Jun 91 07:12:39 GMT Sender: burow@cernvax.cern.ch Organization: CERN, European Laboratory for Particle Physics Lines: 113 I have some hardware with which I can only communicate via tftp. Communicating with this hw is part of a larger user interface. The question is: How can I best call tftp from within a C program? My forebearers (sp?) threw together a system where each access spawns an instance of tftp via e.g. : ierr = system("tftp 133.178.32.111 output_log"); : I'd like to make this a bit faster, more elegant, check the tftp output without having to poll the output_log file, ... I know of two soln.'s: i) Call the internal routines of tftp directly. My copy of Unix_Network_Programming includes code for a tftp implementation. I could type this in and hope for the best but best would be ... COULD SGI PROVIDE ME WITH THE SOURCE CODE TO TFTP? ii) I have used Mark Bartelt's (mark@cita.toronto.edu) code which he posted ~month ago, modified and appended below, to spawn tftp once and then feed it input and obtain the output within a C program. Feeding it input works, but the output seems to be buffered, so cannot observe tftp's response to individual commands. [In the example below I've put in some debug code, and yes I know that if I don't read out tftp's output I've got to feed it to a file or /dev/null so that it doesn't block.] QQQQ: Is there some way to spawn a process and force it's stdout buffer to be unbuffered? I think I prefer tftp source code, or equivalently the 'library', as a soln. to this problem, but an answer to the second question could be useful in other situations. [i.e. where a utility's source is not readily obtainable.] Thanks for any and all info. or pointers. I will forward info. to those who request. burkhard ----------------------cut here for mark's code--------------------------------- /* * Parent process -- reads a line from stdin, sends it to * child, reads a line back from child, sends it to stdout */ #include #define PCR p_to_c[0] /* parent-to-child pipe, read fd */ #define PCW p_to_c[1] /* parent-to-child pipe, write fd */ #define CPR c_to_p[0] /* child-to-parent pipe, read fd */ #define CPW c_to_p[1] /* child-to-parent pipe, write fd */ #define BUFSIZE 200 main() { int p_to_c[2]; int c_to_p[2]; int fk; FILE * to_child; FILE * from_child; char buf[BUFSIZE]; pipe(p_to_c); pipe(c_to_p); if ( (fk=fork()) == 0 ) { /* Child process only */ dup2(PCR,0); dup2(CPW,1); } close(PCR); /* Both processes */ close(CPW); if ( fk == 0 ) { /* Child process only */ close(PCW); close(CPR); /* execl("./sqrt","sqrt",0);*/ execl("/usr/bsd/tftp","tftp",0); /* execl("/usr/local/bin/less","less",0);*/ fprintf(stderr,"sqrt exec failure\\n"); exit(-1); } to_child = fdopen(PCW,"w"); /* Parent process only */ from_child = fdopen(CPR,"r"); setlinebuf(to_child); puts("1"); while ( fgets(buf,BUFSIZE,stdin) != NULL ) { puts("2"); fputs(buf,to_child); puts("3"); /* fgets(buf,BUFSIZE,from_child); puts("4"); fputs(buf,stdout); puts("5");*/ {int i; while (i=getc(from_child) != '>') putchar(i);} } puts("6"); fclose(to_child); fclose(from_child); }