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>