aboutsummaryrefslogtreecommitdiff
path: root/toys
diff options
context:
space:
mode:
Diffstat (limited to 'toys')
-rw-r--r--toys/pending/tar.c30
1 files changed, 0 insertions, 30 deletions
diff --git a/toys/pending/tar.c b/toys/pending/tar.c
index 0e7a49f9..f8233fa6 100644
--- a/toys/pending/tar.c
+++ b/toys/pending/tar.c
@@ -20,10 +20,6 @@
USE_TAR(NEWTOY(tar, "&(no-recursion)(numeric-owner)(no-same-permissions)(overwrite)(exclude)*(group):(owner):(to-command):o(no-same-owner)p(same-permissions)k(keep-old)c(create)|h(dereference)x(extract)|t(list)|v(verbose)j(bzip2)z(gzip)O(to-stdout)m(touch)X(exclude-from)*T(files-from)*C(directory):f(file):[!txc][!jz]", TOYFLAG_USR|TOYFLAG_BIN))
-todo: support .txz
-todo: directory timestamps not set on extract
-todo: extract into chmod 000 directory
-
config TAR
bool "tar"
default n
@@ -50,7 +46,6 @@ GLOBALS(
char *to_command, *owner, *group;
struct arg_list *exclude;
-// exc is an argument but inc isn't?
struct double_list *incl, *excl, *seen;
void *inodes;
char *cwd;
@@ -109,7 +104,6 @@ struct inode_list {
dev_t dev;
};
-// TODO This really needs a hash table
static struct inode_list *seen_inode(void **list, struct stat *st, char *name)
{
if (!S_ISDIR(st->st_mode) && st->st_nlink > 1) {
@@ -169,7 +163,6 @@ static struct double_list *filter(struct double_list *lst, char *name)
{
struct double_list *end = lst;
-// TODO 1<<3 = FNM_LEADING_DIR ... Why?
if (lst)
do if (!fnmatch(lst->data, name, 1<<3)) return lst;
while (end != (lst = lst->next));
@@ -193,7 +186,6 @@ static void alloread(void *buf, int len)
b[len] = 0;
}
-// TODO inline
static void add_file(char **nam, struct stat *st)
{
struct tar_hdr hdr;
@@ -204,7 +196,6 @@ static void add_file(char **nam, struct stat *st)
char *c, *p, *name = *nam, *lnk, *hname;
static int warn = 1;
-// TODO TT.incl defaults to --anchored TT.excl defaults to --no-anchored
for (p = name; *p; p++)
if ((p == name || p[-1] == '/') && *p != '/' && filter(TT.excl, p)) return;
@@ -237,19 +228,15 @@ static void add_file(char **nam, struct stat *st)
// Hard link or symlink?
i = !!S_ISLNK(st->st_mode);
-// TODO: hardlink to symlink?
if (i || (node = seen_inode(&TT.inodes, st, hname))) {
-// TODO: test preserve symlink ownership
hdr.type = '1'+i;
if (!(lnk = i ? xreadlink(name) : node->arg)) return perror_msg("readlink");
-// TODO: does this need NUL terminator?
if (strlen(lnk) > sizeof(hdr.link)) write_longname(lnk, 'K');
strncpy(hdr.link, lnk, sizeof(hdr.link));
if (i) free(lnk);
} else if (S_ISREG(st->st_mode)) {
hdr.type = '0';
ITOO(hdr.size, st->st_size);
-// TODO: test accept 12 7's but don't emit without terminator
} else if (S_ISDIR(st->st_mode)) hdr.type = '5';
else if (S_ISFIFO(st->st_mode)) hdr.type = '6';
else if (S_ISBLK(st->st_mode) || S_ISCHR(st->st_mode)) {
@@ -294,7 +281,6 @@ static int add_to_tar(struct dirtree *node)
char *path;
if (!dirtree_notdotdot(node)) return 0;
-// TODO repeated stat?
if (!fstat(TT.fd, &st) && st.st_dev == node->st.st_dev
&& st.st_ino == node->st.st_ino) {
error_msg("'%s' file is the archive; not dumped", TT.f);
@@ -309,8 +295,6 @@ static int add_to_tar(struct dirtree *node)
}
// Does anybody actually use this?
-// TODO xpopen_both()
-// TODO one caller, inline
static void extract_to_command(void)
{
int pipefd[2], status = 0;
@@ -351,15 +335,12 @@ static void extract_to_command(void)
}
}
-// TODO one caller, inline
static void extract_to_disk(void)
{
int flags, dst_fd = -1;
char *s;
struct stat ex;
-// while not if
-// TODO readlink -f prefix check
flags = strlen(TT.hdr.name);
if (flags>2)
if (strstr(TT.hdr.name, "/../") || !strcmp(TT.hdr.name, "../") ||
@@ -437,7 +418,6 @@ COPY:
// || !FLAG(no_same_permissions))
if (FLAG(p) && !S_ISLNK(TT.hdr.mode)) chmod(TT.hdr.name, TT.hdr.mode);
-// TODO: defer directory mtime until we've finished with contents
//apply mtime
if (!FLAG(m)) {
struct timeval times[2] = {{TT.hdr.mtime, 0},{TT.hdr.mtime, 0}};
@@ -628,15 +608,6 @@ void tar_main(void)
// Are we reading?
if (FLAG(x)||FLAG(t)) {
-// TODO: autodtect
-
-// Try detecting .gz or .bz2 by looking for their magic.
-// if ((!memcmp(tar.name, "\x1f\x8b", 2) || !memcmp(tar.name, "BZh", 3))
-// && !lseek(TT.fd, -i, SEEK_CUR)) {
-// toys.optflags |= (*tar.name == 'B') ? FLAG_j : FLAG_z;
-// extract_stream(tar_hdl);
-// continue;
-// }
if (FLAG(j)||FLAG(z)) {
int pipefd[2] = {TT.fd, -1};
@@ -659,7 +630,6 @@ void tar_main(void)
} else {
struct double_list *dl = TT.incl;
-// TODO: autodetect
if (FLAG(j)||FLAG(z)) {
int pipefd[2] = {-1, TT.fd};