|
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 |
}
|