Annotation of loncom/lonnet/c/lonnet.c, revision 1.1

1.1     ! albertel    1: #include "lonnet.h"
        !             2: #include <stdio.h>     
        !             3: #include <sys/types.h>
        !             4: #include <sys/socket.h>
        !             5: #include <linux/un.h>
        !             6: 
        !             7: 
        !             8: /*lonnet.c (by Guy Albertelli); based on lonnet.pm by Gerd Kortemeyer*/
        !             9: 
        !            10: char *strsave(char *s) 
        !            11: {            
        !            12:    char *p;  
        !            13:    if (s==NULL) {return s;}
        !            14:    p=(char*)malloc(strlen(s)+1);
        !            15:    strcpy(p,s);
        !            16:    return (p);
        !            17: }
        !            18: 
        !            19: int get_apache_config(char* key_word,char* value) {
        !            20:   FILE *fp;
        !            21:   int done=0,failed=0,num,found=0,i,j,result=-1,returnVal;
        !            22:   char testkey[MAX_BUFFER_SIZE],testval[MAX_BUFFER_SIZE],c;
        !            23: 
        !            24:   if ((fp=fopen("/etc/httpd/conf/access.conf","r"))==NULL) { return (-1); }
        !            25:   
        !            26:   do {
        !            27:     testkey[0]='\0';testval[0]='\0';
        !            28:     num = fscanf(fp,"PerlSetVar %s %s",testkey,testval);
        !            29:     if (num == 2) { 
        !            30:       result = strcasecmp(testkey,key_word); 
        !            31:       //printf("num: %d:testkey:%s:testval:%s:\n",num,testkey,testval);
        !            32:     }
        !            33:     if (result==0) { done=1; }
        !            34: 
        !            35:     if (num==EOF) { failed=1; }
        !            36:     found=0;
        !            37:     if (num!=2) {
        !            38:       while(1) {
        !            39: 	c=fgetc(fp);
        !            40: 	if (found) {
        !            41: 	  if (c!='\n') {
        !            42: 	    ungetc(c,fp);
        !            43: 	    break;
        !            44: 	  }
        !            45: 	}
        !            46: 	if (c=='\n') found=1;
        !            47: 	if (((char)c)==((char)EOF)) break;
        !            48:       }
        !            49:     }
        !            50:   } while (!done && !failed);
        !            51:   fclose(fp);
        !            52:   
        !            53:   /*strip out the " and \\ */
        !            54:   if (done) {
        !            55:     for(i=0,j=0;i<(strlen(testval)+1);i++) {
        !            56:       value[j]='\0';
        !            57:       if (testval[i] == '\\' && (i < (strlen(testval))) ) {
        !            58: 	i++;value[j]=testval[i];j++;
        !            59:       } else if (testval[i] != '\"' ) {
        !            60: 	value[j]=testval[i];j++;
        !            61:       }
        !            62:     }
        !            63:     value[j]='\0';
        !            64:     returnVal=j;
        !            65:   }
        !            66:   return returnVal;
        !            67: }
        !            68: 
        !            69: char *subreply (char* cmd, char* server) {
        !            70:   char *answer,*peerfile, *tempStr, inbuf[MAX_BUFFER_SIZE];
        !            71:   int sockFD, portFD, fromlen, length, totleng;
        !            72:   struct sockaddr_un lonc;
        !            73:   struct sockaddr_un from;
        !            74:   
        !            75:   answer=(char*)malloc(MAX_BUFFER_SIZE);
        !            76:   answer[0]='\0';
        !            77:   length=strlen(lonSockDir)+strlen(peerfile)+3;
        !            78:   peerfile=(char*)malloc(length);
        !            79:   sprintf(peerfile,"%s/%s",lonSockDir,server);
        !            80:   
        !            81:   if (length > UNIX_PATH_MAX) {
        !            82:     fprintf(stderr,"Path to socket too long:%d\n",length);
        !            83:     sprintf(answer,"Path to socket too long:%d\n",length);
        !            84:     return answer;
        !            85:   }
        !            86: 
        !            87:   /*
        !            88:    */
        !            89:   sockFD = socket (AF_UNIX, SOCK_STREAM, 0);
        !            90:   strcpy(lonc.sun_path, peerfile);
        !            91:   lonc.sun_family = AF_UNIX;
        !            92:   if (bind (sockFD, (struct sockaddr *) &lonc,
        !            93: 	    strlen(lonc.sun_path) + sizeof(lonc.sun_family))) {
        !            94:     fprintf(stderr,"Bind failed to %s\n",peerfile);
        !            95:     sprintf(answer,"Bind failed to %s\n",peerfile);
        !            96:     return answer;
        !            97:   }
        !            98:   
        !            99:   listen (sockFD, 10);
        !           100:   portFD = accept (sockFD, (struct sockaddr *) &from, &fromlen);
        !           101:   
        !           102:   write(portFD, cmd, strlen(cmd));
        !           103:   
        !           104:   while (1) {
        !           105:     length=read(portFD, inbuf, MAX_BUFFER_SIZE);
        !           106:     totleng = strlen(answer) + strlen(inbuf) + 1;
        !           107:     tempStr = (char*)malloc(totleng);
        !           108:     strcat(tempStr,answer);
        !           109:     strcat(tempStr,inbuf);
        !           110:     free(answer);  
        !           111:     answer = tempStr;
        !           112:     if ( length != MAX_BUFFER_SIZE ) { break; }
        !           113:   }
        !           114:   /*
        !           115:    */
        !           116: 
        !           117:   return answer;
        !           118: }
        !           119: 
        !           120: char * reply (char *cmd,char *server) {
        !           121:   char *answer=NULL;
        !           122:   answer=subreply(cmd,server);
        !           123:   if (strcmp(answer,"con_lost")) { 
        !           124:     free(answer);
        !           125:     answer=subreply(cmd,server);
        !           126:   }
        !           127:   return answer;
        !           128: }
        !           129: 
        !           130: /*
        !           131: sub subreply {
        !           132:     my ($cmd,$server)=@_;
        !           133:     my $peerfile="$perlvar{'lonSockDir'}/$server";
        !           134:     my $client=IO::Socket::UNIX->new(Peer    =>"$peerfile",
        !           135:                                      Type    => SOCK_STREAM,
        !           136:                                      Timeout => 10)
        !           137:        or return "con_lost";
        !           138:     print $client "$cmd\n";
        !           139:     my $answer=<$client>;
        !           140:     chomp($answer);
        !           141:     if (!$answer) { $answer="con_lost"; }
        !           142:     return $answer;
        !           143: }
        !           144: 
        !           145: # ------------------------------------------------------ Critical communication
        !           146: sub critical {
        !           147:     my ($cmd,$server)=@_;
        !           148:     &senddelayed($server);
        !           149:     my $answer=reply($cmd,$server);
        !           150:     if ($answer eq 'con_lost') {
        !           151:         my $pingreply=reply('ping',$server);
        !           152: 	&reconlonc("$perlvar{'lonSockDir'}/$server");
        !           153:         my $pongreply=reply('pong',$server);
        !           154:         &logthis("Ping/Pong for $server: $pingreply/$pongreply");
        !           155:         $answer=reply($cmd,$server);
        !           156:         if ($answer eq 'con_lost') {
        !           157:             my $now=time;
        !           158:             my $middlename=$cmd;
        !           159:             $middlename=~s/\W//g;
        !           160:             my $dfilename=
        !           161:              "$perlvar{'lonSockDir'}/delayed/$now.$middlename.$server";
        !           162:             {
        !           163:              my $dfh;
        !           164:              if ($dfh=Apache::File->new(">$dfilename")) {
        !           165:                 print $dfh "$server:$cmd\n";
        !           166: 	     }
        !           167:             }
        !           168:             sleep 2;
        !           169:             my $wcmd='';
        !           170:             {
        !           171: 	     my $dfh;
        !           172:              if ($dfh=Apache::File->new("$dfilename")) {
        !           173:                 $wcmd=<$dfh>;
        !           174: 	     }
        !           175:             }
        !           176:             chomp($wcmd);
        !           177:             if ($wcmd eq "$server:$cmd") {
        !           178: 		&logthis("Connection buffer $dfilename: $cmd");
        !           179:                 &logperm("D:$server:$cmd");
        !           180: 	        return 'con_delayed';
        !           181:             } else {
        !           182:                 &logthis("CRITICAL CONNECTION FAILED: $server $cmd");
        !           183:                 &logperm("F:$server:$cmd");
        !           184:                 return 'con_failed';
        !           185:             }
        !           186:         }
        !           187:     }
        !           188:     return $answer;
        !           189: }
        !           190: */
        !           191: 
        !           192: /* need 
        !           193:    - logthis
        !           194:    - logperm
        !           195:    - reconlonc, maybe, don't absolutely need to make critical reconnect
        !           196: */
        !           197:    
        !           198: int main() {
        !           199:   char value[MAX_BUFFER_SIZE];
        !           200:   get_apache_config("lonSockDir",value);
        !           201:   lonSockDir=strsave(value);
        !           202: 
        !           203:   printf("Found a value of:%s\n",value);
        !           204:   printf("Reply: %s\n",reply("put akey:value","zaphod"));
        !           205:   return 1;
        !           206: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>