X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=blobdiff_plain;f=src%2Ftests%2Ffilesys%2Fextended%2Ftar.c;h=9801484da64251b733d19a55800b287e6c74a9bb;hp=6f70d973e0b022be4b6128a0d96d9e687c09fbbc;hb=59f738d500f51ffc5f487344865b8bed69c26281;hpb=0fd3a243b790dd1cfc9e0a40c57dddde56cf344d diff --git a/src/tests/filesys/extended/tar.c b/src/tests/filesys/extended/tar.c index 6f70d97..9801484 100644 --- a/src/tests/filesys/extended/tar.c +++ b/src/tests/filesys/extended/tar.c @@ -2,6 +2,7 @@ Creates a tar archive. */ +#include #include #include #include @@ -39,8 +40,7 @@ static bool archive_ordinary_file (const char *file_name, int file_fd, int archive_fd, bool *write_error); static bool archive_directory (char file_name[], size_t file_name_size, int file_fd, int archive_fd, bool *write_error); -static bool write_header (const char *file_name, - char type_flag, int size, unsigned mode, +static bool write_header (const char *file_name, enum ustar_type, int size, int archive_fd, bool *write_error); static bool do_write (int fd, const char *buffer, int size, bool *write_error); @@ -128,7 +128,8 @@ archive_ordinary_file (const char *file_name, int file_fd, bool success = true; int file_size = filesize (file_fd); - if (!write_header (file_name, '0', file_size, 0644, archive_fd, write_error)) + if (!write_header (file_name, USTAR_REGULAR, file_size, + archive_fd, write_error)) return false; while (file_size > 0) @@ -169,7 +170,7 @@ archive_directory (char file_name[], size_t file_name_size, int file_fd, return false; } - if (!write_header (file_name, '5', 0, 0755, archive_fd, write_error)) + if (!write_header (file_name, USTAR_DIRECTORY, 0, archive_fd, write_error)) return false; file_name[dir_len] = '/'; @@ -182,55 +183,12 @@ archive_directory (char file_name[], size_t file_name_size, int file_fd, } static bool -write_header (const char *file_name, - char type_flag, int size, unsigned mode, +write_header (const char *file_name, enum ustar_type type, int size, int archive_fd, bool *write_error) { static char header[512]; - unsigned chksum; - size_t i; - - memset (header, 0, sizeof header); - - /* Drop confusing and possibly dangerous prefixes from - FILE_NAME. */ - while (*file_name == '/' - || !memcmp (file_name, "./", 2) - || !memcmp (file_name, "../", 3)) - file_name = strchr (file_name, '/') + 1; - if (*file_name == '\0') - { - /* Dropped *everything* from FILE_NAME. - Should only be possible for a directory. */ - ASSERT (type_flag == '5'); - return true; - } - else if (strlen (file_name) > 99) - { - printf ("%s: file name too long\n", file_name); - return false; - } - - /* Fill in header except for final checksum. */ - strlcpy (header, file_name, 100); /* name */ - snprintf (header + 100, 8, "%07o", mode); /* mode */ - strlcpy (header + 108, "0000000", 8); /* uid */ - strlcpy (header + 116, "0000000", 8); /* gid */ - snprintf (header + 124, 12, "%011o", size); /* size */ - snprintf (header + 136, 12, "%011o", 1136102400); /* mtime (2006-01-01) */ - memset (header + 148, ' ', 8); /* chksum */ - header[156] = type_flag; /* typeflag */ - strlcpy (header + 257, "ustar", 6); /* magic */ - strlcpy (header + 263, "00", 3); /* version */ - - /* Compute and fill in final checksum. */ - chksum = 0; - for (i = 0; i < 512; i++) - chksum += (uint8_t) header[i]; - snprintf (header + 148, 8, "%07o", chksum); - - /* Write header. */ - return do_write (archive_fd, header, 512, write_error); + return (ustar_make_header (file_name, type, size, header) + && do_write (archive_fd, header, 512, write_error)); } static bool