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
--- /dev/null
+#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_ */
#include <fnmatch.h>
#include "razor.h"
+#include "razor-internal.h"
struct array {
void *data;
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)
{
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;
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);
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);
#include <zlib.h>
#include "razor.h"
+#include "razor-internal.h"
#define RPM_LEAD_SIZE 96
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)
{
}
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:
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;
}
--- /dev/null
+#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;
+}