commit 762d73f46b73795f4f1defc7cbadd0a3c3f17604 from: Stefan Sperling date: Sat Apr 10 13:13:56 2021 UTC introduce got_object_open_loose_fd() for library-internal use commit - 509c99732c4da3e3b74c17d09aba5a38b701716f commit + 762d73f46b73795f4f1defc7cbadd0a3c3f17604 blob - 44f8ac073b1d120169e3ef344f1caca1022da938 blob + 6b796d3554548cbf04c5c143d4e5311d6545dd03 --- lib/got_lib_object.h +++ lib/got_lib_object.h @@ -98,6 +98,8 @@ struct got_object_id *got_object_get_id(struct got_obj const struct got_error *got_object_get_id_str(char **, struct got_object *); const struct got_error *got_object_get_path(char **, struct got_object_id *, struct got_repository *); +const struct got_error *got_object_open_loose_fd(int *, struct got_object_id *, + struct got_repository *); const struct got_error *got_object_open(struct got_object **, struct got_repository *, struct got_object_id *); const struct got_error *got_object_raw_open(struct got_raw_object **, blob - 45d8d172d3e1fc86252195cf8d104b348ef56f44 blob + d599d8a2df794fac0197af296081abaca81c9eb6 --- lib/object.c +++ lib/object.c @@ -125,8 +125,8 @@ done: return err; } -static const struct got_error * -open_loose_object(int *fd, struct got_object_id *id, +const struct got_error * +got_object_open_loose_fd(int *fd, struct got_object_id *id, struct got_repository *repo) { const struct got_error *err = NULL; @@ -490,7 +490,6 @@ got_object_open(struct got_object **obj, struct got_re struct got_object_id *id) { const struct got_error *err = NULL; - char *path; int fd; *obj = got_repo_get_cached_object(repo, id); @@ -507,29 +506,21 @@ got_object_open(struct got_object **obj, struct got_re return got_repo_cache_object(repo, id, *obj); } - err = got_object_get_path(&path, id, repo); + err = got_object_open_loose_fd(&fd, id, repo); + if (err) { + if (err->code == GOT_ERR_ERRNO && errno == ENOENT) + err = got_error_no_obj(id); + return err; + } + + err = read_object_header_privsep(obj, repo, fd); if (err) return err; - fd = open(path, O_RDONLY | O_NOFOLLOW); - if (fd == -1) { - if (errno == ENOENT) - err = got_error_no_obj(id); - else - err = got_error_from_errno2("open", path); - goto done; - } else { - err = read_object_header_privsep(obj, repo, fd); - if (err) - goto done; - memcpy((*obj)->id.sha1, id->sha1, SHA1_DIGEST_LENGTH); - } + memcpy((*obj)->id.sha1, id->sha1, SHA1_DIGEST_LENGTH); (*obj)->refcnt++; - err = got_repo_cache_object(repo, id, *obj); -done: - free(path); - return err; + return got_repo_cache_object(repo, id, *obj); } const struct got_error * @@ -571,7 +562,7 @@ got_object_raw_open(struct got_raw_object **obj, struc } else if (err->code == GOT_ERR_NO_OBJ) { int fd; - err = open_loose_object(&fd, id, repo); + err = got_object_open_loose_fd(&fd, id, repo); if (err) goto done; err = read_object_raw_privsep(&outbuf, &size, &hdrlen, outfd, @@ -858,7 +849,7 @@ open_commit(struct got_commit_object **commit, } else if (err->code == GOT_ERR_NO_OBJ) { int fd; - err = open_loose_object(&fd, id, repo); + err = got_object_open_loose_fd(&fd, id, repo); if (err) return err; err = read_commit_privsep(commit, fd, repo); @@ -1047,7 +1038,7 @@ open_tree(struct got_tree_object **tree, struct got_re } else if (err->code == GOT_ERR_NO_OBJ) { int fd; - err = open_loose_object(&fd, id, repo); + err = got_object_open_loose_fd(&fd, id, repo); if (err) return err; err = read_tree_privsep(tree, fd, repo); @@ -1411,7 +1402,7 @@ open_blob(struct got_blob_object **blob, struct got_re } else if (err->code == GOT_ERR_NO_OBJ) { int infd; - err = open_loose_object(&infd, id, repo); + err = got_object_open_loose_fd(&infd, id, repo); if (err) goto done; err = read_blob_privsep(&outbuf, &size, &hdrlen, outfd, infd, @@ -1772,7 +1763,7 @@ open_tag(struct got_tag_object **tag, struct got_repos } else if (err->code == GOT_ERR_NO_OBJ) { int fd; - err = open_loose_object(&fd, id, repo); + err = got_object_open_loose_fd(&fd, id, repo); if (err) return err; err = read_object_header_privsep(&obj, repo, fd); @@ -1783,7 +1774,7 @@ open_tag(struct got_tag_object **tag, struct got_repos if (obj_type != GOT_OBJ_TYPE_TAG) return got_error(GOT_ERR_OBJ_TYPE); - err = open_loose_object(&fd, id, repo); + err = got_object_open_loose_fd(&fd, id, repo); if (err) return err; err = read_tag_privsep(tag, fd, repo);