staticint absolutize(char *to, int size, char *from)
{ char save_cwd[256], *slash; int remaining;
if (getcwd(save_cwd, sizeof(save_cwd)) == NULL) {
cow_printf("absolutize : unable to get cwd - errno = %d\n",
errno); return -1;
}
slash = strrchr(from, '/'); if (slash != NULL) {
*slash = '\0'; if (chdir(from)) {
*slash = '/';
cow_printf("absolutize : Can't cd to '%s' - " "errno = %d\n", from, errno); return -1;
}
*slash = '/'; if (getcwd(to, size) == NULL) {
cow_printf("absolutize : unable to get cwd of '%s' - " "errno = %d\n", from, errno); return -1;
}
remaining = size - strlen(to); if (strlen(slash) + 1 > remaining) {
cow_printf("absolutize : unable to fit '%s' into %d " "chars\n", from, size); return -1;
}
strcat(to, slash);
} else { if (strlen(save_cwd) + 1 + strlen(from) + 1 > size) {
cow_printf("absolutize : unable to fit '%s' into %d " "chars\n", from, size); return -1;
}
strcpy(to, save_cwd);
strcat(to, "/");
strcat(to, from);
} if (chdir(save_cwd)) {
cow_printf("absolutize : Can't cd to '%s' - " "errno = %d\n", save_cwd, errno); return -1;
} return0;
}
int write_cow_header(char *cow_file, int fd, char *backing_file, int sectorsize, int alignment, unsignedlonglong *size)
{ struct cow_header_v3 *header; longlong modtime; int err;
err = -EINVAL; if (strlen(backing_file) > sizeof(header->backing_file) - 1) { /* Below, %zd is for a size_t value */
cow_printf("Backing file name \"%s\" is too long - names are " "limited to %zd characters\n", backing_file, sizeof(header->backing_file) - 1); goto out_free;
}
if (absolutize(header->backing_file, sizeof(header->backing_file),
backing_file)) goto out_free;
err = cow_write_file(fd, header, sizeof(*header)); if (err != sizeof(*header)) {
cow_printf("write_cow_header - write of header to " "new COW file '%s' failed, err = %d\n", cow_file,
-err); goto out_free;
}
err = 0;
out_free:
cow_free(header);
out: return err;
}
int file_reader(__u64 offset, char *buf, int len, void *arg)
{ int fd = *((int *) arg);
return pread(fd, buf, len, offset);
}
/* XXX Need to sanity-check the values read from the header */
int read_cow_header(int (*reader)(__u64, char *, int, void *), void *arg,
__u32 *version_out, char **backing_file_out, longlong *mtime_out, unsignedlonglong *size_out, int *sectorsize_out, __u32 *align_out, int *bitmap_offset_out)
{ union cow_header *header; char *file; int err, n; unsignedlong version, magic;
header = cow_malloc(sizeof(*header)); if (header == NULL) {
cow_printf("read_cow_header - Failed to allocate header\n"); return -ENOMEM;
}
err = -EINVAL;
n = (*reader)(0, (char *) header, sizeof(*header), arg); if (n < offsetof(typeof(header->v1), backing_file)) {
cow_printf("read_cow_header - short header\n"); goto out;
}
magic = header->v1.magic; if (magic == COW_MAGIC)
version = header->v1.version; elseif (magic == be32toh(COW_MAGIC))
version = be32toh(header->v1.version); /* No error printed because the non-COW case comes through here */ elsegoto out;
int init_cow_file(int fd, char *cow_file, char *backing_file, int sectorsize, int alignment, int *bitmap_offset_out, unsignedlong *bitmap_len_out, int *data_offset_out)
{ unsignedlonglong size, offset; char zero = 0; int err;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.