Compare commits
2 Commits
5f4c96bb0a
...
0.0.2
Author | SHA1 | Date | |
---|---|---|---|
7642a79c02 | |||
99a5a7693e |
14
Makefile
Normal file
14
Makefile
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
all: slabpkg.pkg
|
||||||
|
|
||||||
|
dist/slabpkg: slabpkg.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
slabpkg.pkg: slabpkg.pkb dist/slabpkg
|
||||||
|
dist/slabpkg build slabpkg.pkb
|
||||||
|
|
||||||
|
testroot/slabpkg: dist/slabpkg slabpkg.pkg testroot/README.md
|
||||||
|
dist/slabpkg --root ./testroot install slabpkg.pkg
|
||||||
|
|
||||||
|
test: dist/slabpkg testroot/slabpkg
|
||||||
|
dist/slabpkg sum $^
|
||||||
|
testroot/slabpkg sum $^
|
55
slabpkg.c
55
slabpkg.c
@@ -6,6 +6,9 @@
|
|||||||
#ifndef PKG_MKDIR_SIMPLE
|
#ifndef PKG_MKDIR_SIMPLE
|
||||||
#define PKG_MKDIR_LINUX
|
#define PKG_MKDIR_LINUX
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef PKG_CHMOD_SIMPLE
|
||||||
|
#define PKG_CHMOD_LINUX
|
||||||
|
#endif
|
||||||
|
|
||||||
// For reliable integer sizing
|
// For reliable integer sizing
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -25,6 +28,15 @@ int mkdir(const char* dirname);
|
|||||||
#error Either (-D) PKG_MKDIR_LINUX or PKG_MKDIR_SIMPLE must be defined
|
#error Either (-D) PKG_MKDIR_LINUX or PKG_MKDIR_SIMPLE must be defined
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
// For chmod
|
||||||
|
#ifdef PKG_CHMOD_LINUX
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#else
|
||||||
|
#ifdef PKG_CHMOD_NONE
|
||||||
|
#else
|
||||||
|
#error Either (-D) PKG_CHMOD_LINUX or PKG_CHMOD_SIMPLE must be defined
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// The compressed buffer needs to be a bit over twice size the regular
|
// The compressed buffer needs to be a bit over twice size the regular
|
||||||
// buffer to account for worst case scenario.
|
// buffer to account for worst case scenario.
|
||||||
@@ -38,6 +50,7 @@ int mkdir(const char* dirname);
|
|||||||
#define PKG_JOBTYPE_COMPRESS 5
|
#define PKG_JOBTYPE_COMPRESS 5
|
||||||
#define PKG_JOBTYPE_DECOMPRESS 6
|
#define PKG_JOBTYPE_DECOMPRESS 6
|
||||||
|
|
||||||
|
#define PKG_FLAGS_TYPEMASK 0xF00
|
||||||
#define PKG_FLAGS_DIRECTORY 0x100
|
#define PKG_FLAGS_DIRECTORY 0x100
|
||||||
#define PKG_FLAGS_EXECUTABLE 0x200
|
#define PKG_FLAGS_EXECUTABLE 0x200
|
||||||
#define PKG_FLAGS_PROVIDES 0x300
|
#define PKG_FLAGS_PROVIDES 0x300
|
||||||
@@ -110,7 +123,7 @@ char pkg_comprbuffer[PKG_COMPRBUFSIZE];
|
|||||||
|
|
||||||
int pkg_mkdir(const char* path) {
|
int pkg_mkdir(const char* path) {
|
||||||
#ifdef PKG_MKDIR_LINUX
|
#ifdef PKG_MKDIR_LINUX
|
||||||
return mkdir(path, 0775);
|
return mkdir(path, 0755); // NOTE: Was previously using 0775, figured more secure by default is better?
|
||||||
#endif
|
#endif
|
||||||
#ifdef PKG_MKDIR_SIMPLE
|
#ifdef PKG_MKDIR_SIMPLE
|
||||||
return mkdir(path);
|
return mkdir(path);
|
||||||
@@ -121,6 +134,23 @@ int pkg_remove(const char* path, int isdir) {
|
|||||||
return unlink(path);
|
return unlink(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pkg_chmod_default(const char* path) {
|
||||||
|
#ifdef PKG_CHMOD_LINUX
|
||||||
|
return chmod(path, 0644);
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int pkg_chmod_executable(const char* path) {
|
||||||
|
#ifdef PKG_CHMOD_LINUX
|
||||||
|
return chmod(path, 0755);
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "NOTE: Ignoring executable bit for '%s'\n", path);
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int pkg_versionmeta_alldigits(pkg_versionmeta_t* m) {
|
int pkg_versionmeta_alldigits(pkg_versionmeta_t* m) {
|
||||||
const char* s = m->value;
|
const char* s = m->value;
|
||||||
while (*s) {
|
while (*s) {
|
||||||
@@ -516,6 +546,7 @@ int pkg_sum_init(pkg_sum_t* sum, char* filename, int dupfilename) {
|
|||||||
if (sum == NULL) {
|
if (sum == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
sum->flags = 0;
|
||||||
sum->cmprsize = 0;
|
sum->cmprsize = 0;
|
||||||
sum->extrsize = 0;
|
sum->extrsize = 0;
|
||||||
sum->checksum64 = 0x811C9DC5BADC0DE5ULL;
|
sum->checksum64 = 0x811C9DC5BADC0DE5ULL;
|
||||||
@@ -846,10 +877,14 @@ int pkg_archive_extractcontents(pkg_archive_t* archive, FILE* input, const char*
|
|||||||
while (filehdr != NULL) {
|
while (filehdr != NULL) {
|
||||||
char* outputname = pkg_ezstrcat(installroot, filehdr->name); // Note, this assumes one or the other includes a path separator
|
char* outputname = pkg_ezstrcat(installroot, filehdr->name); // Note, this assumes one or the other includes a path separator
|
||||||
|
|
||||||
if (filehdr->flags & PKG_FLAGS_DIRECTORY) {
|
int t = filehdr->flags & PKG_FLAGS_TYPEMASK;
|
||||||
|
|
||||||
|
if (t == PKG_FLAGS_DIRECTORY) {
|
||||||
fprintf(stderr, "Creating directory '%s'...\n", outputname);
|
fprintf(stderr, "Creating directory '%s'...\n", outputname);
|
||||||
int mkdirresult = pkg_mkdir(outputname);
|
int mkdirresult = pkg_mkdir(outputname);
|
||||||
fprintf(stderr, "mkdir of '%s' returned %d\n", outputname, mkdirresult);
|
fprintf(stderr, "mkdir of '%s' returned %d\n", outputname, mkdirresult);
|
||||||
|
} else if (t == PKG_FLAGS_PROVIDES || t == PKG_FLAGS_REQUIRES || t == PKG_FLAGS_SUGGESTS || t == PKG_FLAGS_CONFLICTS) {
|
||||||
|
fprintf(stderr, "Ignoring metadata line '%s'...\n", filehdr->name);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Creating file '%s'...\n", outputname);
|
fprintf(stderr, "Creating file '%s'...\n", outputname);
|
||||||
FILE* f = fopen(outputname, "w");
|
FILE* f = fopen(outputname, "w");
|
||||||
@@ -892,6 +927,12 @@ int pkg_archive_extractcontents(pkg_archive_t* archive, FILE* input, const char*
|
|||||||
fprintf(stderr, "VERIFICATION ERROR: File data checksums for '%s' don't match. Recorded checksum 0x%X, calculated checksum 0x%X!\n", filehdr->name, filehdr->checksum32, datasum.checksum32);
|
fprintf(stderr, "VERIFICATION ERROR: File data checksums for '%s' don't match. Recorded checksum 0x%X, calculated checksum 0x%X!\n", filehdr->name, filehdr->checksum32, datasum.checksum32);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (t == PKG_FLAGS_EXECUTABLE) {
|
||||||
|
pkg_chmod_executable(outputname);
|
||||||
|
} else {
|
||||||
|
pkg_chmod_default(outputname);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
filehdr = filehdr->next;
|
filehdr = filehdr->next;
|
||||||
@@ -1054,7 +1095,7 @@ int pkg_job_build(pkg_job_t* job, char* name) {
|
|||||||
outname[strlen(outname)-1] = 'g'; // "*.pkb"-> "*.pkg"
|
outname[strlen(outname)-1] = 'g'; // "*.pkb"-> "*.pkg"
|
||||||
char* shortname = strndup(name + sepi, n - (sepi + 4)); // Trim directory path and filename extension
|
char* shortname = strndup(name + sepi, n - (sepi + 4)); // Trim directory path and filename extension
|
||||||
|
|
||||||
printf("TODO build '%s' source dirname '%s' dist dirname '%s' output name '%s' shortname '%s'...\n", name, srcd, distd, outname, shortname);
|
//printf("TODO build '%s' source dirname '%s' dist dirname '%s' output name '%s' shortname '%s'...\n", name, srcd, distd, outname, shortname);
|
||||||
|
|
||||||
FILE* buildf = fopen(name, "rb");
|
FILE* buildf = fopen(name, "rb");
|
||||||
|
|
||||||
@@ -1754,7 +1795,11 @@ int main(int argc, char** argv) {
|
|||||||
if (argi >= argc) {
|
if (argi >= argc) {
|
||||||
return usage(argc, argv, argi, "Expected a directory name following the --root option.");
|
return usage(argc, argv, argi, "Expected a directory name following the --root option.");
|
||||||
}
|
}
|
||||||
job.installroot = strdup(argv[argi]);
|
if (strlen(argv[argi]) == 0 || (argv[argi][strlen(argv[argi])-1] != '/' && argv[argi][strlen(argv[argi])-1] != '\\')) {
|
||||||
|
job.installroot = pkg_ezstrcat(argv[argi], "/");
|
||||||
|
} else {
|
||||||
|
job.installroot = strdup(argv[argi]);
|
||||||
|
}
|
||||||
argi++;
|
argi++;
|
||||||
} else if (!strcmp(argv[argi], "--dbroot")) {
|
} else if (!strcmp(argv[argi], "--dbroot")) {
|
||||||
argi++;
|
argi++;
|
||||||
@@ -1840,4 +1885,4 @@ int main(int argc, char** argv) {
|
|||||||
} else {
|
} else {
|
||||||
return usage(argc, argv, argi, "Unrecognised command");
|
return usage(argc, argv, argi, "Unrecognised command");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
3
testroot/README.md
Normal file
3
testroot/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# The testroot Directory
|
||||||
|
|
||||||
|
This directory only exists for testing `slabpkg` installing itself, and this file only exists so that the directory isn't deleted from the source directory.
|
Reference in New Issue
Block a user