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>