diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/blogc-git-receiver/pre-receive.c | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/src/blogc-git-receiver/pre-receive.c b/src/blogc-git-receiver/pre-receive.c index 954c379..14d5ca2 100644 --- a/src/blogc-git-receiver/pre-receive.c +++ b/src/blogc-git-receiver/pre-receive.c @@ -93,7 +93,6 @@ int bgr_pre_receive_hook(int argc, char *argv[]) { int rv = 0; - char buffer[4096]; char *master = NULL; if (isatty(STDIN_FILENO)) { @@ -148,15 +147,14 @@ bgr_pre_receive_hook(int argc, char *argv[]) char *repo_dir = NULL; char *output_dir = NULL; - if (NULL == getcwd(buffer, sizeof(buffer))) { - fprintf(stderr, "error: failed to get repository remote path: %s\n", + repo_dir = getcwd(NULL, 0); + if (repo_dir == NULL) { + fprintf(stderr, "error: failed to get repository path: %s\n", strerror(errno)); rv = 1; goto cleanup; } - repo_dir = bc_strdup(buffer); - char dir[] = "/tmp/blogc_XXXXXX"; if (NULL == mkdtemp(dir)) { rv = 1; @@ -239,18 +237,13 @@ bgr_pre_receive_hook(int argc, char *argv[]) goto cleanup; } - char *htdocs_sym = NULL; - ssize_t htdocs_sym_len = readlink("htdocs", buffer, sizeof(buffer)); - if (0 < htdocs_sym_len) { - if (0 != unlink("htdocs")) { - fprintf(stderr, "error: failed to remove symlink (%s/htdocs): %s\n", - repo_dir, strerror(errno)); - rmdir_recursive(output_dir); - rv = 1; - goto cleanup; - } - buffer[htdocs_sym_len] = '\0'; - htdocs_sym = buffer; + char *htdocs_sym = realpath("htdocs", NULL); + if ((htdocs_sym != NULL) && (0 != unlink("htdocs"))) { + fprintf(stderr, "error: failed to remove symlink (%s/htdocs): %s\n", + repo_dir, strerror(errno)); + rmdir_recursive(output_dir); + rv = 1; + goto cleanup2; } if (0 != symlink(output_dir, "htdocs")) { @@ -258,12 +251,15 @@ bgr_pre_receive_hook(int argc, char *argv[]) repo_dir, strerror(errno)); rmdir_recursive(output_dir); rv = 1; - goto cleanup; + goto cleanup2; } if (htdocs_sym != NULL) rmdir_recursive(htdocs_sym); +cleanup2: + free(htdocs_sym); + cleanup: free(master); free(output_dir); |