summaryrefslogtreecommitdiff
path: root/pptpd-1.3.3/configfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'pptpd-1.3.3/configfile.c')
-rw-r--r--pptpd-1.3.3/configfile.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/pptpd-1.3.3/configfile.c b/pptpd-1.3.3/configfile.c
new file mode 100644
index 00000000..9a05bd73
--- /dev/null
+++ b/pptpd-1.3.3/configfile.c
@@ -0,0 +1,160 @@
+/*
+ * configfile.c
+ *
+ * Methods for accessing the PPTPD config file and searching for
+ * PPTPD keywords.
+ *
+ * $Id: configfile.c,v 1.2 2004/04/22 10:48:16 quozl Exp $
+ */
+
+#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') {
+ syslog(LOG_ERR, "Long config file line ignored.");
+ do
+ if (!fgets(buffer, MAX_CONFIG_STRING_SIZE - 1, in)) break;
+ while (buffer[strlen(buffer) - 1] != '\n');
+ continue;
+ }
+
+ 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);
+}