Annotation of loncom/lonnet/c/lonnet.c, revision 1.1
1.1 ! albertel 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>