X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fcfg.c;h=ed36a88931238aaecc7d287bc6c440fd5fad7354;hb=def27fc2267328febc6b65cb779266fb8b2064ae;hp=833e6e51648e1656b27cc6f7d2d3606b9a97d4a5;hpb=34e63086edddcae06d7c1a4fa84fec0861e50758;p=sliver-openvswitch.git diff --git a/lib/cfg.c b/lib/cfg.c index 833e6e516..ed36a8893 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); } @@ -183,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; } @@ -332,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; @@ -673,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 @@ -805,7 +834,7 @@ cfg_get_mac(int idx, const char *key_, ...) /* Returns the value numbered 'idx' of 'key', parsed as an datapath ID. * Returns 0 if 'idx' is greater than or equal to cfg_count(key) or if the - * value 'idx' of 'key' is not a valid datapath ID consisting of exactly 12 + * value 'idx' of 'key' is not a valid datapath ID consisting of exactly 16 * hexadecimal digits. */ uint64_t cfg_get_dpid(int idx, const char *key_, ...) @@ -1098,14 +1127,14 @@ 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 parse_dpid(const char *s, uint64_t *dpid) { - if (strlen(s) == 12 && strspn(s, "0123456789abcdefABCDEF") == 12) { + if (strlen(s) == 16 && strspn(s, "0123456789abcdefABCDEF") == 16) { *dpid = strtoll(s, NULL, 16); return true; } else {