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

1.1       albertel    1: #include <stdio.h>     
                      2: #include <sys/types.h>
                      3: #include <sys/socket.h>
1.2     ! albertel    4: #include <sys/un.h>
        !             5: #include <time.h>
        !             6: #include "lonnet.h"
1.1       albertel    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);
1.2     ! albertel   83:     sprintf(answer,"con_lost",length);
1.1       albertel   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);
1.2     ! albertel   95:     sprintf(answer,"con_lost",peerfile);
1.1       albertel   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);
1.2     ! albertel  123:   if (strcmp(answer,"con_lost")==0) { 
1.1       albertel  124:     free(answer);
                    125:     answer=subreply(cmd,server);
                    126:   }
                    127:   return answer;
                    128: }
                    129: 
1.2     ! albertel  130: char * critical(char* cmd, char* server) {
        !           131:   char *answer,*buf;
        !           132:   answer = reply(cmd,server);
        !           133:   if (strcmp(answer,"con_lost")==0) { 
        !           134:     /*no connection, the perl version attempts reconnect, I'll just save 
        !           135:       the message for loncron to send */
        !           136:     time_t now=time(NULL);
        !           137:     char middlename[MAX_BUFFER_SIZE]; /* string fromed from the cmd to 
        !           138: 					 make a uniqueish filename */
        !           139:     char filename[MAX_BUFFER_SIZE],*wcmd,*tempbuf;
        !           140:     int found=0,i,j;
        !           141: 
        !           142:     sprintf(filename,"%s/delayed/%d.%s.XXXXXX",lonSockDir,now,server);
        !           143:     outfile=mkstemp(filename);
        !           144:     fprintf(outfile,"%s:%s\n",server,cmd);
        !           145:     fflush(outfile);
        !           146:     fclose(outfile);
        !           147:     /* check to make sure it really did write the message */
        !           148:     outfile=fopen(filename,"r");
        !           149:     wcmd=fullread(outfile);
        !           150:     tempbuf=(char*)malloc(strlen(server)+1+strlen(cmd)+2);
        !           151:     sprintf(tempbuf,"%s:%s\n",server,cmd);
        !           152:     if (strcmp(tempbuf,wcmd)==0) {
        !           153: 	buf=(char*)malloc(strlen(wcmd)+strlen(filename)+MAX_BUFFER_LENGTH);
        !           154: 	sprintf(buf,"Connection buffer %s: %s",filename,cmd);
        !           155: 	logthis(buf);
        !           156: 	free(buf);
        !           157: 	buf=(char*)malloc(strlen(server)+strlen(cmd)+MAX_BUFFER_LENGTH);
        !           158: 	sprintf(buf,"D:%s:%s",server,cmd);
        !           159: 	logperm(buf);
        !           160: 	free(buf);
        !           161:     } else {
        !           162: 	buf=(char*)malloc(strlen(wcmd)+strlen(filename)+MAX_BUFFER_LENGTH);
        !           163: 	sprintf(buf,"CRITICAL CONNECTION FAILED: %s %s",server,cmd);
        !           164: 	logthis(buf);
        !           165: 	free(buf);
        !           166: 	buf=(char*)malloc(strlen(server)+strlen(cmd)+MAX_BUFFER_LENGTH);
        !           167: 	sprintf(buf,"F:%s:%s",server,cmd);
        !           168: 	logperm(buf);
        !           169: 	free(buf);
1.1       albertel  170:     }
1.2     ! albertel  171:   }
        !           172:   return answer;
1.1       albertel  173: }
                    174: 
                    175: /* need 
                    176:    - logthis
                    177:    - logperm
1.2     ! albertel  178:    - fullread
1.1       albertel  179: */
                    180:    
                    181: int main() {
                    182:   char value[MAX_BUFFER_SIZE];
                    183:   get_apache_config("lonSockDir",value);
                    184:   lonSockDir=strsave(value);
                    185: 
                    186:   printf("Found a value of:%s\n",value);
                    187:   printf("Reply: %s\n",reply("put akey:value","zaphod"));
                    188:   return 1;
                    189: }

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