krh@91: #include krh@91: #include krh@91: #include krh@91: #include krh@91: #include krh@91: #include krh@91: danw@136: #include "razor-internal.h" danw@136: krh@91: int krh@91: razor_create_dir(const char *root, const char *path) krh@91: { krh@91: char buffer[PATH_MAX], *p; krh@91: const char *slash, *next; krh@91: struct stat buf; krh@91: krh@91: /* Create all sub-directories in dir and then create name. We krh@91: * know root exists and is a dir, root does not end in a '/', krh@91: * and path has a leading '/'. */ krh@91: krh@91: strcpy(buffer, root); krh@91: p = buffer + strlen(buffer); krh@91: slash = path; krh@91: for (slash = path; slash[1] != '\0'; slash = next) { krh@91: next = strchr(slash + 1, '/'); krh@91: memcpy(p, slash, next - slash); krh@91: p += next - slash; krh@91: *p = '\0'; krh@91: krh@91: if (stat(buffer, &buf) == 0) { krh@91: if (!S_ISDIR(buf.st_mode)) { krh@91: fprintf(stderr, krh@91: "%s exists but is not a directory\n", krh@91: buffer); krh@91: return -1; krh@91: } krh@91: } else if (mkdir(buffer, 0777) < 0) { krh@91: fprintf(stderr, "failed to make directory %s: %m\n", krh@91: buffer); krh@91: return -1; krh@91: } krh@91: krh@91: /* FIXME: What to do about permissions for dirs we krh@91: * have to create but are not in the cpio archive? */ krh@91: } krh@91: krh@91: return 0; krh@91: } krh@91: krh@91: int krh@91: razor_write(int fd, const void *data, size_t size) krh@91: { krh@91: size_t rest; krh@91: ssize_t written; krh@91: const unsigned char *p; krh@91: krh@91: rest = size; krh@91: p = data; krh@91: while (rest > 0) { krh@91: written = write(fd, p, rest); krh@91: if (written < 0) { krh@91: fprintf(stderr, "write error: %m\n"); krh@91: return -1; krh@91: } krh@91: rest -= written; krh@91: p += written; krh@91: } krh@91: krh@91: return 0; krh@91: }