util.c
author Kristian H?gsberg <krh@redhat.com>
Thu Jan 10 21:08:03 2008 -0500 (2008-01-10)
changeset 94 0aa93cfbcb3f
child 136 eef2b734f2cc
permissions -rw-r--r--
Fix a few warnings.
     1 #include <limits.h>
     2 #include <string.h>
     3 #include <sys/stat.h>
     4 #include <stdlib.h>
     5 #include <stdio.h>
     6 #include <unistd.h>
     7 
     8 int
     9 razor_create_dir(const char *root, const char *path)
    10 {
    11 	char buffer[PATH_MAX], *p;
    12 	const char *slash, *next;
    13 	struct stat buf;
    14 
    15 	/* Create all sub-directories in dir and then create name. We
    16 	 * know root exists and is a dir, root does not end in a '/',
    17 	 * and path has a leading '/'. */
    18 
    19 	strcpy(buffer, root);
    20 	p = buffer + strlen(buffer);
    21 	slash = path;
    22 	for (slash = path; slash[1] != '\0'; slash = next) {
    23 		next = strchr(slash + 1, '/');
    24 		memcpy(p, slash, next - slash);
    25 		p += next - slash;
    26 		*p = '\0';
    27 
    28 		if (stat(buffer, &buf) == 0) {
    29 			if (!S_ISDIR(buf.st_mode)) {
    30 				fprintf(stderr,
    31 					"%s exists but is not a directory\n",
    32 					buffer);
    33 				return -1;
    34 			}
    35 		} else if (mkdir(buffer, 0777) < 0) {
    36 			fprintf(stderr, "failed to make directory %s: %m\n",
    37 				buffer);
    38 			return -1;
    39 		}
    40 
    41 		/* FIXME: What to do about permissions for dirs we
    42 		 * have to create but are not in the cpio archive? */
    43 	}
    44 
    45 	return 0;
    46 }
    47 
    48 int
    49 razor_write(int fd, const void *data, size_t size)
    50 {
    51 	size_t rest;
    52 	ssize_t written;
    53 	const unsigned char *p;
    54 
    55 	rest = size;
    56 	p = data;
    57 	while (rest > 0) {
    58 		written = write(fd, p, rest);
    59 		if (written < 0) {
    60 			fprintf(stderr, "write error: %m\n");
    61 			return -1;
    62 		}
    63 		rest -= written;
    64 		p += written;
    65 	}
    66 
    67 	return 0;
    68 }