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