util.c
author Dan Winship <danw@gnome.org>
Wed Mar 05 19:01:51 2008 -0500 (2008-03-05)
changeset 146 1d4043c9f869
parent 91 6884cefd1b8c
child 149 43cac7931189
permissions -rw-r--r--
move razor_set_diff so it's not in the middle of the transaction code
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
danw@136
     8
#include "razor-internal.h"
danw@136
     9
krh@91
    10
int
krh@91
    11
razor_create_dir(const char *root, const char *path)
krh@91
    12
{
krh@91
    13
	char buffer[PATH_MAX], *p;
krh@91
    14
	const char *slash, *next;
krh@91
    15
	struct stat buf;
krh@91
    16
krh@91
    17
	/* Create all sub-directories in dir and then create name. We
krh@91
    18
	 * know root exists and is a dir, root does not end in a '/',
krh@91
    19
	 * and path has a leading '/'. */
krh@91
    20
krh@91
    21
	strcpy(buffer, root);
krh@91
    22
	p = buffer + strlen(buffer);
krh@91
    23
	slash = path;
krh@91
    24
	for (slash = path; slash[1] != '\0'; slash = next) {
krh@91
    25
		next = strchr(slash + 1, '/');
krh@91
    26
		memcpy(p, slash, next - slash);
krh@91
    27
		p += next - slash;
krh@91
    28
		*p = '\0';
krh@91
    29
krh@91
    30
		if (stat(buffer, &buf) == 0) {
krh@91
    31
			if (!S_ISDIR(buf.st_mode)) {
krh@91
    32
				fprintf(stderr,
krh@91
    33
					"%s exists but is not a directory\n",
krh@91
    34
					buffer);
krh@91
    35
				return -1;
krh@91
    36
			}
krh@91
    37
		} else if (mkdir(buffer, 0777) < 0) {
krh@91
    38
			fprintf(stderr, "failed to make directory %s: %m\n",
krh@91
    39
				buffer);
krh@91
    40
			return -1;
krh@91
    41
		}
krh@91
    42
krh@91
    43
		/* FIXME: What to do about permissions for dirs we
krh@91
    44
		 * have to create but are not in the cpio archive? */
krh@91
    45
	}
krh@91
    46
krh@91
    47
	return 0;
krh@91
    48
}
krh@91
    49
krh@91
    50
int
krh@91
    51
razor_write(int fd, const void *data, size_t size)
krh@91
    52
{
krh@91
    53
	size_t rest;
krh@91
    54
	ssize_t written;
krh@91
    55
	const unsigned char *p;
krh@91
    56
krh@91
    57
	rest = size;
krh@91
    58
	p = data;
krh@91
    59
	while (rest > 0) {
krh@91
    60
		written = write(fd, p, rest);
krh@91
    61
		if (written < 0) {
krh@91
    62
			fprintf(stderr, "write error: %m\n");
krh@91
    63
			return -1;
krh@91
    64
		}
krh@91
    65
		rest -= written;
krh@91
    66
		p += written;
krh@91
    67
	}
krh@91
    68
krh@91
    69
	return 0;
krh@91
    70
}