From 7c3e2d5eebcb584efe1b7cb22daf8c7b8c57e8d4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 3 Jan 2008 09:32:21 -0500 Subject: [PATCH] Split a few functions out into new file util.c. --- Makefile | 4 +- razor-internal.h | 11 ++++++++ razor.c | 23 +++--------------- razor.h | 1 + rpm.c | 67 ++++++---------------------------------------------- util.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 94 insertions(+), 80 deletions(-) create mode 100644 razor-internal.h create mode 100644 util.c diff --git a/Makefile b/Makefile index e282347..ae7cb78 100644 --- a/Makefile +++ b/Makefile @@ -3,9 +3,9 @@ LDLIBS = -lexpat -lz -g -lrpm -lcurl all : razor test-driver -razor : razor.o import.o main.o rpm.o +razor : razor.o import.o main.o rpm.o util.o -test-driver : razor.o test-driver.o +test-driver : razor.o util.o test-driver.o test : test-driver ./test-driver sets.xml test.xml diff --git a/razor-internal.h b/razor-internal.h new file mode 100644 index 0000000..2f487b1 --- /dev/null +++ b/razor-internal.h @@ -0,0 +1,11 @@ +#ifndef _RAZOR_INTERNAL_H_ +#define _RAZOR_INTERNAL_H_ + +#define ALIGN(value, base) (((value) + (base - 1)) & ~((base) - 1)) + +/* Utility functions */ + +int razor_create_dir(const char *root, const char *path); +int razor_write(int fd, const void *data, size_t size); + +#endif /* _RAZOR_INTERNAL_H_ */ diff --git a/razor.c b/razor.c index c0c8629..cd531dd 100644 --- a/razor.c +++ b/razor.c @@ -14,6 +14,7 @@ #include #include "razor.h" +#include "razor-internal.h" struct array { void *data; @@ -142,22 +143,6 @@ array_add(struct array *array, int size) return p; } -static int -write_to_fd(int fd, void *p, size_t size) -{ - int rest, len; - - rest = size; - while (rest > 0) { - len = write(fd, p, rest); - if (len < 0) - return -1; - rest -= len; - } - - return 0; -} - static void * zalloc(size_t size) { @@ -262,7 +247,7 @@ razor_set_write(struct razor_set *set, const char *filename) header->sections[i].type = i; header->sections[i].offset = offset; header->sections[i].size = a->size; - offset += (a->size + 4095) & ~4095; + offset += ALIGN(a->size, 4096); } header->sections[i].type = ~0; @@ -273,12 +258,12 @@ razor_set_write(struct razor_set *set, const char *filename) if (fd < 0) return -1; - write_to_fd(fd, data, sizeof data); + razor_write(fd, data, sizeof data); for (i = 0; i < ARRAY_SIZE(razor_sections); i++) { if (razor_sections[i].type != i) continue; a = (void *) set + razor_sections[i].offset; - write_to_fd(fd, a->data, (a->size + 4095) & ~4095); + razor_write(fd, a->data, ALIGN(a->size, 4096)); } close(fd); diff --git a/razor.h b/razor.h index a37b17c..0f7083d 100644 --- a/razor.h +++ b/razor.h @@ -12,6 +12,7 @@ enum razor_property_type { RAZOR_PROPERTY_OBSOLETES }; +struct razor_set *razor_set_create(void); struct razor_set *razor_set_open(const char *filename); void razor_set_destroy(struct razor_set *set); int razor_set_write(struct razor_set *set, const char *filename); diff --git a/rpm.c b/rpm.c index 1e7a67c..3b3a01b 100644 --- a/rpm.c +++ b/rpm.c @@ -12,6 +12,7 @@ #include #include "razor.h" +#include "razor-internal.h" #define RPM_LEAD_SIZE 96 @@ -39,8 +40,6 @@ struct razor_rpm { void *payload; }; -#define ALIGN(value, base) (((value) + (base - 1)) & ~((base) - 1)) - static struct rpm_header_index * razor_rpm_get_header(struct razor_rpm *rpm, unsigned int tag) { @@ -237,68 +236,17 @@ installer_inflate(struct installer *installer) } static int -xwrite(int fd, const void *data, size_t size) -{ - size_t rest; - ssize_t written; - const unsigned char *p; - - rest = size; - p = data; - while (rest > 0) { - written = write(fd, p, rest); - if (written < 0) { - fprintf(stderr, "write error: %m\n"); - return -1; - } - rest -= written; - p += written; - } - - return 0; -} - -static int create_path(struct installer *installer, const char *path, const char *name, unsigned int mode) { - char buffer[256], *p; - const char *slash, *next; - struct stat buf; + char buffer[PATH_MAX]; int fd; - /* Create all sub-directories in dir and then create name. We - * know root exists and is a dir, root does not end in a '/', - * and path has a leading '/'. */ - - strcpy(buffer, installer->root); - p = buffer + strlen(buffer); - slash = path; - for (slash = path; slash[1] != '\0'; slash = next) { - next = strchr(slash + 1, '/'); - memcpy(p, slash, next - slash); - p += next - slash; - *p = '\0'; - - if (stat(buffer, &buf) == 0) { - if (!S_ISDIR(buf.st_mode)) { - fprintf(stderr, - "%s exists but is not a directory\n", - buffer); - return -1; - } - } else if (mkdir(buffer, 0777) < 0) { - fprintf(stderr, "failed to make directory %s: %m\n", - buffer); - return -1; - } - - /* FIXME: What to do about permissions for dirs we - * have to create but are not in the cpio archive? */ - } + if (razor_create_dir(installer->root, path) < 0) + return -1; - *p++ = '/'; - strcpy(p, name); + snprintf(buffer, sizeof buffer, "%s%s/%s", + installer->root, path, name); switch (mode >> 12) { case REG: @@ -312,7 +260,8 @@ create_path(struct installer *installer, fprintf(stderr, "failed to inflate\n"); return -1; } - if (xwrite(fd, installer->buffer, installer->length)) { + if (razor_write(fd, installer->buffer, + installer->length)) { fprintf(stderr, "failed to write payload\n"); return -1; } diff --git a/util.c b/util.c new file mode 100644 index 0000000..f0dfc60 --- /dev/null +++ b/util.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include + +int +razor_create_dir(const char *root, const char *path) +{ + char buffer[PATH_MAX], *p; + const char *slash, *next; + struct stat buf; + + /* Create all sub-directories in dir and then create name. We + * know root exists and is a dir, root does not end in a '/', + * and path has a leading '/'. */ + + strcpy(buffer, root); + p = buffer + strlen(buffer); + slash = path; + for (slash = path; slash[1] != '\0'; slash = next) { + next = strchr(slash + 1, '/'); + memcpy(p, slash, next - slash); + p += next - slash; + *p = '\0'; + + if (stat(buffer, &buf) == 0) { + if (!S_ISDIR(buf.st_mode)) { + fprintf(stderr, + "%s exists but is not a directory\n", + buffer); + return -1; + } + } else if (mkdir(buffer, 0777) < 0) { + fprintf(stderr, "failed to make directory %s: %m\n", + buffer); + return -1; + } + + /* FIXME: What to do about permissions for dirs we + * have to create but are not in the cpio archive? */ + } + + return 0; +} + +int +razor_write(int fd, const void *data, size_t size) +{ + size_t rest; + ssize_t written; + const unsigned char *p; + + rest = size; + p = data; + while (rest > 0) { + written = write(fd, p, rest); + if (written < 0) { + fprintf(stderr, "write error: %m\n"); + return -1; + } + rest -= written; + p += written; + } + + return 0; +} -- 1.7.1