Path: blob/main/contrib/libarchive/cpio/test/test_option_c.c
39507 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2003-2007 Tim Kientzle4* All rights reserved.5*/6#include "test.h"78static int9is_octal(const char *p, size_t l)10{11while (l > 0) {12if (*p < '0' || *p > '7')13return (0);14--l;15++p;16}17return (1);18}1920static unsigned long long int21from_octal(const char *p, size_t l)22{23long long int r = 0;2425while (l > 0) {26r *= 8;27r += *p - '0';28--l;29++p;30}31return (r);32}3334#if !defined(_WIN32) || defined(__CYGWIN__)35static int36nlinks(const char *p)37{38struct stat st;39assertEqualInt(0, stat(p, &st));40return st.st_nlink;41}42#endif4344DEFINE_TEST(test_option_c)45{46FILE *filelist;47int r;48int uid = 1000;49int dev, ino, gid = 1000;50time_t t, now;51char *p, *e;52size_t s;5354assertUmask(0);5556/*57* Create an assortment of files.58* TODO: Extend this to cover more filetypes.59*/60filelist = fopen("filelist", "w");6162/* "file" */63assertMakeFile("file", 0644, "1234567890");64fprintf(filelist, "file\n");6566/* "symlink" */67if (canSymlink()) {68assertMakeSymlink("symlink", "file", 0);69fprintf(filelist, "symlink\n");70}7172/* "dir" */73assertMakeDir("dir", 0775);74/* Record some facts about what we just created: */75now = time(NULL); /* They were all created w/in last two seconds. */76fprintf(filelist, "dir\n");7778/* Use the cpio program to create an archive. */79fclose(filelist);80r = systemf("%s -R 1000:1000 -oc <filelist >basic.out 2>basic.err", testprog);81/* Verify that nothing went to stderr. */82assertTextFileContents("1 block\n", "basic.err");8384/* Assert that the program finished. */85failure("%s -oc crashed", testprog);86if (!assertEqualInt(r, 0))87return;8889/* Verify that stdout is a well-formed cpio file in "odc" format. */90p = slurpfile(&s, "basic.out");91assertEqualInt(s, 512);92e = p;9394/*95* Some of these assertions could be stronger, but it's96* a little tricky because they depend on the local environment.97*/9899/* First entry is "file" */100assert(is_octal(e, 76)); /* Entire header is octal digits. */101assertEqualMem(e + 0, "070707", 6); /* Magic */102assert(is_octal(e + 6, 6)); /* dev */103dev = (int)from_octal(e + 6, 6);104assert(is_octal(e + 12, 6)); /* ino */105ino = (int)from_octal(e + 12, 6);106#if defined(_WIN32) && !defined(__CYGWIN__)107/* Group members bits and others bits do not work. */108assertEqualMem(e + 18, "100666", 6); /* Mode */109#else110assertEqualMem(e + 18, "100644", 6); /* Mode */111#endif112if (uid < 0)113uid = (int)from_octal(e + 24, 6);114assertEqualInt(from_octal(e + 24, 6), uid); /* uid */115assert(is_octal(e + 30, 6)); /* gid */116gid = (int)from_octal(e + 30, 6);117assertEqualMem(e + 36, "000001", 6); /* nlink */118failure("file entries should not have rdev set (dev field was 0%o)",119(unsigned int)dev);120assertEqualMem(e + 42, "000000", 6); /* rdev */121t = from_octal(e + 48, 11); /* mtime */122assert(t <= now); /* File wasn't created in future. */123assert(t >= now - 2); /* File was created w/in last 2 secs. */124assertEqualMem(e + 59, "000005", 6); /* Name size */125assertEqualMem(e + 65, "00000000012", 11); /* File size */126assertEqualMem(e + 76, "file\0", 5); /* Name contents */127assertEqualMem(e + 81, "1234567890", 10); /* File contents */128e += 91;129130/* "symlink" pointing to "file" */131if (canSymlink()) {132assert(is_octal(e, 76)); /* Entire header is octal digits. */133assertEqualMem(e + 0, "070707", 6); /* Magic */134assertEqualInt(dev, from_octal(e + 6, 6)); /* dev */135assert(ino != (int)from_octal(e + 12, 6)); /* ino */136#if !defined(_WIN32) || defined(__CYGWIN__)137/* On Windows, symbolic link and group members bits and138* others bits do not work. */139assertEqualMem(e + 18, "120777", 6); /* Mode */140#endif141assertEqualInt(from_octal(e + 24, 6), uid); /* uid */142assertEqualInt(gid, from_octal(e + 30, 6)); /* gid */143assertEqualMem(e + 36, "000001", 6); /* nlink */144failure("file entries should have rdev == 0 (dev was 0%llo)",145from_octal(e + 6, 6));146assertEqualMem(e + 42, "000000", 6); /* rdev */147t = from_octal(e + 48, 11); /* mtime */148assert(t <= now); /* File wasn't created in future. */149assert(t >= now - 2); /* File was created w/in last 2 secs. */150assertEqualMem(e + 59, "000010", 6); /* Name size */151assertEqualMem(e + 65, "00000000004", 11); /* File size */152assertEqualMem(e + 76, "symlink\0", 8); /* Name contents */153assertEqualMem(e + 84, "file", 4); /* Symlink target. */154e += 88;155}156157/* "dir" */158assert(is_octal(e, 76));159assertEqualMem(e + 0, "070707", 6); /* Magic */160/* Dev should be same as first entry. */161assert(is_octal(e + 6, 6)); /* dev */162assertEqualInt(dev, from_octal(e + 6, 6));163/* Ino must be different from first entry. */164assert(is_octal(e + 12, 6)); /* ino */165assert(ino != (int)from_octal(e + 12, 6));166#if defined(_WIN32) && !defined(__CYGWIN__)167/* Group members bits and others bits do not work. */168assertEqualMem(e + 18, "040777", 6); /* Mode */169#else170/* Accept 042775 to accommodate systems where sgid bit propagates. */171if (memcmp(e + 18, "042775", 6) != 0)172assertEqualMem(e + 18, "040775", 6); /* Mode */173#endif174assertEqualInt(uid, from_octal(e + 24, 6)); /* uid */175/* Gid should be same as first entry. */176assert(is_octal(e + 30, 6)); /* gid */177assertEqualInt(gid, from_octal(e + 30, 6));178179#if !defined(_WIN32) || defined(__CYGWIN__)180assertEqualInt(nlinks("dir"), from_octal(e + 36, 6)); /* Nlink */181#endif182183t = from_octal(e + 48, 11); /* mtime */184assert(t <= now); /* File wasn't created in future. */185assert(t >= now - 2); /* File was created w/in last 2 secs. */186assertEqualMem(e + 59, "000004", 6); /* Name size */187assertEqualMem(e + 65, "00000000000", 11); /* File size */188assertEqualMem(e + 76, "dir\0", 4); /* name */189e += 80;190191/* TODO: Verify other types of entries. */192193/* Last entry is end-of-archive marker. */194assert(is_octal(e, 76));195assertEqualMem(e + 0, "070707", 6); /* Magic */196assertEqualMem(e + 6, "000000", 6); /* dev */197assertEqualMem(e + 12, "000000", 6); /* ino */198assertEqualMem(e + 18, "000000", 6); /* Mode */199assertEqualMem(e + 24, "000000", 6); /* uid */200assertEqualMem(e + 30, "000000", 6); /* gid */201assertEqualMem(e + 36, "000001", 6); /* Nlink */202assertEqualMem(e + 42, "000000", 6); /* rdev */203assertEqualMem(e + 48, "00000000000", 11); /* mtime */204assertEqualMem(e + 59, "000013", 6); /* Name size */205assertEqualMem(e + 65, "00000000000", 11); /* File size */206assertEqualMem(e + 76, "TRAILER!!!\0", 11); /* Name */207208free(p);209}210211212