X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=init-db.c;h=bd88291b0efd3eb9c46195d413db1aba820db2dd;hb=ad4f4daae80cb00000aca76e1528add6daf8f033;hp=aabc09f4e1f714f5b4c1adba388fc47b41e16b0b;hpb=79a9d8ea0d88a3667ad19be8e705405ab5d896f1;p=git.git diff --git a/init-db.c b/init-db.c index aabc09f4..bd88291b 100644 --- a/init-db.c +++ b/init-db.c @@ -21,7 +21,7 @@ static void safe_create_dir(const char *dir) static int copy_file(const char *dst, const char *src, int mode) { - int fdi, fdo; + int fdi, fdo, status; mode = (mode & 0111) ? 0777 : 0666; if ((fdi = open(src, O_RDONLY)) < 0) @@ -30,30 +30,9 @@ static int copy_file(const char *dst, const char *src, int mode) close(fdi); return fdo; } - while (1) { - char buf[BUFSIZ]; - ssize_t leni, leno, ofs; - leni = read(fdi, buf, sizeof(buf)); - if (leni < 0) { - error_return: - close(fdo); - close(fdi); - return -1; - } - if (!leni) - break; - ofs = 0; - do { - leno = write(fdo, buf+ofs, leni); - if (leno < 0) - goto error_return; - leni -= leno; - ofs += leno; - } while (0 < leni); - } + status = copy_fd(fdi, fdo); close(fdo); - close(fdi); - return 0; + return status; } static void copy_templates_1(char *path, int baselen, @@ -196,6 +175,43 @@ static void create_default_files(const char *git_dir, } path[len] = 0; copy_templates(path, len, template_path); + + /* + * Find out if we can trust the executable bit. + */ + safe_create_dir(path); + strcpy(path + len, "config"); + if (access(path, R_OK) < 0) { + static const char contents[] = + "#\n" + "# This is the config file\n" + "#\n" + "\n" + "; core variables\n" + "[core]\n" + " ; Don't trust file modes\n" + " filemode = false\n" + "\n"; + FILE *config = fopen(path, "w"); + struct stat st; + + if (!config) + die("Can not write to %s?", path); + + fwrite(contents, sizeof(contents)-1, 1, config); + + fclose(config); + + if (!lstat(path, &st)) { + struct stat st2; + if (!chmod(path, st.st_mode ^ S_IXUSR) && + !lstat(path, &st2) && + st.st_mode != st2.st_mode) + unlink(path); + else + fprintf(stderr, "Ignoring file modes\n"); + } + } } static const char init_db_usage[] = @@ -244,10 +260,6 @@ int main(int argc, char **argv) memcpy(path, sha1_dir, len); safe_create_dir(sha1_dir); - for (i = 0; i < 256; i++) { - sprintf(path+len, "/%02x", i); - safe_create_dir(path); - } strcpy(path+len, "/pack"); safe_create_dir(path); strcpy(path+len, "/info");