Split a few functions out into new file util.c.
authorKristian H?gsberg <krh@redhat.com>
Thu Jan 03 09:32:31 2008 -0500 (2008-01-03)
changeset 916884cefd1b8c
parent 90 7bd64a40cb03
child 92 74f19848a71b
Split a few functions out into new file util.c.
Makefile
razor-internal.h
razor.c
razor.h
rpm.c
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 +}