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