Blame config_stream.c

Packit 7dae13
/*
Packit 7dae13
 *      Code to convert a stream input into a dynamic array
Packit 7dae13
 *      that can be parsed as argc and argv.
Packit 7dae13
 *
Packit 7dae13
 *      Authors: Horms <horms@vergenet.net>
Packit 7dae13
 *
Packit 7dae13
 *      Released under the terms of the GNU GPL
Packit 7dae13
 *
Packit 7dae13
 *      ChangeLog
Packit 7dae13
 *      Horms         :   scanf Glibc under Red Hat 7 does not appear
Packit 7dae13
 *                        to return EOF when input ends. Fall through
Packit 7dae13
 *                        code has been added to handle this case correctly
Packit 7dae13
 */
Packit 7dae13
Packit 7dae13
#include "config_stream.h"
Packit 7dae13
Packit 7dae13
Packit 7dae13
/**********************************************************************
Packit 7dae13
 * config_stream_read
Packit 7dae13
 * Read in a config file and put elements in a dynamic array
Packit 7dae13
 * pre: stream: stream to read configuration from
Packit 7dae13
 * return: dynamic array whose elements are the space delimited
Packit 7dae13
 *         tokens read from the stream. Result is returned
Packit 7dae13
 *         once a newline is reached so multiple calls
Packit 7dae13
 *         will be required to read an entire stream.
Packit 7dae13
 *         Everything including and after a hash (#) on a line is
Packit 7dae13
 *         ignored
Packit 7dae13
 **********************************************************************/
Packit 7dae13
Packit 7dae13
dynamic_array_t *
Packit 7dae13
config_stream_read(FILE * stream, const char *first_element)
Packit 7dae13
{
Packit 7dae13
  char token[MAX_LINE_LENGTH];
Packit 7dae13
  char tail[2];
Packit 7dae13
  char format[MAX_LINE_LENGTH];
Packit 7dae13
  char format_whitespace[MAX_LINE_LENGTH];
Packit 7dae13
  int status;
Packit 7dae13
  int ntoken;
Packit 7dae13
  int comment = 0;
Packit 7dae13
  char *s;
Packit 7dae13
  int c;
Packit 7dae13
  int flag;
Packit 7dae13
  dynamic_array_t *a;
Packit 7dae13
Packit 7dae13
  if ((a = dynamic_array_create((size_t) 0)) == NULL) {
Packit 7dae13
    perror("config_file_read: dynamic_array_create");
Packit 7dae13
    return (NULL);
Packit 7dae13
  }
Packit 7dae13
Packit 7dae13
  /*insert a argv[0] into the dynamic array */
Packit 7dae13
  if ((a = dynamic_array_add_element(a,
Packit 7dae13
				     (first_element !=
Packit 7dae13
				      NULL ? first_element : ""),
Packit 7dae13
				     DESTROY_STR, DUP_STR)) == NULL) {
Packit 7dae13
    perror("config_file_read: dynamic_array_add_element");
Packit 7dae13
    return (NULL);
Packit 7dae13
  }
Packit 7dae13
Packit 7dae13
  sprintf(format, "%%%d[^ \t\n\r]%%1[ \t\n\r]", MAX_LINE_LENGTH);
Packit 7dae13
  sprintf(format_whitespace, "%%%d[ \t\r]%%1[\n]", MAX_LINE_LENGTH);
Packit 7dae13
Packit 7dae13
  ntoken = 0;
Packit 7dae13
  while ((status = fscanf(stream, format, token, tail)) != EOF) {
Packit 7dae13
    if (status == 0) {
Packit 7dae13
      flag = 1;
Packit 7dae13
      while (flag) {
Packit 7dae13
	c = fgetc(stream);
Packit 7dae13
	switch (c) {
Packit 7dae13
	case EOF:
Packit 7dae13
	  dynamic_array_destroy(a, DESTROY_STR);
Packit 7dae13
	  return (NULL);
Packit 7dae13
	case '\n':
Packit 7dae13
	  return (a);
Packit 7dae13
	case '\t':
Packit 7dae13
	case '\r':
Packit 7dae13
	case ' ':
Packit 7dae13
	  break;
Packit 7dae13
	default:
Packit 7dae13
	  ungetc(c, stream);
Packit 7dae13
	  flag = 0;
Packit 7dae13
	}
Packit 7dae13
      }
Packit 7dae13
      continue;
Packit 7dae13
    }
Packit 7dae13
    if (!comment && strcmp(token, "ipvsadm")) {
Packit 7dae13
      ntoken++;
Packit 7dae13
      if ((a = dynamic_array_add_element(a,
Packit 7dae13
					 token,
Packit 7dae13
					 DESTROY_STR, DUP_STR)) == NULL) {
Packit 7dae13
	perror("config_file_read: dynamic_array_add_element");
Packit 7dae13
	dynamic_array_destroy(a, DESTROY_STR);
Packit 7dae13
	return (NULL);
Packit 7dae13
      }
Packit 7dae13
    }
Packit 7dae13
    if ((s = strrchr(tail, '\n')) != NULL) {
Packit 7dae13
      return (a);
Packit 7dae13
    }
Packit 7dae13
    if (!comment) {
Packit 7dae13
      comment = (strchr((s != NULL ? s : tail), '#') == NULL) ? 0 : 1;
Packit 7dae13
    }
Packit 7dae13
  }
Packit 7dae13
Packit 7dae13
  if (ntoken == 0) {
Packit 7dae13
    dynamic_array_destroy(a, DESTROY_STR);
Packit 7dae13
    return (NULL);
Packit 7dae13
  }
Packit 7dae13
Packit 7dae13
  return (a);
Packit 7dae13
}