{"thread":{"id":"819","subject":"[PATCH] Expose more sha1_file.c interfaces","startedAt":"2005-06-03T15:08:16Z","lastAt":"2005-06-03T15:08:16Z","messageCount":1,"participants":["Jason McMullan"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"4490","messageId":"20050603150816.GA3738@jmcmullan.timesys","threadId":"819","inReplyTo":null,"subject":"[PATCH] Expose more sha1_file.c interfaces","fromName":"Jason McMullan","fromEmail":"jason.mcmullan@timesys.com","sentAt":"2005-06-03T15:08:16Z","receivedAt":"2005-06-03T15:08:16Z","isPatch":true,"sender":{"key":"jason.mcmullan@timesys.com","avatar":null},"body":"Expose more SHA1 file interfaces:\n\n/* Unpack the rest of a SHA1 file, after using unpack_sha1_header()\n */\nvoid *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size);\n\n/* Copy SHA1 object file between FDs, and verify that the SHA1 is as\n * expected. Useful for pulling from a socket into a temporary file\n * before you run object reference dependency checks. (Hint Hint people\n * maintaining pull.c!)\n */\nint write_sha1_from_fd_to_fd(const unsigned char *sha1, int fd, int fd_local);\n\nSigned-off-by: Jason McMullan <jason.mcmullan@timesys.com>\n\ndiff --git a/cache.h b/cache.h\n--- a/cache.h\n+++ b/cache.h\n@@ -153,6 +153,7 @@ extern char *sha1_file_name(const unsign\n extern void * map_sha1_file(const unsigned char *sha1, unsigned long *size);\n extern int unpack_sha1_header(z_stream *stream, void *map, unsigned long mapsize, void *buffer, unsigned long size);\n extern int parse_sha1_header(char *hdr, char *type, unsigned long *sizep);\n+extern void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size);\n extern void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned long *size);\n extern void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size);\n extern int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *return_sha1);\n@@ -162,6 +163,7 @@ extern int check_sha1_signature(const un\n /* Read a tree into the cache */\n extern int read_tree(void *buffer, unsigned long size, int stage);\n \n+extern int write_sha1_from_fd_to_fd(const unsigned char *sha1, int fd, int fd_local);\n extern int write_sha1_from_fd(const unsigned char *sha1, int fd);\n \n extern int has_sha1_file(const unsigned char *sha1);\ndiff --git a/sha1_file.c b/sha1_file.c\n--- a/sha1_file.c\n+++ b/sha1_file.c\n@@ -579,23 +579,15 @@ int write_sha1_file(void *buf, unsigned \n \treturn 0;\n }\n \n-int write_sha1_from_fd(const unsigned char *sha1, int fd)\n+int write_sha1_from_fd_to_fd(const unsigned char *sha1, int fd, int local)\n {\n-\tchar *filename = sha1_file_name(sha1);\n-\n-\tint local;\n \tz_stream stream;\n \tunsigned char real_sha1[20];\n \tunsigned char buf[4096];\n \tunsigned char discard[4096];\n-\tint ret;\n+\tint ret, compressed_size=0;\n \tSHA_CTX c;\n \n-\tlocal = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);\n-\n-\tif (local < 0)\n-\t\treturn error(\"Couldn't open %s\\n\", filename);\n-\n \tmemset(&stream, 0, sizeof(stream));\n \n \tinflateInit(&stream);\n@@ -606,13 +598,12 @@ int write_sha1_from_fd(const unsigned ch\n \t\tssize_t size;\n \t\tsize = read(fd, buf, 4096);\n \t\tif (size <= 0) {\n-\t\t\tclose(local);\n-\t\t\tunlink(filename);\n \t\t\tif (!size)\n \t\t\t\treturn error(\"Connection closed?\");\n \t\t\tperror(\"Reading from connection\");\n \t\t\treturn -1;\n \t\t}\n+\t\tcompressed_size += size;\n \t\twrite(local, buf, size);\n \t\tstream.avail_in = size;\n \t\tstream.next_in = buf;\n@@ -627,18 +618,35 @@ int write_sha1_from_fd(const unsigned ch\n \t} while (ret == Z_OK);\n \tinflateEnd(&stream);\n \n-\tclose(local);\n \tSHA1_Final(real_sha1, &c);\n \tif (ret != Z_STREAM_END) {\n-\t\tunlink(filename);\n \t\treturn error(\"File %s corrupted\", sha1_to_hex(sha1));\n \t}\n \tif (memcmp(sha1, real_sha1, 20)) {\n-\t\tunlink(filename);\n \t\treturn error(\"File %s has bad hash\\n\", sha1_to_hex(sha1));\n \t}\n \t\n-\treturn 0;\n+\treturn compressed_size;\n+}\n+\n+int write_sha1_from_fd(const unsigned char *sha1, int fd)\n+{\n+\tchar *filename = sha1_file_name(sha1);\n+\n+\tint local;\n+\tint ret;\n+\n+\tlocal = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);\n+\n+\tif (local < 0)\n+\t\treturn error(\"Couldn't open %s\\n\", filename);\n+\n+\tret = write_sha1_from_fd_to_fd(sha1, fd, local);\n+\tclose(local);\n+\tif (ret < 0)\n+\t\tunlink(filename);\n+\n+\treturn ret;\n }\n \n int has_sha1_file(const unsigned char *sha1)\n======== end ========\n\n-- \nJason McMullan <jason.mcmullan@timesys.com>\nTimeSys Corporation\n"}]}