Split a few functions out into new file util.c.
authorKristian Høgsberg <krh@redhat.com>
Thu, 3 Jan 2008 14:32:21 +0000 (09:32 -0500)
committerKristian Høgsberg <krh@redhat.com>
Thu, 3 Jan 2008 14:32:31 +0000 (09:32 -0500)
Makefile
razor-internal.h [new file with mode: 0644]
razor.c
razor.h
rpm.c
util.c [new file with mode: 0644]

index e282347..ae7cb78 100644 (file)
--- 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 (file)
index 0000000..2f487b1
--- /dev/null
@@ -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 (file)
--- a/razor.c
+++ b/razor.c
@@ -14,6 +14,7 @@
 #include <fnmatch.h>
 
 #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 (file)
--- 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 (file)
--- a/rpm.c
+++ b/rpm.c
@@ -12,6 +12,7 @@
 #include <zlib.h>
 
 #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 (file)
index 0000000..f0dfc60
--- /dev/null
+++ b/util.c
@@ -0,0 +1,68 @@
+#include <limits.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+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;
+}