--- 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() { 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.