tftp from C
burkhard burow
burow at cernvax.cern.ch
Tue Jun 4 17:12:39 AEST 1991
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 <input_instruction_file >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 at 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 <stdio.h>
#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);
}
More information about the Comp.sys.sgi
mailing list