aboutsummaryrefslogtreecommitdiff
path: root/src/docker.c
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2024-10-14 09:32:03 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2024-10-14 09:43:31 -0400
commit5a9688e9e78a25a42bddfc4388fb4ce3311ded74 (patch)
treebcc1b54c3f8a7f1eab0d6b3e129f098721a41537 /src/docker.c
parentb98088f7b7cfe4b08eb39fa1b6b86210cb6c08b8 (diff)
downloadstasis-5a9688e9e78a25a42bddfc4388fb4ce3311ded74.tar.gz
Refactor directory structure
* Move core library sources into src/lib/core * Move command-line programs into src/cli
Diffstat (limited to 'src/docker.c')
-rw-r--r--src/docker.c205
1 files changed, 0 insertions, 205 deletions
diff --git a/src/docker.c b/src/docker.c
deleted file mode 100644
index 2d5e2cc..0000000
--- a/src/docker.c
+++ /dev/null
@@ -1,205 +0,0 @@
-#include "core.h"
-#include "docker.h"
-
-
-int docker_exec(const char *args, unsigned flags) {
- struct Process proc;
- char cmd[PATH_MAX];
-
- memset(&proc, 0, sizeof(proc));
- memset(cmd, 0, sizeof(cmd));
- snprintf(cmd, sizeof(cmd) - 1, "docker %s", args);
- if (flags & STASIS_DOCKER_QUIET) {
- strcpy(proc.f_stdout, "/dev/null");
- strcpy(proc.f_stderr, "/dev/null");
- } else {
- msg(STASIS_MSG_L2, "Executing: %s\n", cmd);
- }
-
- shell(&proc, cmd);
- return proc.returncode;
-}
-
-int docker_script(const char *image, char *data, unsigned flags) {
- (void)flags; // TODO: placeholder
- FILE *infile;
- FILE *outfile;
- char cmd[PATH_MAX];
- char buffer[STASIS_BUFSIZ];
-
- memset(cmd, 0, sizeof(cmd));
- snprintf(cmd, sizeof(cmd) - 1, "docker run --rm -i %s /bin/sh -", image);
-
- outfile = popen(cmd, "w");
- if (!outfile) {
- // opening command pipe for writing failed
- return -1;
- }
-
- infile = fmemopen(data, strlen(data), "r");
- if (!infile) {
- // opening memory file for reading failed
- return -1;
- }
-
- do {
- memset(buffer, 0, sizeof(buffer));
- if (fgets(buffer, sizeof(buffer) - 1, infile) != NULL) {
- fputs(buffer, outfile);
- }
- } while (!feof(infile));
-
- fclose(infile);
- return pclose(outfile);
-}
-
-int docker_build(const char *dirpath, const char *args, int engine) {
- char cmd[PATH_MAX];
- char build[15];
-
- memset(build, 0, sizeof(build));
- memset(cmd, 0, sizeof(cmd));
-
- if (engine & STASIS_DOCKER_BUILD) {
- strcpy(build, "build");
- }
- if (engine & STASIS_DOCKER_BUILD_X) {
- strcpy(build, "buildx build");
- }
- snprintf(cmd, sizeof(cmd) - 1, "%s %s %s", build, args, dirpath);
- return docker_exec(cmd, 0);
-}
-
-int docker_save(const char *image, const char *destdir, const char *compression_program) {
- char cmd[PATH_MAX];
-
- memset(cmd, 0, sizeof(cmd));
-
- if (compression_program && strlen(compression_program)) {
- char ext[255];
- memset(ext, 0, sizeof(ext));
- if (startswith(compression_program, "zstd")) {
- strcpy(ext, "zst");
- } else if (startswith(compression_program, "xz")) {
- strcpy(ext, "xz");
- } else if (startswith(compression_program, "gzip")) {
- strcpy(ext, "gz");
- } else if (startswith(compression_program, "bzip2")) {
- strcpy(ext, "bz2");
- } else {
- strncpy(ext, compression_program, sizeof(ext) - 1);
- }
- sprintf(cmd, "save \"%s\" | %s > \"%s/%s.tar.%s\"", image, compression_program, destdir, image, ext);
- } else {
- sprintf(cmd, "save \"%s\" -o \"%s/%s.tar\"", image, destdir, image);
-
- }
- return docker_exec(cmd, 0);
-}
-
-static int docker_exists() {
- if (find_program("docker")) {
- return true;
- }
- return false;
-}
-
-static char *docker_ident() {
- FILE *fp = NULL;
- char *tempfile = NULL;
- char line[PATH_MAX];
- struct Process proc;
-
- tempfile = xmkstemp(&fp, "w+");
- if (!fp || !tempfile) {
- return NULL;
- }
-
- memset(&proc, 0, sizeof(proc));
- strcpy(proc.f_stdout, tempfile);
- strcpy(proc.f_stderr, "/dev/null");
- shell(&proc, "docker --version");
-
- if (!freopen(tempfile, "r", fp)) {
- remove(tempfile);
- guard_free(tempfile);
- return NULL;
- }
-
- if (!fgets(line, sizeof(line) - 1, fp)) {
- fclose(fp);
- remove(tempfile);
- guard_free(tempfile);
- return NULL;
- }
-
- fclose(fp);
- remove(tempfile);
- guard_free(tempfile);
-
- return strdup(line);
-}
-
-int docker_capable(struct DockerCapabilities *result) {
- char *version = NULL;
- memset(result, 0, sizeof(*result));
-
- if (!docker_exists()) {
- // docker isn't available
- return false;
- }
- result->available = true;
-
- if (docker_exec("ps", STASIS_DOCKER_QUIET)) {
- // user cannot connect to the socket
- return false;
- }
-
- version = docker_ident();
- if (version && startswith(version, "podman")) {
- result->podman = true;
- }
- guard_free(version);
-
- if (!docker_exec("buildx build --help", STASIS_DOCKER_QUIET)) {
- result->build |= STASIS_DOCKER_BUILD_X;
- }
- if (!docker_exec("build --help", STASIS_DOCKER_QUIET)) {
- result->build |= STASIS_DOCKER_BUILD;
- }
- if (!result->build) {
- // can't use docker without a build plugin
- return false;
- }
- result->usable = true;
- return true;
-}
-
-void docker_sanitize_tag(char *str) {
- char *pos = str;
- while (*pos != 0) {
- if (!isalnum(*pos)) {
- if (*pos != '.' && *pos != ':' && *pos != '/') {
- *pos = '-';
- }
- }
- pos++;
- }
-}
-
-int docker_validate_compression_program(char *prog) {
- int result = -1;
- char **parts = NULL;
- if (!prog) {
- goto invalid;
- }
- parts = split(prog, " ", 1);
- if (!parts) {
- goto invalid;
- }
- result = find_program(parts[0]) ? 0 : -1;
-
- invalid:
- GENERIC_ARRAY_FREE(parts);
- return result;
-}