Exemplo n.º 1
0
dynamic_array_t *config_file_read (const char *filename){
  char key[MAX_LINE_LENGTH];
  char tail[MAX_LINE_LENGTH];
  char buffer[MAX_LINE_LENGTH];
  char format[MAX_LINE_LENGTH];
  int status;
  int token=0;
  int comment=0;
  int offset=0;
  char *s;
  dynamic_array_t *a;
  FILE *stream;

  extern int errno;

  if(filename==NULL) return(NULL);
  if((stream=fopen(filename, "r"))==NULL){
    return(NULL);
  }

  if((a=dynamic_array_create((size_t)0))==NULL){
    fprintf(stderr, "config_file_read: dynamic_array_create\n");
    return(NULL);
  }
  /*insert a dummy argv[0] into the dynamic array*/
  if((a=dynamic_array_add_element(a, "", DESTROY_STR, DUP_STR))==NULL){
    fprintf(stderr, "config_file_read: dynamic_array_add_element\n");
    return(NULL);
  }

  *key=*(key+1)=*buffer=*(buffer+1)='-';
  sprintf(
    format,
    "%%%d[^ \t\n\r#]%%%d[ \t\n\r#]",
    MAX_LINE_LENGTH-3, 
    MAX_LINE_LENGTH-1
  );
  while((status=fscanf(stream, format, key+2+offset, tail))!=EOF){
    if(status==0) { status=fscanf(stream, "%[^\n]\n", tail); continue; }
    if(!comment){
      strncpy(buffer+offset,key+offset,MAX_LINE_LENGTH-offset);
      if(token==0){
        ADD_ELEMENT;
      }
    }
    if(status==2){
      if((s=strrchr(tail, '\n'))==NULL){
        if(token++>0){
          offset=strlen(key+2);
          *(key+2+offset)=' ';
          *(buffer+2+offset++)=' ';
        }
      }
      else{
        if(!comment && *buffer!='\0'){
          ADD_ELEMENT;
        }
        offset=0;
        token=0;
        comment=0;
        *buffer='\0';
      }
      if(!comment){
        comment=(strchr(s!=NULL?s:tail, '#')==NULL)?0:1;
      }
    }
  }
  return(a);
}
Exemplo n.º 2
0
dynamic_array_t *
config_stream_read(FILE * stream, const char *first_element)
{
  char token[MAX_LINE_LENGTH];
  char tail[2];
  char format[MAX_LINE_LENGTH];
  char format_whitespace[MAX_LINE_LENGTH];
  int status;
  int ntoken;
  int comment = 0;
  char *s;
  int c;
  int flag;
  dynamic_array_t *a;

  if ((a = dynamic_array_create((size_t) 0)) == NULL) {
    perror("config_file_read: dynamic_array_create");
    return (NULL);
  }

  /*insert a argv[0] into the dynamic array */
  if ((a = dynamic_array_add_element(a,
				     (first_element !=
				      NULL ? first_element : ""),
				     DESTROY_STR, DUP_STR)) == NULL) {
    perror("config_file_read: dynamic_array_add_element");
    return (NULL);
  }

  sprintf(format, "%%%d[^ \t\n\r]%%1[ \t\n\r]", MAX_LINE_LENGTH);
  sprintf(format_whitespace, "%%%d[ \t\r]%%1[\n]", MAX_LINE_LENGTH);

  ntoken = 0;
  while ((status = fscanf(stream, format, token, tail)) != EOF) {
    if (status == 0) {
      flag = 1;
      while (flag) {
	c = fgetc(stream);
	switch (c) {
	case EOF:
	  dynamic_array_destroy(a, DESTROY_STR);
	  return (NULL);
	case '\n':
	  return (a);
	case '\t':
	case '\r':
	case ' ':
	  break;
	default:
	  ungetc(c, stream);
	  flag = 0;
	}
      }
      continue;
    }
    if (!comment && strcmp(token, "ipvsadm")) {
      ntoken++;
      if ((a = dynamic_array_add_element(a,
					 token,
					 DESTROY_STR, DUP_STR)) == NULL) {
	perror("config_file_read: dynamic_array_add_element");
	dynamic_array_destroy(a, DESTROY_STR);
	return (NULL);
      }
    }
    if ((s = strrchr(tail, '\n')) != NULL) {
      return (a);
    }
    if (!comment) {
      comment = (strchr((s != NULL ? s : tail), '#') == NULL) ? 0 : 1;
    }
  }

  if (ntoken == 0) {
    dynamic_array_destroy(a, DESTROY_STR);
    return (NULL);
  }

  return (a);
}