From d91f1b0315ca3a0d584f8ac7c2e8ef16cc7493c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D1=80=D0=B0=D1=85=D0=B8=D1=9A=D0=B0=20=D0=A0?= =?UTF-8?q?=D0=B0=D0=B4=D0=B8=D1=9B?= Date: Mon, 1 Aug 2022 09:12:03 +0200 Subject: [PATCH] Split path into prefix + name on -c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Страхиња Радић --- tar.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tar.c b/tar.c index d3a9f3b..4c35102 100644 --- a/tar.c +++ b/tar.c @@ -180,6 +180,7 @@ static int archive(const char *path) { char b[BLKSIZ]; + char *split; struct group *gr; struct header *h; struct passwd *pw; @@ -187,6 +188,7 @@ archive(const char *path) size_t chksum, i; ssize_t l, r; int fd = -1; + int slen, plen; if (lstat(path, &st) < 0) { weprintf("lstat %s:", path); @@ -201,7 +203,19 @@ archive(const char *path) h = (struct header *)b; memset(b, 0, sizeof(b)); - estrlcpy(h->name, path, sizeof(h->name)); + if ((split = strrchr(path, '/')) > path) + { + plen = strlen(path); + slen = (int)(split - path); + if (snprintf(h->prefix, sizeof(h->prefix), "%.*s", + slen, path) >= sizeof(h->prefix)) + eprintf("snprintf: input string too long\n"); + if (snprintf(h->name, sizeof(h->name), "%.*s", + (int)(plen-slen-1), path+slen+1) >= sizeof(h->name)) + eprintf("snprintf: input string too long\n"); + } + else + estrlcpy(h->name, path, sizeof(h->name)); putoctal(h->mode, (unsigned)st.st_mode & 0777, sizeof(h->mode)); putoctal(h->uid, (unsigned)st.st_uid, sizeof(h->uid)); putoctal(h->gid, (unsigned)st.st_gid, sizeof(h->gid)); -- 2.37.1