#define CC_FILE_NAME CC_ALNUM "._-"
#define CC_KEY CC_ALNUM "._-@$:+"
+void
+cfg_init(void)
+{
+ svec_terminate(&cfg);
+}
+
/* Sets 'file_name' as the configuration file read by cfg_read(). Returns 0 on
* success, otherwise a positive errno value if 'file_name' cannot be opened.
*
slash = strrchr(file_name, '/');
if (slash) {
lock_name = xasprintf("%.*s/.%s.~lock~",
- slash - file_name, file_name, slash + 1);
+ (int) (slash - file_name), file_name, slash + 1);
} else {
lock_name = xasprintf(".%s.~lock~", file_name);
}
static int
update_cookie(void)
{
+ struct sha1_ctx context;
int i;
- SHA1Context context;
- if (SHA1Reset(&context) != shaSuccess) {
- return -1;
- }
+ sha1_init(&context);
for (i = 0; i < cfg.n; i++) {
- if (SHA1Input(&context, (uint8_t *)cfg.names[i],
- strlen(cfg.names[i])) != shaSuccess) {
- return -1;
- }
- SHA1Input(&context, (uint8_t *)"\n", 1);
- }
- if (SHA1Result(&context, cfg_cookie) != shaSuccess) {
- return -1;
+ sha1_update(&context, cfg.names[i], strlen(cfg.names[i]));
+ sha1_update(&context, "\n", 1);
}
+ sha1_final(&context, cfg_cookie);
return 0;
}
file = fopen(cfg_name, "r");
if (!file) {
VLOG_ERR("failed to open \"%s\": %s", cfg_name, strerror(errno));
+ svec_terminate(&cfg);
return errno;
}
int
cfg_lock(uint8_t *cookie, int timeout)
{
- long long int start = time_msec();
+ long long int start;
long long int elapsed = 0;
int fd;
uint8_t curr_cookie[CFG_COOKIE_LEN];
assert(lock_fd < 0);
COVERAGE_INC(cfg_lock);
+
+ time_refresh();
+ start = time_msec();
for (;;) {
int error;
free(pattern);
}
+/* Fills 'svec' with all of the key-value pairs that match shell glob pattern
+ * 'pattern'. The caller must first initialize 'svec'. */
+void
+cfg_get_matches(struct svec *svec, const char *pattern_, ...)
+{
+ char *pattern;
+ char **p;
+
+ FORMAT_KEY(pattern_, pattern);
+
+ for (p = cfg.names; *p; p++) {
+ if (!fnmatch(pattern, *p, 0)) {
+ svec_add(svec, *p);
+ }
+ }
+
+ free(pattern);
+}
+
/* Fills 'svec' with all of the key-value pairs that have sections that
* begin with 'section'. The caller must first initialize 'svec'. */
void
static bool
parse_mac(const char *s, uint8_t mac[6])
{
- return sscanf(s, "%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8,
- &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6;
+ return (sscanf(s, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(mac))
+ == ETH_ADDR_SCAN_COUNT);
}
static bool