sgwdynspeed: add plugin
[olsrd.git] / lib / sgwdynspeed / src / configuration.c
1 #include "configuration.h"
2
3 /* Plugin includes */
4 #include "sgwDynSpeed.h"
5
6 /* OLSR includes */
7
8 /* System includes */
9 #include <stdbool.h>
10 #include <unistd.h>
11 #include <errno.h>
12 #include <stdlib.h>
13 #include <limits.h>
14 #include <string.h>
15 #include <assert.h>
16
17 /*
18  * Utility functions
19  */
20
21 /**
22  Read an unsigned long long number from a value string
23
24  @param valueName
25  the name of the value
26  @param value
27  the string to convert to a number
28  @param valueNumber
29  a pointer to the location where to store the number upon successful conversion
30
31  @return
32  - true on success
33  - false otherwise
34  */
35 static bool readULL(const char * valueName, const char * value, unsigned long long * valueNumber) {
36         char * endPtr = NULL;
37         unsigned long long valueNew;
38
39         errno = 0;
40         valueNew = strtoull(value, &endPtr, 10);
41
42         if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0'))) {
43                 /* invalid conversion */
44                 sgwDynSpeedError(true, "Configured %s (%s) could not be converted to a number", valueName, value);
45                 return false;
46         }
47
48         *valueNumber = valueNew;
49
50         return true;
51 }
52
53 /*
54  * speedFile
55  */
56
57 /** The speedFile buffer */
58 static char speedFile[PATH_MAX];
59
60 /** True when the speedFile is set */
61 static bool speedFileSet = false;
62
63 /**
64  @return
65  The speed file filename. returns NULL if not set
66  */
67 char * getSpeedFile(void) {
68         if (!speedFileSet) {
69                 return NULL;
70         }
71
72         return &speedFile[0];
73 }
74
75 /**
76  Set the speed file filename.
77
78  @param value
79  The value of the speed file filename to set
80  @param data
81  Unused
82  @param addon
83  Unused
84
85  @return
86  - true when an error is detected
87  - false otherwise
88  */
89 int setSpeedFile(const char *value, void *data __attribute__ ((unused)),
90                 set_plugin_parameter_addon addon __attribute__ ((unused))) {
91         size_t valueLength;
92
93         if (!value) {
94                 speedFileSet = false;
95                 return false;
96         }
97
98         valueLength = strlen(value);
99         if (!valueLength) {
100                 speedFileSet = false;
101                 return false;
102         }
103
104         if (valueLength > (PATH_MAX - 1)) {
105                 sgwDynSpeedError(false, "Configured %s is too long, maximum length is"
106                                 " %u, current length is %lu", SGWDYNSPEED_SPEEDFILE_NAME, PATH_MAX, (unsigned long) valueLength);
107                 return true;
108         }
109
110         strcpy(&speedFile[0], value);
111         speedFileSet = true;
112
113         return false;
114 }
115
116 /*
117  * speedFilePeriod
118  */
119
120 /** The speedFilePeriod value (milliseconds) */
121 unsigned long long speedFilePeriod = SGWDYNSPEED_SPEEDFILEPERIOD_DEFAULT;
122
123 /**
124  @return
125  The speedFilePeriod (in milliseconds)
126  */
127 unsigned long long getSpeedFilePeriod(void) {
128         return speedFilePeriod;
129 }
130
131 /**
132  Set the speedFilePeriod
133
134  @param value
135  The speedFilePeriod (a number in string representation)
136  @param data
137  Unused
138  @param addon
139  Unused
140
141  @return
142  - true when an error is detected
143  - false otherwise
144  */
145 int setSpeedFilePeriod(const char *value, void *data __attribute__ ((unused)),
146                 set_plugin_parameter_addon addon __attribute__ ((unused))) {
147         static const char * valueName = SGWDYNSPEED_SPEEDFILEPERIOD_NAME;
148         unsigned long long speedFilePeriodNew;
149
150         assert(value != NULL);
151
152         if (!readULL(valueName, value, &speedFilePeriodNew)) {
153                 return true;
154         }
155
156         if ((speedFilePeriodNew < SGWDYNSPEED_SPEEDFILEPERIOD_MIN)
157                         || (speedFilePeriodNew > SGWDYNSPEED_SPEEDFILEPERIOD_MAX)) {
158                 sgwDynSpeedError(false, "Configured %s (%llu) is outside of"
159                                 " valid range %llu-%llu", valueName, speedFilePeriodNew, SGWDYNSPEED_SPEEDFILEPERIOD_MIN,
160                                 SGWDYNSPEED_SPEEDFILEPERIOD_MAX);
161                 return true;
162         }
163
164         speedFilePeriod = speedFilePeriodNew;
165
166         return false;
167 }