X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fcfg.c;h=d0170b60e720fd00f5e78721c60c1b8c00fe644a;hb=da0603cf278a9f505dc2988602ec0071c771dd2e;hp=194fb1890a086d6763e2557a2e9782060d08dc35;hpb=a14bc59fb8f27db193d74662dc9c5cb8237177ef;p=openvswitch diff --git a/lib/cfg.c b/lib/cfg.c index 194fb189..d0170b60 100644 --- a/lib/cfg.c +++ b/lib/cfg.c @@ -92,6 +92,12 @@ static bool is_type(const char *s, enum cfg_flags); #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. * @@ -130,7 +136,7 @@ cfg_set_file(const char *file_name) 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); } @@ -143,22 +149,15 @@ cfg_set_file(const char *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; } @@ -190,6 +189,7 @@ cfg_read(void) file = fopen(cfg_name, "r"); if (!file) { VLOG_ERR("failed to open \"%s\": %s", cfg_name, strerror(errno)); + svec_terminate(&cfg); return errno; } @@ -339,13 +339,16 @@ try_lock(int fd, bool block) 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; @@ -680,6 +683,25 @@ cfg_del_match(const char *pattern_, ...) 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 @@ -1105,8 +1127,8 @@ find_key(const char *key) 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