File:  [LON-CAPA] / loncom / lonnet / c / lonnet.c
Revision 1.1: download - view: text, annotated - select for diffs
Tue Nov 23 19:27:17 1999 UTC (24 years, 7 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
- Initial revisions of the c version of lonnet.
- Currently non-functional

    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>