# HG changeset patch # User Dan Winship # Date 1205411345 14400 # Node ID 1efd1945b81aa345c4c6f94537b12a06ecbd9ca4 # Parent ac1387f6aba4fcd077a8453899da03677512cca6# Parent 1f7ea90fb2c118a1d3aa8b9147664e9fe23fe11e Merge branch 'master' of git://people.freedesktop.org/~krh/razor diff -r ac1387f6aba4 -r 1efd1945b81a Makefile --- a/Makefile Wed Mar 12 16:41:34 2008 -0400 +++ b/Makefile Thu Mar 13 08:29:05 2008 -0400 @@ -13,5 +13,9 @@ test : test-driver ./test-driver test.xml +reset : ./razor + rm -rf install + ./razor init + clean : rm -f *.o razor diff -r ac1387f6aba4 -r 1efd1945b81a main.c --- a/main.c Wed Mar 12 16:41:34 2008 -0400 +++ b/main.c Thu Mar 13 08:29:05 2008 -0400 @@ -494,7 +494,7 @@ pi = razor_package_iterator_create(set); i = 0; while (razor_package_iterator_next(pi, &package, &name, &version)) - packages[i] = strdup(name); + packages[i++] = strdup(name); razor_package_iterator_destroy(pi); return packages; diff -r ac1387f6aba4 -r 1efd1945b81a rpm.c --- a/rpm.c Wed Mar 12 16:41:34 2008 -0400 +++ b/rpm.c Thu Mar 13 08:29:05 2008 -0400 @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -265,16 +266,20 @@ const char *path, const char *name, unsigned int mode) { char buffer[PATH_MAX]; - int fd; + struct stat buf; + int fd, ret; if (razor_create_dir(installer->root, path) < 0) return -1; - snprintf(buffer, sizeof buffer, "%s%s/%s", + /* assertion: root doesn't end in a slash, path begins and end + * with a slash, name does not begin with a slash. */ + snprintf(buffer, sizeof buffer, "%s%s%s", installer->root, path, name); switch (mode >> 12) { case REG: + /* FIXME: handle the case where a file is already there. */ fd = open(buffer, O_WRONLY | O_CREAT | O_TRUNC, mode & 0x1ff); if (fd < 0){ fprintf(stderr, "failed to create file %s\n", buffer); @@ -297,7 +302,16 @@ } return 0; case XDIR: - return mkdir(buffer, mode & 0x1ff); + ret = mkdir(buffer, mode & 0x1ff); + if (ret == 0 || errno != EEXIST) + return ret; + if (stat(buffer, &buf) || !S_ISDIR(buf.st_mode)) { + /* FIXME: also check that mode match. */ + fprintf(stderr, + "%s exists but is not a directory\n", buffer); + return -1; + } + return 0; case PIPE: case CDEV: case BDEV: