Compare commits
No commits in common. "main" and "1.7.3" have entirely different histories.
@ -1,6 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.8..3.22)
|
||||
|
||||
project(minitar LANGUAGES C VERSION 1.7.6)
|
||||
project(minitar LANGUAGES C VERSION 1.7.3)
|
||||
|
||||
option(MINITAR_IGNORE_UNSUPPORTED_TYPES "Skip past entries that have unsupported types instead of panicking (deprecated)" OFF)
|
||||
|
||||
|
@ -43,7 +43,7 @@ See [examples](examples/) for more examples using minitar.
|
||||
|
||||
## Project structure
|
||||
|
||||
The user-facing API (functions defined in `minitar.h` and documented in [API.md](docs/API.md)) is implemented in `src/tar.c`. Utility and internally-used functions live in `src/util.c`.
|
||||
The user-facing API (functions defined in `minitar.h` and documented in this README) is implemented in `src/tar.c`. Utility and internally-used functions live in `src/util.c`.
|
||||
|
||||
## Documentation
|
||||
|
||||
|
@ -47,7 +47,6 @@ int main(int argc, char** argv)
|
||||
if (!buf)
|
||||
{
|
||||
perror("malloc");
|
||||
fclose(fp);
|
||||
exit_status = 1;
|
||||
break;
|
||||
}
|
||||
@ -55,7 +54,8 @@ int main(int argc, char** argv)
|
||||
if (ferror(fp))
|
||||
{
|
||||
perror("fread");
|
||||
goto err;
|
||||
exit_status = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
@ -63,21 +63,21 @@ int main(int argc, char** argv)
|
||||
if (rc < 0)
|
||||
{
|
||||
perror("fstat");
|
||||
goto err;
|
||||
exit_status = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
struct minitar_entry_metadata metadata;
|
||||
strncpy(metadata.path, argv[arg], sizeof(metadata.path));
|
||||
metadata.uid = st.st_uid;
|
||||
metadata.gid = st.st_gid;
|
||||
metadata.mtime = st.st_mtime;
|
||||
metadata.mtime = st.st_mtim.tv_sec;
|
||||
metadata.size = length;
|
||||
metadata.type = MTAR_REGULAR;
|
||||
metadata.mode = st.st_mode & ~S_IFMT;
|
||||
|
||||
rc = minitar_write_file_entry(&mp, &metadata, buf);
|
||||
free(buf);
|
||||
fclose(fp);
|
||||
|
||||
if (rc != 0)
|
||||
{
|
||||
@ -87,13 +87,6 @@ int main(int argc, char** argv)
|
||||
}
|
||||
|
||||
arg++;
|
||||
continue;
|
||||
|
||||
err:
|
||||
free(buf);
|
||||
fclose(fp);
|
||||
exit_status = 1;
|
||||
break;
|
||||
}
|
||||
minitar_close_w(&mp);
|
||||
return exit_status;
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <sys/sysmacros.h>
|
||||
#include <unistd.h>
|
||||
|
||||
// NOTE: This should be done for all entries, not just regular files
|
||||
static int create_parent_recursively(const char* path)
|
||||
{
|
||||
char* path_copy = strdup(path);
|
||||
@ -61,8 +62,6 @@ static int untar_file(const struct minitar_entry* entry, const void* buf)
|
||||
|
||||
static int untar_directory(const struct minitar_entry* entry)
|
||||
{
|
||||
if (create_parent_recursively(entry->metadata.path) < 0) return 1;
|
||||
|
||||
if (mkdir(entry->metadata.path, entry->metadata.mode) < 0) return 1;
|
||||
|
||||
return 0;
|
||||
@ -88,7 +87,6 @@ int main(int argc, char** argv)
|
||||
{
|
||||
if (entry.metadata.type == MTAR_DIRECTORY)
|
||||
{
|
||||
if (!strcmp(entry.metadata.name, ".") || !strcmp(entry.metadata.name, "..")) continue;
|
||||
int status = untar_directory(&entry);
|
||||
if (status != 0)
|
||||
{
|
||||
@ -126,13 +124,10 @@ int main(int argc, char** argv)
|
||||
}
|
||||
else if (entry.metadata.type == MTAR_SYMLINK)
|
||||
{
|
||||
if (create_parent_recursively(entry.metadata.path) < 0) goto symlink_err;
|
||||
|
||||
int status = symlink(entry.metadata.link, entry.metadata.path);
|
||||
|
||||
if (status != 0)
|
||||
{
|
||||
symlink_err:
|
||||
fprintf(stderr, "Failed to create symlink %s: %s\n", entry.metadata.path, strerror(errno));
|
||||
exit_status = 1;
|
||||
break;
|
||||
@ -142,13 +137,10 @@ int main(int argc, char** argv)
|
||||
}
|
||||
else if (entry.metadata.type == MTAR_HARDLINK)
|
||||
{
|
||||
if (create_parent_recursively(entry.metadata.path) < 0) goto hardlink_err;
|
||||
|
||||
int status = link(entry.metadata.link, entry.metadata.path);
|
||||
|
||||
if (status != 0)
|
||||
{
|
||||
hardlink_err:
|
||||
fprintf(stderr, "Failed to create hard link %s: %s\n", entry.metadata.path, strerror(errno));
|
||||
exit_status = 1;
|
||||
break;
|
||||
@ -158,57 +150,42 @@ int main(int argc, char** argv)
|
||||
}
|
||||
else if (entry.metadata.type == MTAR_FIFO)
|
||||
{
|
||||
#ifndef __luna__
|
||||
if (create_parent_recursively(entry.metadata.path) < 0) goto fifo_err;
|
||||
|
||||
int status = mknod(entry.metadata.path, entry.metadata.mode | S_IFIFO, 0);
|
||||
|
||||
if (status != 0)
|
||||
{
|
||||
fifo_err:
|
||||
fprintf(stderr, "Failed to create FIFO %s: %s\n", entry.metadata.path, strerror(errno));
|
||||
exit_status = 1;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
printf("fifo %s\n", entry.metadata.path);
|
||||
}
|
||||
else if (entry.metadata.type == MTAR_BLKDEV)
|
||||
{
|
||||
#ifndef __luna__
|
||||
if (create_parent_recursively(entry.metadata.path) < 0) goto blkdev_err;
|
||||
|
||||
int status = mknod(entry.metadata.path, entry.metadata.mode | S_IFBLK,
|
||||
makedev(entry.metadata.devmajor, entry.metadata.devminor));
|
||||
|
||||
if (status != 0)
|
||||
{
|
||||
blkdev_err:
|
||||
fprintf(stderr, "Failed to create block device %s: %s\n", entry.metadata.path, strerror(errno));
|
||||
exit_status = 1;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
printf("blkdev %s (%u:%u)\n", entry.metadata.path, entry.metadata.devmajor, entry.metadata.devminor);
|
||||
}
|
||||
else if (entry.metadata.type == MTAR_CHRDEV)
|
||||
{
|
||||
#ifndef __luna__
|
||||
if (create_parent_recursively(entry.metadata.path) < 0) goto chrdev_err;
|
||||
|
||||
int status = mknod(entry.metadata.path, entry.metadata.mode | S_IFCHR,
|
||||
makedev(entry.metadata.devmajor, entry.metadata.devminor));
|
||||
|
||||
if (status != 0)
|
||||
{
|
||||
chrdev_err:
|
||||
fprintf(stderr, "Failed to create character device %s: %s\n", entry.metadata.path, strerror(errno));
|
||||
exit_status = 1;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
printf("chrdev %s (%u:%u)\n", entry.metadata.path, entry.metadata.devmajor, entry.metadata.devminor);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user