#include "test.h"
__FBSDID("$FreeBSD$");
static int
is_octal(const char *p, size_t l)
{
while (l > 0) {
if (*p < '0' || *p > '7')
return (0);
--l;
++p;
}
return (1);
}
static int
from_octal(const char *p, size_t l)
{
int r = 0;
while (l > 0) {
r *= 8;
r += *p - '0';
--l;
++p;
}
return (r);
}
DEFINE_TEST(test_option_c)
{
int fd, filelist;
int r;
int dev, ino, gid;
time_t t, now;
char *p, *e;
size_t s;
mode_t oldmask;
oldmask = umask(0);
filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
fd = open("file", O_CREAT | O_WRONLY, 0644);
assert(fd >= 0);
assertEqualInt(10, write(fd, "123456789", 10));
close(fd);
assertEqualInt(5, write(filelist, "file\n", 5));
assertEqualInt(0, symlink("file", "symlink"));
assertEqualInt(8, write(filelist, "symlink\n", 8));
assertEqualInt(0, mkdir("dir", 0775));
now = time(NULL);
assertEqualInt(4, write(filelist, "dir\n", 4));
close(filelist);
r = systemf("%s -oc <filelist >basic.out 2>basic.err", testprog);
assertFileContents("1 block\n", 8, "basic.err");
failure("%s -oc crashed", testprog);
if (!assertEqualInt(r, 0))
return;
p = slurpfile(&s, "basic.out");
assertEqualInt(s, 512);
e = p;
assert(is_octal(e, 76));
assertEqualMem(e + 0, "070707", 6);
assert(is_octal(e + 6, 6));
dev = from_octal(e + 6, 6);
assert(is_octal(e + 12, 6));
ino = from_octal(e + 12, 6);
assertEqualMem(e + 18, "100644", 6);
assertEqualInt(from_octal(e + 24, 6), getuid());
assert(is_octal(e + 30, 6));
gid = from_octal(e + 30, 6);
assertEqualMem(e + 36, "000001", 6);
failure("file entries should not have rdev set (dev field was 0%o)",
dev);
assertEqualMem(e + 42, "000000", 6);
t = from_octal(e + 48, 11);
assert(t <= now);
assert(t >= now - 2);
assertEqualMem(e + 59, "000005", 6);
assertEqualMem(e + 65, "00000000012", 11);
assertEqualMem(e + 76, "file\0", 5);
assertEqualMem(e + 81, "123456789\0", 10);
e += 91;
assert(is_octal(e, 76));
assertEqualMem(e + 0, "070707", 6);
assertEqualInt(dev, from_octal(e + 6, 6));
assert(dev != from_octal(e + 12, 6));
assertEqualMem(e + 18, "120777", 6);
assertEqualInt(from_octal(e + 24, 6), getuid());
assertEqualInt(gid, from_octal(e + 30, 6));
assertEqualMem(e + 36, "000001", 6);
failure("file entries should have rdev == 0 (dev was 0%o)",
from_octal(e + 6, 6));
assertEqualMem(e + 42, "000000", 6);
t = from_octal(e + 48, 11);
assert(t <= now);
assert(t >= now - 2);
assertEqualMem(e + 59, "000010", 6);
assertEqualMem(e + 65, "00000000004", 11);
assertEqualMem(e + 76, "symlink\0", 8);
assertEqualMem(e + 84, "file", 4);
e += 88;
assert(is_octal(e, 76));
assertEqualMem(e + 0, "070707", 6);
assert(is_octal(e + 6, 6));
assertEqualInt(dev, from_octal(e + 6, 6));
assert(is_octal(e + 12, 6));
assert(dev != from_octal(e + 12, 6));
assertEqualMem(e + 18, "040775", 6);
assertEqualInt(from_octal(e + 24, 6), getuid());
assert(is_octal(e + 30, 6));
assertEqualInt(gid, from_octal(e + 30, 6));
assertEqualMem(e + 36, "000002", 6);
t = from_octal(e + 48, 11);
assert(t <= now);
assert(t >= now - 2);
assertEqualMem(e + 59, "000004", 6);
assertEqualMem(e + 65, "00000000000", 11);
assertEqualMem(e + 76, "dir\0", 4);
e += 80;
assert(is_octal(e, 76));
assertEqualMem(e + 0, "070707", 6);
assertEqualMem(e + 6, "000000", 6);
assertEqualMem(e + 12, "000000", 6);
assertEqualMem(e + 18, "000000", 6);
assertEqualMem(e + 24, "000000", 6);
assertEqualMem(e + 30, "000000", 6);
assertEqualMem(e + 36, "000001", 6);
assertEqualMem(e + 42, "000000", 6);
assertEqualMem(e + 48, "00000000000", 11);
assertEqualMem(e + 59, "000013", 6);
assertEqualMem(e + 65, "00000000000", 11);
assertEqualMem(e + 76, "TRAILER!!!\0", 11);
free(p);
umask(oldmask);
}