--- loncom/lonnet/c/lonnet.c 1999/11/23 19:27:17 1.1 +++ loncom/lonnet/c/lonnet.c 1999/12/01 18:49:27 1.2 @@ -1,9 +1,9 @@ -#include "lonnet.h" #include #include #include -#include - +#include +#include +#include "lonnet.h" /*lonnet.c (by Guy Albertelli); based on lonnet.pm by Gerd Kortemeyer*/ @@ -80,7 +80,7 @@ char *subreply (char* cmd, char* server) if (length > UNIX_PATH_MAX) { fprintf(stderr,"Path to socket too long:%d\n",length); - sprintf(answer,"Path to socket too long:%d\n",length); + sprintf(answer,"con_lost",length); return answer; } @@ -92,7 +92,7 @@ char *subreply (char* cmd, char* server) if (bind (sockFD, (struct sockaddr *) &lonc, strlen(lonc.sun_path) + sizeof(lonc.sun_family))) { fprintf(stderr,"Bind failed to %s\n",peerfile); - sprintf(answer,"Bind failed to %s\n",peerfile); + sprintf(answer,"con_lost",peerfile); return answer; } @@ -120,79 +120,62 @@ char *subreply (char* cmd, char* server) char * reply (char *cmd,char *server) { char *answer=NULL; answer=subreply(cmd,server); - if (strcmp(answer,"con_lost")) { + if (strcmp(answer,"con_lost")==0) { free(answer); answer=subreply(cmd,server); } return answer; } -/* -sub subreply { - my ($cmd,$server)=@_; - my $peerfile="$perlvar{'lonSockDir'}/$server"; - my $client=IO::Socket::UNIX->new(Peer =>"$peerfile", - Type => SOCK_STREAM, - Timeout => 10) - or return "con_lost"; - print $client "$cmd\n"; - my $answer=<$client>; - chomp($answer); - if (!$answer) { $answer="con_lost"; } - return $answer; -} - -# ------------------------------------------------------ Critical communication -sub critical { - my ($cmd,$server)=@_; - &senddelayed($server); - my $answer=reply($cmd,$server); - if ($answer eq 'con_lost') { - my $pingreply=reply('ping',$server); - &reconlonc("$perlvar{'lonSockDir'}/$server"); - my $pongreply=reply('pong',$server); - &logthis("Ping/Pong for $server: $pingreply/$pongreply"); - $answer=reply($cmd,$server); - if ($answer eq 'con_lost') { - my $now=time; - my $middlename=$cmd; - $middlename=~s/\W//g; - my $dfilename= - "$perlvar{'lonSockDir'}/delayed/$now.$middlename.$server"; - { - my $dfh; - if ($dfh=Apache::File->new(">$dfilename")) { - print $dfh "$server:$cmd\n"; - } - } - sleep 2; - my $wcmd=''; - { - my $dfh; - if ($dfh=Apache::File->new("$dfilename")) { - $wcmd=<$dfh>; - } - } - chomp($wcmd); - if ($wcmd eq "$server:$cmd") { - &logthis("Connection buffer $dfilename: $cmd"); - &logperm("D:$server:$cmd"); - return 'con_delayed'; - } else { - &logthis("CRITICAL CONNECTION FAILED: $server $cmd"); - &logperm("F:$server:$cmd"); - return 'con_failed'; - } - } +char * critical(char* cmd, char* server) { + char *answer,*buf; + answer = reply(cmd,server); + if (strcmp(answer,"con_lost")==0) { + /*no connection, the perl version attempts reconnect, I'll just save + the message for loncron to send */ + time_t now=time(NULL); + char middlename[MAX_BUFFER_SIZE]; /* string fromed from the cmd to + make a uniqueish filename */ + char filename[MAX_BUFFER_SIZE],*wcmd,*tempbuf; + int found=0,i,j; + + sprintf(filename,"%s/delayed/%d.%s.XXXXXX",lonSockDir,now,server); + outfile=mkstemp(filename); + fprintf(outfile,"%s:%s\n",server,cmd); + fflush(outfile); + fclose(outfile); + /* check to make sure it really did write the message */ + outfile=fopen(filename,"r"); + wcmd=fullread(outfile); + tempbuf=(char*)malloc(strlen(server)+1+strlen(cmd)+2); + sprintf(tempbuf,"%s:%s\n",server,cmd); + if (strcmp(tempbuf,wcmd)==0) { + buf=(char*)malloc(strlen(wcmd)+strlen(filename)+MAX_BUFFER_LENGTH); + sprintf(buf,"Connection buffer %s: %s",filename,cmd); + logthis(buf); + free(buf); + buf=(char*)malloc(strlen(server)+strlen(cmd)+MAX_BUFFER_LENGTH); + sprintf(buf,"D:%s:%s",server,cmd); + logperm(buf); + free(buf); + } else { + buf=(char*)malloc(strlen(wcmd)+strlen(filename)+MAX_BUFFER_LENGTH); + sprintf(buf,"CRITICAL CONNECTION FAILED: %s %s",server,cmd); + logthis(buf); + free(buf); + buf=(char*)malloc(strlen(server)+strlen(cmd)+MAX_BUFFER_LENGTH); + sprintf(buf,"F:%s:%s",server,cmd); + logperm(buf); + free(buf); } - return $answer; + } + return answer; } -*/ /* need - logthis - logperm - - reconlonc, maybe, don't absolutely need to make critical reconnect + - fullread */ int main() {