{"thread":{"id":"511","subject":"[PATCH 3/5] git-tar-tree: add extended header helpers","startedAt":"2005-05-06T20:56:01Z","lastAt":"2005-05-06T20:56:01Z","messageCount":1,"participants":["Rene Scharfe"],"isPatch":true,"patchVersion":1,"patchTotal":5},"messages":[{"id":"2704","messageId":"20050506205601.GD19518@lsrfire.ath.cx","threadId":"511","inReplyTo":null,"subject":"[PATCH 3/5] git-tar-tree: add extended header helpers","fromName":"Rene Scharfe","fromEmail":"rene.scharfe@lsrfire.ath.cx","sentAt":"2005-05-06T20:56:01Z","receivedAt":"2005-05-06T20:56:01Z","isPatch":true,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Introduce append_extended_header_prefix(), extended_header_len()\nand append_extended_header().  These are helper functions that\nmake it easier to handle multiple entries in a pax extended\nheader.  append_log() is no longer needed and can go away.\n\n---\ncommit 07b06da34d45be748f46ce4c8ffd3a2e0bba6191\ntree bb298354f2340d064398c211af0a44cde2b7f48b\nparent c0507f354f3637ce2fc6d8665685a7007e97002e\nauthor Rene Scharfe <rene.scharfe@lsrfire.ath.cx> 1115306031 +0200\ncommitter Rene Scharfe <rene.scharfe@lsrfire.ath.cx> 1115306031 +0200\n\nIndex: tar-tree.c\n===================================================================\n--- c20d5f820ce6cd1763af5a3eccfe4d4cff1ac719/tar-tree.c  (mode:100644 sha1:a5b9fc937c6c54a8155dd8d28772ecb5ba5dd303)\n+++ bb298354f2340d064398c211af0a44cde2b7f48b/tar-tree.c  (mode:100644 sha1:277c882acc4f487bfc90dee76b00dc88f99f3da3)\n@@ -128,12 +128,6 @@\n \t*p += 1;\n }\n \n-static void append_long(char **p, long n)\n-{\n-\tint len = sprintf(*p, \"%ld\", n);\n-\t*p += len;\n-}\n-\n static void append_path_prefix(char **buffer, struct path_prefix *prefix)\n {\n \tif (!prefix)\n@@ -175,6 +169,35 @@\n \treturn len;\n }\n \n+static void append_extended_header_prefix(char **p, unsigned int size,\n+                                          const char *keyword)\n+{\n+\tint len = sprintf(*p, \"%u %s=\", size, keyword);\n+\t*p += len;\n+}\n+\n+static unsigned int extended_header_len(const char *keyword,\n+                                        unsigned int valuelen)\n+{\n+\t/* \"%u %s=%s\\n\" */\n+\tunsigned int len = 1 + 1 + strlen(keyword) + 1 + valuelen + 1;\n+\tif (len > 9)\n+\t\tlen++;\n+\tif (len > 99)\n+\t\tlen++;\n+\treturn len;\n+}\n+\n+static void append_extended_header(char **p, const char *keyword,\n+                                   const char *value, unsigned int len)\n+{\n+\tunsigned int size = extended_header_len(keyword, len);\n+\tappend_extended_header_prefix(p, size, keyword);\n+\tmemcpy(*p, value, len);\n+\t*p += len;\n+\tappend_char(p, '\\n');\n+}\n+\n static void write_header(const char *, char, const char *, struct path_prefix *,\n                          const char *, unsigned int, unsigned long);\n \n@@ -185,18 +208,16 @@\n                                   const char *path, unsigned int namelen)\n {\n \tchar *p;\n-\tunsigned int size = 1 + 6 + namelen + 1;\n-\tif (size > 9)\n-\t\tsize++;\n-\tif (size > 99)\n-\t\tsize++;\n+\tunsigned int pathlen, size;\n+\n+\tsize = pathlen = extended_header_len(\"path\", namelen);\n \tif (size > RECORDSIZE)\n \t\tdie(\"tar-tree: extended header too big, wtf?\");\n \twrite_header(NULL, TYPEFLAG_EXT_HEADER, NULL, NULL, headerfilename,\n \t             0100600, size);\n+\n \tp = get_record();\n-\tappend_long(&p, size);\n-\tappend_string(&p, \" path=\");\n+\tappend_extended_header_prefix(&p, pathlen, \"path\");\n \tappend_path(&p, is_dir, basepath, prefix, path);\n \tappend_char(&p, '\\n');\n \twrite_if_needed();\n@@ -205,13 +226,14 @@\n static void write_global_extended_header(const char *sha1)\n {\n \tchar *p;\n+\tunsigned int size;\n+\n+\tsize = extended_header_len(\"comment\", 40);\n \twrite_header(NULL, TYPEFLAG_GLOBAL_HEADER, NULL, NULL,\n-\t             \"pax_global_header\", 0100600, 52);\n+\t             \"pax_global_header\", 0100600, size);\n+\n \tp = get_record();\n-\tappend_long(&p, 52);\t/* 2 + 9 + 40 + 1 */\n-\tappend_string(&p, \" comment=\");\n-\tappend_string(&p, sha1_to_hex(sha1));\n-\tappend_char(&p, '\\n');\n+\tappend_extended_header(&p, \"comment\", sha1_to_hex(sha1), 40);\n \twrite_if_needed();\n }\n \n\n\n\f\n!-------------------------------------------------------------flip-\n\n\n"}]}