util.c
changeset 241 c3eb520e2219
parent 240 edd5fe0a00ba
child 242 f2218527ad4a
     1.1 --- a/util.c	Sun Jun 15 23:15:59 2008 -0400
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,167 +0,0 @@
     1.4 -#include <limits.h>
     1.5 -#include <string.h>
     1.6 -#include <sys/stat.h>
     1.7 -#include <stdlib.h>
     1.8 -#include <stdio.h>
     1.9 -#include <stdint.h>
    1.10 -#include <unistd.h>
    1.11 -
    1.12 -#include "razor-internal.h"
    1.13 -
    1.14 -int
    1.15 -razor_create_dir(const char *root, const char *path)
    1.16 -{
    1.17 -	char buffer[PATH_MAX], *p;
    1.18 -	const char *slash, *next;
    1.19 -	struct stat buf;
    1.20 -
    1.21 -	/* Create all sub-directories in dir. We know root exists and
    1.22 -	 * is a dir, root does not end in a '/', and path has a
    1.23 -	 * leading '/'. */
    1.24 -
    1.25 -	strcpy(buffer, root);
    1.26 -	p = buffer + strlen(buffer);
    1.27 -	slash = path;
    1.28 -	for (slash = path; *slash != '\0'; slash = next) {
    1.29 -		next = strchr(slash + 1, '/');
    1.30 -		if (next == NULL)
    1.31 -			break;
    1.32 -
    1.33 -		memcpy(p, slash, next - slash);
    1.34 -		p += next - slash;
    1.35 -		*p = '\0';
    1.36 -
    1.37 -		if (stat(buffer, &buf) == 0) {
    1.38 -			if (!S_ISDIR(buf.st_mode)) {
    1.39 -				fprintf(stderr,
    1.40 -					"%s exists but is not a directory\n",
    1.41 -					buffer);
    1.42 -				return -1;
    1.43 -			}
    1.44 -		} else if (mkdir(buffer, 0777) < 0) {
    1.45 -			fprintf(stderr, "failed to make directory %s: %m\n",
    1.46 -				buffer);
    1.47 -			return -1;
    1.48 -		}
    1.49 -
    1.50 -		/* FIXME: What to do about permissions for dirs we
    1.51 -		 * have to create but are not in the cpio archive? */
    1.52 -	}
    1.53 -
    1.54 -	return 0;
    1.55 -}
    1.56 -
    1.57 -int
    1.58 -razor_write(int fd, const void *data, size_t size)
    1.59 -{
    1.60 -	size_t rest;
    1.61 -	ssize_t written;
    1.62 -	const unsigned char *p;
    1.63 -
    1.64 -	rest = size;
    1.65 -	p = data;
    1.66 -	while (rest > 0) {
    1.67 -		written = write(fd, p, rest);
    1.68 -		if (written < 0) {
    1.69 -			fprintf(stderr, "write error: %m\n");
    1.70 -			return -1;
    1.71 -		}
    1.72 -		rest -= written;
    1.73 -		p += written;
    1.74 -	}
    1.75 -
    1.76 -	return 0;
    1.77 -}
    1.78 -
    1.79 -struct qsort_context {
    1.80 -	size_t size;
    1.81 -	razor_compare_with_data_func_t compare;
    1.82 -	void *data;
    1.83 -};
    1.84 -
    1.85 -static void
    1.86 -qsort_swap(void *p1, void *p2, size_t size)
    1.87 -{
    1.88 -	char buffer[size];
    1.89 -
    1.90 -	memcpy(buffer, p1, size);
    1.91 -	memcpy(p1, p2, size);
    1.92 -	memcpy(p2, buffer, size);
    1.93 -}
    1.94 -
    1.95 -static void
    1.96 -__qsort_with_data(void *base, size_t nelem, uint32_t *map,
    1.97 -		  struct qsort_context *ctx)
    1.98 -{
    1.99 -	void *p, *start, *end, *pivot;
   1.100 -	uint32_t *mp, *mstart, *mend, tmp;
   1.101 -	int left, right, result;
   1.102 -	size_t size = ctx->size;
   1.103 -
   1.104 -	p = base;
   1.105 -	start = base;
   1.106 -	end = base + nelem * size;
   1.107 -	mp = map;
   1.108 -	mstart = map;
   1.109 -	mend = map + nelem;
   1.110 -	pivot = base + (random() % nelem) * size;
   1.111 -
   1.112 -	while (p < end) {
   1.113 -		result = ctx->compare(p, pivot, ctx->data);
   1.114 -		if (result < 0) {
   1.115 -			qsort_swap(p, start, size);
   1.116 -			tmp = *mp;
   1.117 -			*mp = *mstart;
   1.118 -			*mstart = tmp;
   1.119 -			if (start == pivot)
   1.120 -				pivot = p;
   1.121 -			start += size;
   1.122 -			mstart++;
   1.123 -			p += size;
   1.124 -			mp++;
   1.125 -		} else if (result == 0) {
   1.126 -			p += size;
   1.127 -			mp++;
   1.128 -		} else {
   1.129 - 			end -= size;
   1.130 -			mend--;
   1.131 -			qsort_swap(p, end, size);
   1.132 -			tmp = *mp;
   1.133 -			*mp = *mend;
   1.134 -			*mend = tmp;
   1.135 -			if (end == pivot)
   1.136 -				pivot = p;
   1.137 -		}
   1.138 -	}
   1.139 -
   1.140 -	left = (start - base) / size;
   1.141 -	right = (base + nelem * size - end) / size;
   1.142 -	if (left > 1)
   1.143 -		__qsort_with_data(base, left, map, ctx);
   1.144 -	if (right > 1)
   1.145 -		__qsort_with_data(end, right, mend, ctx);
   1.146 -}
   1.147 -
   1.148 -uint32_t *
   1.149 -razor_qsort_with_data(void *base, size_t nelem, size_t size,
   1.150 -		      razor_compare_with_data_func_t compare, void *data)
   1.151 -{
   1.152 -	struct qsort_context ctx;
   1.153 -	uint32_t *map;
   1.154 -	int i;
   1.155 -
   1.156 -	if (nelem == 0)
   1.157 -		return NULL;
   1.158 -
   1.159 -	ctx.size = size;
   1.160 -	ctx.compare = compare;
   1.161 -	ctx.data = data;
   1.162 -
   1.163 -	map = malloc(nelem * sizeof (uint32_t));
   1.164 -	for (i = 0; i < nelem; i++)
   1.165 -		map[i] = i;
   1.166 -
   1.167 -	__qsort_with_data(base, nelem, map, &ctx);
   1.168 -
   1.169 -	return map;
   1.170 -}