Compare commits
No commits in common. "30c7c0ad5752633e13d29ddf454e82fd65fd96c8" and "2aed955e94c232f28364a31e04d0343ba1c5d3f0" have entirely different histories.
30c7c0ad57
...
2aed955e94
2
.gitignore
vendored
2
.gitignore
vendored
@ -52,5 +52,7 @@ Module.symvers
|
|||||||
Mkfile.old
|
Mkfile.old
|
||||||
dkms.conf
|
dkms.conf
|
||||||
|
|
||||||
|
obj/
|
||||||
|
libmtar.a
|
||||||
.vscode/
|
.vscode/
|
||||||
build/
|
build/
|
@ -11,19 +11,6 @@ add_library(minitar STATIC ${SOURCES})
|
|||||||
|
|
||||||
set_target_properties(minitar PROPERTIES OUTPUT_NAME mtar)
|
set_target_properties(minitar PROPERTIES OUTPUT_NAME mtar)
|
||||||
|
|
||||||
include(CheckSourceCompiles)
|
|
||||||
|
|
||||||
# Check for signedness of standard types
|
|
||||||
check_source_compiles(C "#include <sys/types.h>\nint main(int argc, char** argv){ char is_unsigned_size_type[(size_t)0 < (size_t)-1 ? 1 : -1]; }" UNSIGNED_SIZE_TYPE)
|
|
||||||
check_source_compiles(C "#include <sys/types.h>\nint main(int argc, char** argv){ char is_unsigned_time_type[(time_t)0 < (time_t)-1 ? 1 : -1]; }" UNSIGNED_TIME_TYPE)
|
|
||||||
check_source_compiles(C "#include <sys/types.h>\nint main(int argc, char** argv){ char is_unsigned_mode_type[(mode_t)0 < (mode_t)-1 ? 1 : -1]; }" UNSIGNED_MODE_TYPE)
|
|
||||||
check_source_compiles(C "#include <sys/types.h>\nint main(int argc, char** argv){ char is_unsigned_gid_type[(gid_t)0 < (gid_t)-1 ? 1 : -1]; }" UNSIGNED_GID_TYPE)
|
|
||||||
check_source_compiles(C "#include <sys/types.h>\nint main(int argc, char** argv){ char is_unsigned_uid_type[(uid_t)0 < (uid_t)-1 ? 1 : -1]; }" UNSIGNED_UID_TYPE)
|
|
||||||
|
|
||||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h" @ONLY)
|
|
||||||
|
|
||||||
target_include_directories(minitar PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
|
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
target_compile_options(minitar PRIVATE /W4 /WX)
|
target_compile_options(minitar PRIVATE /W4 /WX)
|
||||||
else()
|
else()
|
||||||
|
38
Makefile
Normal file
38
Makefile
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
OUTPUT ?= .
|
||||||
|
LIBNAME ?= libmtar
|
||||||
|
OBJ ?= obj
|
||||||
|
SRC := src
|
||||||
|
|
||||||
|
CC ?= gcc
|
||||||
|
AR ?= ar
|
||||||
|
CFLAGS ?= -O2 -Wall -Wextra
|
||||||
|
CFLAGS := ${CFLAGS} -I.
|
||||||
|
DESTDIR ?= /usr/local
|
||||||
|
|
||||||
|
OBJS := $(OBJ)/tar.o \
|
||||||
|
$(OBJ)/util.o
|
||||||
|
|
||||||
|
build: $(OBJS)
|
||||||
|
@echo -- Creating $(LIBNAME).a
|
||||||
|
@mkdir -p $(OUTPUT)
|
||||||
|
$(AR) rcs $(OUTPUT)/$(LIBNAME).a $(OBJS)
|
||||||
|
|
||||||
|
$(OBJ)/%.o: $(SRC)/%.c
|
||||||
|
@echo -- Compiling $^
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) $(CFLAGS) -o $@ -c $^
|
||||||
|
|
||||||
|
install:
|
||||||
|
@echo -- Installing $(LIBNAME).a
|
||||||
|
@mkdir -p $(DESTDIR)/{lib,include}
|
||||||
|
cp $(OUTPUT)/$(LIBNAME).a $(DESTDIR)/lib
|
||||||
|
cp ./minitar.h $(DESTDIR)/include
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(OBJ)/*.o
|
||||||
|
rm -f $(OUTPUT)/$(LIBNAME).a
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
@echo -- Removing $(LIBNAME).a
|
||||||
|
rm -f $(DESTDIR)/lib/$(LIBNAME).a
|
||||||
|
rm -f $(DESTDIR)/include/minitar.h
|
@ -1,5 +0,0 @@
|
|||||||
#cmakedefine UNSIGNED_SIZE_TYPE
|
|
||||||
#cmakedefine UNSIGNED_TIME_TYPE
|
|
||||||
#cmakedefine UNSIGNED_MODE_TYPE
|
|
||||||
#cmakedefine UNSIGNED_GID_TYPE
|
|
||||||
#cmakedefine UNSIGNED_UID_TYPE
|
|
31
src/util.c
31
src/util.c
@ -1,6 +1,5 @@
|
|||||||
#define _POSIX_C_SOURCE 200809L // for strndup
|
#define _POSIX_C_SOURCE 200809L // for strndup
|
||||||
#define _IN_MINITAR
|
#define _IN_MINITAR
|
||||||
#include "config.h"
|
|
||||||
#include "minitar.h"
|
#include "minitar.h"
|
||||||
#include "tar.h"
|
#include "tar.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -34,42 +33,18 @@ void minitar_parse_tar_header(const struct tar_header* hdr, struct minitar_entry
|
|||||||
metadata->name[256] = '\0';
|
metadata->name[256] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef UNSIGNED_MODE_TYPE
|
|
||||||
metadata->mode = (mode_t)strtoul(hdr->mode, NULL, 8);
|
|
||||||
#else
|
|
||||||
metadata->mode = (mode_t)strtol(hdr->mode, NULL, 8);
|
metadata->mode = (mode_t)strtol(hdr->mode, NULL, 8);
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef UNSIGNED_UID_TYPE
|
|
||||||
metadata->uid = (uid_t)strtoul(hdr->uid, NULL, 8);
|
metadata->uid = (uid_t)strtoul(hdr->uid, NULL, 8);
|
||||||
#else
|
|
||||||
metadata->uid = (uid_t)strtol(hdr->uid, NULL, 8);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef UNSIGNED_GID_TYPE
|
|
||||||
metadata->gid = (gid_t)strtoul(hdr->gid, NULL, 8);
|
metadata->gid = (gid_t)strtoul(hdr->gid, NULL, 8);
|
||||||
#else
|
|
||||||
metadata->gid = (gid_t)strtol(hdr->uid, NULL, 8);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char* sizeptr = strndup(
|
char* sizeptr = strndup(hdr->size, 12);
|
||||||
hdr->size, 12); // The hdr->size field is not null-terminated, yet strndup returns a null-terminated string.
|
|
||||||
if (!sizeptr) minitar_panic("Failed to allocate memory to duplicate a tar header's size field");
|
if (!sizeptr) minitar_panic("Failed to allocate memory to duplicate a tar header's size field");
|
||||||
#ifdef UNSIGNED_SIZE_TYPE
|
|
||||||
metadata->size = (size_t)strtoull(sizeptr, NULL, 8);
|
metadata->size = (size_t)strtoull(sizeptr, NULL, 8);
|
||||||
#else
|
|
||||||
metadata->size = (size_t)strtoll(sizeptr, NULL, 8);
|
|
||||||
#endif
|
|
||||||
free(sizeptr);
|
free(sizeptr);
|
||||||
|
|
||||||
char* timeptr = strndup(
|
char* timeptr = strndup(hdr->mtime, 12);
|
||||||
hdr->mtime, 12); // The hdr->mtime field is not null-terminated, yet strndup returns a null-terminated string.
|
|
||||||
if (!timeptr) minitar_panic("Failed to allocate memory to duplicate a tar header's mtime field");
|
if (!timeptr) minitar_panic("Failed to allocate memory to duplicate a tar header's mtime field");
|
||||||
#ifdef UNSIGNED_TIME_TYPE
|
metadata->mtime = (time_t)strtol(timeptr, NULL, 8);
|
||||||
metadata->mtime = (time_t)strtoull(timeptr, NULL, 8);
|
|
||||||
#else
|
|
||||||
metadata->mtime = (time_t)strtoll(timeptr, NULL, 8);
|
|
||||||
#endif
|
|
||||||
free(timeptr);
|
free(timeptr);
|
||||||
|
|
||||||
switch (hdr->typeflag)
|
switch (hdr->typeflag)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user