#include #include #include #include #include #include "lonnet.h" /*lonnet.c (by Guy Albertelli); based on lonnet.pm by Gerd Kortemeyer*/ char *strsave(char *s) { char *p; if (s==NULL) {return s;} p=(char*)malloc(strlen(s)+1); strcpy(p,s); return (p); } int get_apache_config(char* key_word,char* value) { FILE *fp; int done=0,failed=0,num,found=0,i,j,result=-1,returnVal; char testkey[MAX_BUFFER_SIZE],testval[MAX_BUFFER_SIZE],c; if ((fp=fopen("/etc/httpd/conf/access.conf","r"))==NULL) { return (-1); } do { testkey[0]='\0';testval[0]='\0'; num = fscanf(fp,"PerlSetVar %s %s",testkey,testval); if (num == 2) { result = strcasecmp(testkey,key_word); //printf("num: %d:testkey:%s:testval:%s:\n",num,testkey,testval); } if (result==0) { done=1; } if (num==EOF) { failed=1; } found=0; if (num!=2) { while(1) { c=fgetc(fp); if (found) { if (c!='\n') { ungetc(c,fp); break; } } if (c=='\n') found=1; if (((char)c)==((char)EOF)) break; } } } while (!done && !failed); fclose(fp); /*strip out the " and \\ */ if (done) { for(i=0,j=0;i<(strlen(testval)+1);i++) { value[j]='\0'; if (testval[i] == '\\' && (i < (strlen(testval))) ) { i++;value[j]=testval[i];j++; } else if (testval[i] != '\"' ) { value[j]=testval[i];j++; } } value[j]='\0'; returnVal=j; } return returnVal; } char *subreply (char* cmd, char* server) { char *answer,*peerfile, *tempStr, inbuf[MAX_BUFFER_SIZE]; int sockFD, portFD, fromlen, length, totleng; struct sockaddr_un lonc; struct sockaddr_un from; answer=(char*)malloc(MAX_BUFFER_SIZE); answer[0]='\0'; length=strlen(lonSockDir)+strlen(peerfile)+3; peerfile=(char*)malloc(length); sprintf(peerfile,"%s/%s",lonSockDir,server); if (length > UNIX_PATH_MAX) { fprintf(stderr,"Path to socket too long:%d\n",length); sprintf(answer,"con_lost",length); return answer; } /* */ sockFD = socket (AF_UNIX, SOCK_STREAM, 0); strcpy(lonc.sun_path, peerfile); lonc.sun_family = AF_UNIX; if (bind (sockFD, (struct sockaddr *) &lonc, strlen(lonc.sun_path) + sizeof(lonc.sun_family))) { fprintf(stderr,"Bind failed to %s\n",peerfile); sprintf(answer,"con_lost",peerfile); return answer; } listen (sockFD, 10); portFD = accept (sockFD, (struct sockaddr *) &from, &fromlen); write(portFD, cmd, strlen(cmd)); while (1) { length=read(portFD, inbuf, MAX_BUFFER_SIZE); totleng = strlen(answer) + strlen(inbuf) + 1; tempStr = (char*)malloc(totleng); strcat(tempStr,answer); strcat(tempStr,inbuf); free(answer); answer = tempStr; if ( length != MAX_BUFFER_SIZE ) { break; } } /* */ return answer; } char * reply (char *cmd,char *server) { char *answer=NULL; answer=subreply(cmd,server); if (strcmp(answer,"con_lost")==0) { free(answer); answer=subreply(cmd,server); } return answer; } 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; } /* need - logthis - logperm - fullread */ int main() { char value[MAX_BUFFER_SIZE]; get_apache_config("lonSockDir",value); lonSockDir=strsave(value); printf("Found a value of:%s\n",value); printf("Reply: %s\n",reply("put akey:value","zaphod")); return 1; }