Split a few functions out into new file util.c.
1.1 --- a/Makefile Sat Dec 29 19:00:25 2007 -0500
1.2 +++ b/Makefile Thu Jan 03 09:32:31 2008 -0500
1.3 @@ -3,9 +3,9 @@
1.4
1.5 all : razor test-driver
1.6
1.7 -razor : razor.o import.o main.o rpm.o
1.8 +razor : razor.o import.o main.o rpm.o util.o
1.9
1.10 -test-driver : razor.o test-driver.o
1.11 +test-driver : razor.o util.o test-driver.o
1.12
1.13 test : test-driver
1.14 ./test-driver sets.xml test.xml
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/razor-internal.h Thu Jan 03 09:32:31 2008 -0500
2.3 @@ -0,0 +1,11 @@
2.4 +#ifndef _RAZOR_INTERNAL_H_
2.5 +#define _RAZOR_INTERNAL_H_
2.6 +
2.7 +#define ALIGN(value, base) (((value) + (base - 1)) & ~((base) - 1))
2.8 +
2.9 +/* Utility functions */
2.10 +
2.11 +int razor_create_dir(const char *root, const char *path);
2.12 +int razor_write(int fd, const void *data, size_t size);
2.13 +
2.14 +#endif /* _RAZOR_INTERNAL_H_ */
3.1 --- a/razor.c Sat Dec 29 19:00:25 2007 -0500
3.2 +++ b/razor.c Thu Jan 03 09:32:31 2008 -0500
3.3 @@ -14,6 +14,7 @@
3.4 #include <fnmatch.h>
3.5
3.6 #include "razor.h"
3.7 +#include "razor-internal.h"
3.8
3.9 struct array {
3.10 void *data;
3.11 @@ -142,22 +143,6 @@
3.12 return p;
3.13 }
3.14
3.15 -static int
3.16 -write_to_fd(int fd, void *p, size_t size)
3.17 -{
3.18 - int rest, len;
3.19 -
3.20 - rest = size;
3.21 - while (rest > 0) {
3.22 - len = write(fd, p, rest);
3.23 - if (len < 0)
3.24 - return -1;
3.25 - rest -= len;
3.26 - }
3.27 -
3.28 - return 0;
3.29 -}
3.30 -
3.31 static void *
3.32 zalloc(size_t size)
3.33 {
3.34 @@ -262,7 +247,7 @@
3.35 header->sections[i].type = i;
3.36 header->sections[i].offset = offset;
3.37 header->sections[i].size = a->size;
3.38 - offset += (a->size + 4095) & ~4095;
3.39 + offset += ALIGN(a->size, 4096);
3.40 }
3.41
3.42 header->sections[i].type = ~0;
3.43 @@ -273,12 +258,12 @@
3.44 if (fd < 0)
3.45 return -1;
3.46
3.47 - write_to_fd(fd, data, sizeof data);
3.48 + razor_write(fd, data, sizeof data);
3.49 for (i = 0; i < ARRAY_SIZE(razor_sections); i++) {
3.50 if (razor_sections[i].type != i)
3.51 continue;
3.52 a = (void *) set + razor_sections[i].offset;
3.53 - write_to_fd(fd, a->data, (a->size + 4095) & ~4095);
3.54 + razor_write(fd, a->data, ALIGN(a->size, 4096));
3.55 }
3.56
3.57 close(fd);
4.1 --- a/razor.h Sat Dec 29 19:00:25 2007 -0500
4.2 +++ b/razor.h Thu Jan 03 09:32:31 2008 -0500
4.3 @@ -12,6 +12,7 @@
4.4 RAZOR_PROPERTY_OBSOLETES
4.5 };
4.6
4.7 +struct razor_set *razor_set_create(void);
4.8 struct razor_set *razor_set_open(const char *filename);
4.9 void razor_set_destroy(struct razor_set *set);
4.10 int razor_set_write(struct razor_set *set, const char *filename);
5.1 --- a/rpm.c Sat Dec 29 19:00:25 2007 -0500
5.2 +++ b/rpm.c Thu Jan 03 09:32:31 2008 -0500
5.3 @@ -12,6 +12,7 @@
5.4 #include <zlib.h>
5.5
5.6 #include "razor.h"
5.7 +#include "razor-internal.h"
5.8
5.9 #define RPM_LEAD_SIZE 96
5.10
5.11 @@ -39,8 +40,6 @@
5.12 void *payload;
5.13 };
5.14
5.15 -#define ALIGN(value, base) (((value) + (base - 1)) & ~((base) - 1))
5.16 -
5.17 static struct rpm_header_index *
5.18 razor_rpm_get_header(struct razor_rpm *rpm, unsigned int tag)
5.19 {
5.20 @@ -237,68 +236,17 @@
5.21 }
5.22
5.23 static int
5.24 -xwrite(int fd, const void *data, size_t size)
5.25 -{
5.26 - size_t rest;
5.27 - ssize_t written;
5.28 - const unsigned char *p;
5.29 -
5.30 - rest = size;
5.31 - p = data;
5.32 - while (rest > 0) {
5.33 - written = write(fd, p, rest);
5.34 - if (written < 0) {
5.35 - fprintf(stderr, "write error: %m\n");
5.36 - return -1;
5.37 - }
5.38 - rest -= written;
5.39 - p += written;
5.40 - }
5.41 -
5.42 - return 0;
5.43 -}
5.44 -
5.45 -static int
5.46 create_path(struct installer *installer,
5.47 const char *path, const char *name, unsigned int mode)
5.48 {
5.49 - char buffer[256], *p;
5.50 - const char *slash, *next;
5.51 - struct stat buf;
5.52 + char buffer[PATH_MAX];
5.53 int fd;
5.54
5.55 - /* Create all sub-directories in dir and then create name. We
5.56 - * know root exists and is a dir, root does not end in a '/',
5.57 - * and path has a leading '/'. */
5.58 + if (razor_create_dir(installer->root, path) < 0)
5.59 + return -1;
5.60
5.61 - strcpy(buffer, installer->root);
5.62 - p = buffer + strlen(buffer);
5.63 - slash = path;
5.64 - for (slash = path; slash[1] != '\0'; slash = next) {
5.65 - next = strchr(slash + 1, '/');
5.66 - memcpy(p, slash, next - slash);
5.67 - p += next - slash;
5.68 - *p = '\0';
5.69 -
5.70 - if (stat(buffer, &buf) == 0) {
5.71 - if (!S_ISDIR(buf.st_mode)) {
5.72 - fprintf(stderr,
5.73 - "%s exists but is not a directory\n",
5.74 - buffer);
5.75 - return -1;
5.76 - }
5.77 - } else if (mkdir(buffer, 0777) < 0) {
5.78 - fprintf(stderr, "failed to make directory %s: %m\n",
5.79 - buffer);
5.80 - return -1;
5.81 - }
5.82 -
5.83 - /* FIXME: What to do about permissions for dirs we
5.84 - * have to create but are not in the cpio archive? */
5.85 - }
5.86 -
5.87 - *p++ = '/';
5.88 - strcpy(p, name);
5.89 + snprintf(buffer, sizeof buffer, "%s%s/%s",
5.90 + installer->root, path, name);
5.91
5.92 switch (mode >> 12) {
5.93 case REG:
5.94 @@ -312,7 +260,8 @@
5.95 fprintf(stderr, "failed to inflate\n");
5.96 return -1;
5.97 }
5.98 - if (xwrite(fd, installer->buffer, installer->length)) {
5.99 + if (razor_write(fd, installer->buffer,
5.100 + installer->length)) {
5.101 fprintf(stderr, "failed to write payload\n");
5.102 return -1;
5.103 }
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
6.2 +++ b/util.c Thu Jan 03 09:32:31 2008 -0500
6.3 @@ -0,0 +1,68 @@
6.4 +#include <limits.h>
6.5 +#include <string.h>
6.6 +#include <sys/stat.h>
6.7 +#include <stdlib.h>
6.8 +#include <stdio.h>
6.9 +#include <unistd.h>
6.10 +
6.11 +int
6.12 +razor_create_dir(const char *root, const char *path)
6.13 +{
6.14 + char buffer[PATH_MAX], *p;
6.15 + const char *slash, *next;
6.16 + struct stat buf;
6.17 +
6.18 + /* Create all sub-directories in dir and then create name. We
6.19 + * know root exists and is a dir, root does not end in a '/',
6.20 + * and path has a leading '/'. */
6.21 +
6.22 + strcpy(buffer, root);
6.23 + p = buffer + strlen(buffer);
6.24 + slash = path;
6.25 + for (slash = path; slash[1] != '\0'; slash = next) {
6.26 + next = strchr(slash + 1, '/');
6.27 + memcpy(p, slash, next - slash);
6.28 + p += next - slash;
6.29 + *p = '\0';
6.30 +
6.31 + if (stat(buffer, &buf) == 0) {
6.32 + if (!S_ISDIR(buf.st_mode)) {
6.33 + fprintf(stderr,
6.34 + "%s exists but is not a directory\n",
6.35 + buffer);
6.36 + return -1;
6.37 + }
6.38 + } else if (mkdir(buffer, 0777) < 0) {
6.39 + fprintf(stderr, "failed to make directory %s: %m\n",
6.40 + buffer);
6.41 + return -1;
6.42 + }
6.43 +
6.44 + /* FIXME: What to do about permissions for dirs we
6.45 + * have to create but are not in the cpio archive? */
6.46 + }
6.47 +
6.48 + return 0;
6.49 +}
6.50 +
6.51 +int
6.52 +razor_write(int fd, const void *data, size_t size)
6.53 +{
6.54 + size_t rest;
6.55 + ssize_t written;
6.56 + const unsigned char *p;
6.57 +
6.58 + rest = size;
6.59 + p = data;
6.60 + while (rest > 0) {
6.61 + written = write(fd, p, rest);
6.62 + if (written < 0) {
6.63 + fprintf(stderr, "write error: %m\n");
6.64 + return -1;
6.65 + }
6.66 + rest -= written;
6.67 + p += written;
6.68 + }
6.69 +
6.70 + return 0;
6.71 +}