1.1 --- a/rpm.c Sat Dec 29 16:43:34 2007 -0500
1.2 +++ b/rpm.c Mon Feb 04 10:12:04 2008 -0500
1.3 @@ -12,6 +12,7 @@
1.4 #include <zlib.h>
1.5
1.6 #include "razor.h"
1.7 +#include "razor-internal.h"
1.8
1.9 #define RPM_LEAD_SIZE 96
1.10
1.11 @@ -39,8 +40,6 @@
1.12 void *payload;
1.13 };
1.14
1.15 -#define ALIGN(value, base) (((value) + (base - 1)) & ~((base) - 1))
1.16 -
1.17 static struct rpm_header_index *
1.18 razor_rpm_get_header(struct razor_rpm *rpm, unsigned int tag)
1.19 {
1.20 @@ -237,68 +236,17 @@
1.21 }
1.22
1.23 static int
1.24 -xwrite(int fd, const void *data, size_t size)
1.25 -{
1.26 - size_t rest;
1.27 - ssize_t written;
1.28 - const unsigned char *p;
1.29 -
1.30 - rest = size;
1.31 - p = data;
1.32 - while (rest > 0) {
1.33 - written = write(fd, p, rest);
1.34 - if (written < 0) {
1.35 - fprintf(stderr, "write error: %m\n");
1.36 - return -1;
1.37 - }
1.38 - rest -= written;
1.39 - p += written;
1.40 - }
1.41 -
1.42 - return 0;
1.43 -}
1.44 -
1.45 -static int
1.46 create_path(struct installer *installer,
1.47 const char *path, const char *name, unsigned int mode)
1.48 {
1.49 - char buffer[256], *p;
1.50 - const char *slash, *next;
1.51 - struct stat buf;
1.52 + char buffer[PATH_MAX];
1.53 int fd;
1.54
1.55 - /* Create all sub-directories in dir and then create name. We
1.56 - * know root exists and is a dir, root does not end in a '/',
1.57 - * and path has a leading '/'. */
1.58 + if (razor_create_dir(installer->root, path) < 0)
1.59 + return -1;
1.60
1.61 - strcpy(buffer, installer->root);
1.62 - p = buffer + strlen(buffer);
1.63 - slash = path;
1.64 - for (slash = path; slash[1] != '\0'; slash = next) {
1.65 - next = strchr(slash + 1, '/');
1.66 - memcpy(p, slash, next - slash);
1.67 - p += next - slash;
1.68 - *p = '\0';
1.69 -
1.70 - if (stat(buffer, &buf) == 0) {
1.71 - if (!S_ISDIR(buf.st_mode)) {
1.72 - fprintf(stderr,
1.73 - "%s exists but is not a directory\n",
1.74 - buffer);
1.75 - return -1;
1.76 - }
1.77 - } else if (mkdir(buffer, 0777) < 0) {
1.78 - fprintf(stderr, "failed to make directory %s: %m\n",
1.79 - buffer);
1.80 - return -1;
1.81 - }
1.82 -
1.83 - /* FIXME: What to do about permissions for dirs we
1.84 - * have to create but are not in the cpio archive? */
1.85 - }
1.86 -
1.87 - *p++ = '/';
1.88 - strcpy(p, name);
1.89 + snprintf(buffer, sizeof buffer, "%s%s/%s",
1.90 + installer->root, path, name);
1.91
1.92 switch (mode >> 12) {
1.93 case REG:
1.94 @@ -312,7 +260,8 @@
1.95 fprintf(stderr, "failed to inflate\n");
1.96 return -1;
1.97 }
1.98 - if (xwrite(fd, installer->buffer, installer->length)) {
1.99 + if (razor_write(fd, installer->buffer,
1.100 + installer->length)) {
1.101 fprintf(stderr, "failed to write payload\n");
1.102 return -1;
1.103 }