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 (24 years, 5 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_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>