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, 3 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
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <time.h>
#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;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>