File:  [LON-CAPA] / loncom / lonnet / c / lonnet.c
Revision 1.2: download - view: text, annotated - select for diffs
Wed Dec 1 18:49:27 1999 UTC (24 years, 6 months ago) by albertel
Branches: MAIN
CVS tags: version_2_9_X, version_2_9_99_0, version_2_9_1, version_2_9_0, version_2_8_X, version_2_8_99_1, version_2_8_99_0, version_2_8_2, version_2_8_1, version_2_8_0, version_2_7_X, version_2_7_99_1, version_2_7_99_0, version_2_7_1, version_2_7_0, version_2_6_X, version_2_6_99_1, version_2_6_99_0, version_2_6_3, version_2_6_2, version_2_6_1, version_2_6_0, version_2_5_X, version_2_5_99_1, version_2_5_99_0, version_2_5_2, version_2_5_1, version_2_5_0, version_2_4_X, version_2_4_99_0, version_2_4_2, version_2_4_1, version_2_4_0, version_2_3_X, version_2_3_99_0, version_2_3_2, version_2_3_1, version_2_3_0, version_2_2_X, version_2_2_99_1, version_2_2_99_0, version_2_2_2, version_2_2_1, version_2_2_0, version_2_1_X, version_2_1_99_3, version_2_1_99_2, version_2_1_99_1, version_2_1_99_0, version_2_1_3, version_2_1_2, version_2_1_1, version_2_1_0, version_2_12_X, version_2_11_X, version_2_11_4_uiuc, version_2_11_4_msu, version_2_11_4, version_2_11_3_uiuc, version_2_11_3_msu, version_2_11_3, version_2_11_2_uiuc, version_2_11_2_msu, version_2_11_2_educog, version_2_11_2, version_2_11_1, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0_RC1, version_2_10_0, version_2_0_X, version_2_0_99_1, version_2_0_2, version_2_0_1, version_2_0_0, version_1_99_3, version_1_99_2, version_1_99_1_tmcc, version_1_99_1, version_1_99_0_tmcc, version_1_99_0, version_1_3_X, version_1_3_3, version_1_3_2, version_1_3_1, version_1_3_0, version_1_2_X, version_1_2_99_1, version_1_2_99_0, version_1_2_1, version_1_2_0, version_1_1_X, version_1_1_99_5, version_1_1_99_4, version_1_1_99_3, version_1_1_99_2, version_1_1_99_1, version_1_1_99_0, version_1_1_3, version_1_1_2, version_1_1_1, version_1_1_0, version_1_0_99_3, version_1_0_99_2, version_1_0_99_1, version_1_0_99, version_1_0_3, version_1_0_2, version_1_0_1, version_1_0_0, version_0_99_5, version_0_99_4, version_0_99_3, version_0_99_2, version_0_99_1, version_0_99_0, version_0_6_2, version_0_6, version_0_5_1, version_0_5, version_0_4, stable_2002_spring, stable_2002_july, stable_2002_april, stable_2001_fall, loncapaMITrelate_1, language_hyphenation_merge, language_hyphenation, conference_2003, bz6209-base, bz6209, bz5969, bz2851, STABLE, PRINT_INCOMPLETE_base, PRINT_INCOMPLETE, LATEST, HEAD, GCI_3, GCI_2, GCI_1, Bacillus, BZ5971-printing-apage, BZ5434-fox, BZ4492-merge, BZ4492-feature_horizontal_radioresponse, Aquifex
- critical() is written but needs other functions to be done

    1: #include <stdio.h>     
    2: #include <sys/types.h>
    3: #include <sys/socket.h>
    4: #include <sys/un.h>
    5: #include <time.h>
    6: #include "lonnet.h"
    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,"con_lost",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,"con_lost",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")==0) { 
  124:     free(answer);
  125:     answer=subreply(cmd,server);
  126:   }
  127:   return answer;
  128: }
  129: 
  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);
  170:     }
  171:   }
  172:   return answer;
  173: }
  174: 
  175: /* need 
  176:    - logthis
  177:    - logperm
  178:    - fullread
  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>