summaryrefslogtreecommitdiff
path: root/config.c
blob: af30910b4ad831dd6d461fa8f96195fd7649defc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "config.h"

// Sets 'dest' to the value of the configuration option with name
// 'confname' from configuration file 'filename'.
// Returns 1 for success or 0 for error/failure.
int getconfstr(char *confname, char *filename, char* dest) {
  FILE *fp;
  char *ret;
  char str[MAXCHAR];
  int found = 0; // Have we found the configuration option?

  // Set strings to zero-length to begin
  dest[0] = '\0';

  // Length of requested configuration option name
  long int namelen = strlen(confname);

  fp = fopen(filename, "r");

  if (fp == NULL) {
    printf("error: could not open configuration file '%s'.\n", filename);
    exit(1);
  }
  // Loop through the whole file, looking for the requested configuration option
  while (fgets(str, MAXCHAR, fp) != NULL) {
    char substr[MAXCHAR];

    // Check if the next character after the length of the requested option
    // name is an equals sign, a space, or a tab
    if (str[namelen] != '=' && str[namelen] != ' ' && str[namelen] != '\t') {
      // If it isn't this can't have been our option
      continue;
    }

    // Copy the number of characters that the requested option name is long
    // to a temporary string
    strncpy(substr, str, namelen);
    substr[namelen] = '\0';

    // If the resulting temporary string contains the requested option name,
    // we have found our configuration option and it is in the current 'str'
    if (!(ret = strstr(substr, confname)) == 0) {
      found = 1;
      break;
    }
  }

  // If we got here, then either we found the configuration option or we ran out of file

  if (!found) {
    printf("Error reading configuration option '%s', did not find it in configuration file '%s'.\n", confname, filename);
    return 0;
  }

  long int pos;
  char conf[MAXCHAR]; // Temporary string to build configuration value in

  // Starting from the end of the option name, find the position of the start of the configuration value
  // (including its double quotes) by skipping over everything that isn't an equals sign, a space, or a tab
  for (size_t i = namelen; i < strlen(str); i++) {
    if (str[i] == '=' || str[i] == ' ' || str[i] == '\t') {
      continue;
    } else {
      // Record current/final position in string
      pos = i;
      break;
    }
  }

  strncpy(conf, str + pos, strlen(str) - pos - 1); // Copy remainder to new string and lop off the newline
  conf[strlen(str) - pos - 1] = '\0'; // Null terminate

   // Check for start and end quotes
  if (conf[0] != '"' || conf[strlen(conf) - 1] != '"') {
    printf("Error reading configuration option '%s', not enclosed in double quotes in configuration file '%s'!\n", confname, filename);
    exit(1);
  }

  strncpy(dest, conf + 1, strlen(conf) - 2); // Copy result to destination string without quotes
  dest[strlen(conf) - 2] = '\0'; // Null terminate

  printf("getconfstr(): returning '%s'.\n", dest);

  // Close fine and return success
  fclose(fp);
  return 1;
}

// Returns the value of the configuration option with name
// 'confname' from configuration file 'filename'.
int getconfint(char *confname, char *filename) {
  char result[MAXCHAR];
  if (!getconfstr(confname, filename, result)) {
    printf("getconfint(): error getting configuration option '%s' from configuration file '%s'.\n", confname, filename);
    // TODO - Do something useful here instead of exiting
    exit(1);
  }

  return strtol(result, NULL, 10); // Convert resulting string to an integer, base 10
}

// Check the password provided in the string 'str' against what is in
// the configuration file 'filename'.
// Return 0 for password mismatch, or 1 for password match.
int checkpassword(char *password, char *filename) {
  char confpassword[MAXCHAR];

  if (!getconfstr("password", filename, confpassword)) {
    printf("checkpassword(): error getting configuration option 'password' from configuration file '%s'.\n", filename);
    return 0;
  }

  // Ensure passwords are the same length
  if (strlen(password) != strlen(confpassword)) {
    printf("Password length mismatch!\n");
    return 0;
  }
  // Ensure passwords match
  if (strncmp(password, confpassword, strlen(password)) == 0) {
    printf("confpassword matches password.\n");
    return 1;
  } else {
    printf("confpassword does NOT match password!\n");
    return 0;
  }

  printf("checkpassword(): unexpectedly got to end of function, quitting.\n");
  exit(1);
}