rpm.c
changeset 98 ec850cbd6935
parent 89 feaf8640e017
child 109 313b0a615c14
     1.1 --- a/rpm.c	Sat Dec 29 16:43:34 2007 -0500
     1.2 +++ b/rpm.c	Thu Jan 10 23:03:03 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  			}