util.c
author Dan Winship <danw@gnome.org>
Tue Mar 11 18:12:02 2008 -0400 (2008-03-11)
changeset 167 28e203d118c7
parent 136 eef2b734f2cc
child 186 7f45d0401e37
permissions -rw-r--r--
move the initialization of the root entry name to razor_set_create
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@149
    24
	for (slash = path; *slash != '\0'; slash = next) {
krh@91
    25
		next = strchr(slash + 1, '/');
krh@149
    26
		if (next == NULL)
krh@149
    27
			next = slash + strlen(slash);
krh@149
    28
krh@91
    29
		memcpy(p, slash, next - slash);
krh@91
    30
		p += next - slash;
krh@91
    31
		*p = '\0';
krh@91
    32
krh@91
    33
		if (stat(buffer, &buf) == 0) {
krh@91
    34
			if (!S_ISDIR(buf.st_mode)) {
krh@91
    35
				fprintf(stderr,
krh@91
    36
					"%s exists but is not a directory\n",
krh@91
    37
					buffer);
krh@91
    38
				return -1;
krh@91
    39
			}
krh@91
    40
		} else if (mkdir(buffer, 0777) < 0) {
krh@91
    41
			fprintf(stderr, "failed to make directory %s: %m\n",
krh@91
    42
				buffer);
krh@91
    43
			return -1;
krh@91
    44
		}
krh@91
    45
krh@91
    46
		/* FIXME: What to do about permissions for dirs we
krh@91
    47
		 * have to create but are not in the cpio archive? */
krh@91
    48
	}
krh@91
    49
krh@91
    50
	return 0;
krh@91
    51
}
krh@91
    52
krh@91
    53
int
krh@91
    54
razor_write(int fd, const void *data, size_t size)
krh@91
    55
{
krh@91
    56
	size_t rest;
krh@91
    57
	ssize_t written;
krh@91
    58
	const unsigned char *p;
krh@91
    59
krh@91
    60
	rest = size;
krh@91
    61
	p = data;
krh@91
    62
	while (rest > 0) {
krh@91
    63
		written = write(fd, p, rest);
krh@91
    64
		if (written < 0) {
krh@91
    65
			fprintf(stderr, "write error: %m\n");
krh@91
    66
			return -1;
krh@91
    67
		}
krh@91
    68
		rest -= written;
krh@91
    69
		p += written;
krh@91
    70
	}
krh@91
    71
krh@91
    72
	return 0;
krh@91
    73
}