123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /*
- * configfile.c
- *
- * Methods for accessing the PPTPD config file and searching for
- * PPTPD keywords.
- */
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #include "defaults.h"
- #include "configfile.h"
- #include "our_syslog.h"
- /* Local function prototypes */
- static FILE *open_config_file(char *filename);
- static void close_config_file(FILE * file);
- /*
- * read_config_file
- *
- * This method opens up the file specified by 'filename' and searches
- * through the file for 'keyword'. If 'keyword' is found any string
- * following it is stored in 'value'.
- *
- * args: filename (IN) - config filename
- * keyword (IN) - word to search for in config file
- * value (OUT) - value of keyword
- *
- * retn: -1 on error, 0 if keyword not found, 1 on value success
- */
- int read_config_file(char *filename, char *keyword, char *value)
- {
- FILE *in;
- int len = 0, keyword_len = 0;
- int foundit = 0;
- char *buff_ptr;
- char buffer[MAX_CONFIG_STRING_SIZE];
- *value = '\0';
- buff_ptr = buffer;
- keyword_len = strlen(keyword);
- in = open_config_file(filename);
- if (in == NULL) {
- /* Couldn't find config file, or permission denied */
- return -1;
- }
- while ((fgets(buffer, MAX_CONFIG_STRING_SIZE - 1, in)) != NULL) {
- /* ignore long lines */
- if (buffer[(len = strlen(buffer)) - 1] != '\n') {
- if (len >= MAX_CONFIG_STRING_SIZE - 2) {
- syslog(LOG_ERR, "Long config file line ignored.");
- char *p;
- do
- p = fgets(buffer, MAX_CONFIG_STRING_SIZE - 1, in);
- while (p && buffer[strlen(buffer) - 1] != '\n');
- continue;
- }
- } else {
- len--; /* For the NL at the end */
- }
- while (--len >= 0)
- if (buffer[len] != ' ' && buffer[len] != '\t')
- break;
- len++;
- buffer[len] = '\0';
- buff_ptr = buffer;
- /* Short-circuit blank lines and comments */
- if (!len || *buff_ptr == '#')
- continue;
- /* Non-blank lines starting with a space are an error */
- if (*buff_ptr == ' ' || *buff_ptr == '\t') {
- syslog(LOG_ERR, "Config file line starts with a space: %s", buff_ptr);
- continue;
- }
- /* At this point we have a line trimmed for trailing spaces. */
- /* Now we need to check if the keyword matches, and if so */
- /* then get the value (if any). */
- /* Check if it's the right keyword */
- do {
- if (*buff_ptr == ' ' || *buff_ptr == '\t')
- break;
- } while (*++buff_ptr);
- len = buff_ptr - buffer;
- if (len == keyword_len && !strncmp(buffer, keyword, len)) {
- foundit++;
- break;
- }
- }
- close_config_file(in);
- if (foundit) {
- /* Right keyword, now get the value (if any) */
- do {
- if (*buff_ptr != ' ' && *buff_ptr != '\t')
- break;
-
- } while (*++buff_ptr);
- strcpy(value, buff_ptr);
- return 1;
- } else {
- /* didn't find it - better luck next time */
- return 0;
- }
- }
- /*
- * open_config_file
- *
- * Opens up the PPTPD config file for reading.
- *
- * args: filename - the config filename (eg. '/etc/pptpd.conf')
- *
- * retn: NULL on error, file descriptor on success
- *
- */
- static FILE *open_config_file(char *filename)
- {
- FILE *in;
- static int first = 1;
- if ((in = fopen(filename, "r")) == NULL) {
- /* Couldn't open config file */
- if (first) {
- perror(filename);
- first = 0;
- }
- return NULL;
- }
- return in;
- }
- /*
- * close_config_file
- *
- * Closes the PPTPD config file descriptor
- *
- */
- static void close_config_file(FILE * in)
- {
- fclose(in);
- }
|