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 (25 years, 2 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_6_msu,
version_2_11_6,
version_2_11_5_msu,
version_2_11_5,
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>