# HG changeset patch # User Kristian H?gsberg # Date 1199370751 18000 # Node ID 6884cefd1b8c8ff45aab561d8fe1d782b49ad654 # Parent 7bd64a40cb03486833aad790a30ca7445acd90fc Split a few functions out into new file util.c. diff -r 7bd64a40cb03 -r 6884cefd1b8c Makefile --- a/Makefile Sat Dec 29 19:00:25 2007 -0500 +++ b/Makefile Thu Jan 03 09:32:31 2008 -0500 @@ -3,9 +3,9 @@ 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 -r 7bd64a40cb03 -r 6884cefd1b8c razor-internal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/razor-internal.h Thu Jan 03 09:32:31 2008 -0500 @@ -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 -r 7bd64a40cb03 -r 6884cefd1b8c razor.c --- a/razor.c Sat Dec 29 19:00:25 2007 -0500 +++ b/razor.c Thu Jan 03 09:32:31 2008 -0500 @@ -14,6 +14,7 @@ #include #include "razor.h" +#include "razor-internal.h" struct array { void *data; @@ -142,22 +143,6 @@ 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 @@ 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 @@ 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 -r 7bd64a40cb03 -r 6884cefd1b8c razor.h --- a/razor.h Sat Dec 29 19:00:25 2007 -0500 +++ b/razor.h Thu Jan 03 09:32:31 2008 -0500 @@ -12,6 +12,7 @@ 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 -r 7bd64a40cb03 -r 6884cefd1b8c rpm.c --- a/rpm.c Sat Dec 29 19:00:25 2007 -0500 +++ b/rpm.c Thu Jan 03 09:32:31 2008 -0500 @@ -12,6 +12,7 @@ #include #include "razor.h" +#include "razor-internal.h" #define RPM_LEAD_SIZE 96 @@ -39,8 +40,6 @@ 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 @@ } 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 '/'. */ + if (razor_create_dir(installer->root, path) < 0) + return -1; - 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? */ - } - - *p++ = '/'; - strcpy(p, name); + snprintf(buffer, sizeof buffer, "%s%s/%s", + installer->root, path, name); switch (mode >> 12) { case REG: @@ -312,7 +260,8 @@ 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 -r 7bd64a40cb03 -r 6884cefd1b8c util.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util.c Thu Jan 03 09:32:31 2008 -0500 @@ -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; +}