Loading src/common/compat.c +34 −0 Original line number Diff line number Diff line Loading @@ -1467,6 +1467,40 @@ get_user_homedir(const char *username) } #endif /** Modify <b>fname</b> to contain the name of the directory */ int get_parent_directory(char *fname) { char *cp; int at_end = 1; tor_assert(fname); #ifdef MS_WINDOWS /* If we start with, say, c:, then don't consider that the start of the path */ if (fname[0] && fname[1] == ':') { fname += 2; } #endif /* Now we want to remove the final character that */ cp = fname + strlen(fname); at_end = 1; while (--cp > fname) { int is_sep = (*cp == '/' #ifdef MS_WINDOWS || *cp == '\\' #endif ); if (is_sep) { *cp = '\0'; if (! at_end) return 0; } else { at_end = 0; } } return -1; } /** Set *addr to the IP address (in dotted-quad notation) stored in c. * Return 1 on success, 0 if c is badly formatted. (Like inet_aton(c,addr), * but works on Windows and Solaris.) Loading src/common/compat.h +2 −0 Original line number Diff line number Diff line Loading @@ -552,6 +552,8 @@ int switch_id(const char *user); char *get_user_homedir(const char *username); #endif int get_parent_directory(char *fname); int spawn_func(void (*func)(void *), void *data); void spawn_exit(void) ATTR_NORETURN; Loading src/or/connection.c +2 −0 Original line number Diff line number Diff line Loading @@ -967,6 +967,8 @@ connection_create_listener(const struct sockaddr *listensockaddr, goto err; } if (get_options()->ControlSocketsGroupWritable) { /* We need to use chmod; fchmod doesn't work on sockets on all * platforms. */ if (chmod(address, 0660) < 0) { log_warn(LD_FS,"Unable to make %s group-writable.", address); tor_close_socket(s); Loading src/test/test_util.c +30 −0 Original line number Diff line number Diff line Loading @@ -1195,6 +1195,35 @@ test_util_listdir(void *ptr) } } static void test_util_parent_dir(void *ptr) { char *cp; (void)ptr; #define T(input,expect_ok,output) \ do { \ int ok; \ cp = tor_strdup(input); \ ok = get_parent_directory(cp); \ tt_int_op(ok, ==, expect_ok); \ if (ok==0) \ tt_str_op(cp, ==, output); \ tor_free(cp); \ } while (0); T("/home/wombat/knish", 0, "/home/wombat"); T("/home/wombat/knish/", 0, "/home/wombat"); T("./home/wombat/knish/", 0, "./home/wombat"); T("./wombat", 0, "."); T("", -1, ""); T("/", -1, ""); T("////", -1, ""); done: tor_free(cp); } #ifdef MS_WINDOWS static void test_util_load_win_lib(void *ptr) Loading Loading @@ -1286,6 +1315,7 @@ struct testcase_t util_tests[] = { UTIL_TEST(find_str_at_start_of_line, 0), UTIL_TEST(asprintf, 0), UTIL_TEST(listdir, 0), UTIL_TEST(parent_dir, 0), #ifdef MS_WINDOWS UTIL_TEST(load_win_lib, 0), #endif Loading Loading
src/common/compat.c +34 −0 Original line number Diff line number Diff line Loading @@ -1467,6 +1467,40 @@ get_user_homedir(const char *username) } #endif /** Modify <b>fname</b> to contain the name of the directory */ int get_parent_directory(char *fname) { char *cp; int at_end = 1; tor_assert(fname); #ifdef MS_WINDOWS /* If we start with, say, c:, then don't consider that the start of the path */ if (fname[0] && fname[1] == ':') { fname += 2; } #endif /* Now we want to remove the final character that */ cp = fname + strlen(fname); at_end = 1; while (--cp > fname) { int is_sep = (*cp == '/' #ifdef MS_WINDOWS || *cp == '\\' #endif ); if (is_sep) { *cp = '\0'; if (! at_end) return 0; } else { at_end = 0; } } return -1; } /** Set *addr to the IP address (in dotted-quad notation) stored in c. * Return 1 on success, 0 if c is badly formatted. (Like inet_aton(c,addr), * but works on Windows and Solaris.) Loading
src/common/compat.h +2 −0 Original line number Diff line number Diff line Loading @@ -552,6 +552,8 @@ int switch_id(const char *user); char *get_user_homedir(const char *username); #endif int get_parent_directory(char *fname); int spawn_func(void (*func)(void *), void *data); void spawn_exit(void) ATTR_NORETURN; Loading
src/or/connection.c +2 −0 Original line number Diff line number Diff line Loading @@ -967,6 +967,8 @@ connection_create_listener(const struct sockaddr *listensockaddr, goto err; } if (get_options()->ControlSocketsGroupWritable) { /* We need to use chmod; fchmod doesn't work on sockets on all * platforms. */ if (chmod(address, 0660) < 0) { log_warn(LD_FS,"Unable to make %s group-writable.", address); tor_close_socket(s); Loading
src/test/test_util.c +30 −0 Original line number Diff line number Diff line Loading @@ -1195,6 +1195,35 @@ test_util_listdir(void *ptr) } } static void test_util_parent_dir(void *ptr) { char *cp; (void)ptr; #define T(input,expect_ok,output) \ do { \ int ok; \ cp = tor_strdup(input); \ ok = get_parent_directory(cp); \ tt_int_op(ok, ==, expect_ok); \ if (ok==0) \ tt_str_op(cp, ==, output); \ tor_free(cp); \ } while (0); T("/home/wombat/knish", 0, "/home/wombat"); T("/home/wombat/knish/", 0, "/home/wombat"); T("./home/wombat/knish/", 0, "./home/wombat"); T("./wombat", 0, "."); T("", -1, ""); T("/", -1, ""); T("////", -1, ""); done: tor_free(cp); } #ifdef MS_WINDOWS static void test_util_load_win_lib(void *ptr) Loading Loading @@ -1286,6 +1315,7 @@ struct testcase_t util_tests[] = { UTIL_TEST(find_str_at_start_of_line, 0), UTIL_TEST(asprintf, 0), UTIL_TEST(listdir, 0), UTIL_TEST(parent_dir, 0), #ifdef MS_WINDOWS UTIL_TEST(load_win_lib, 0), #endif Loading