int main() { char f_name0[] = "/tmp/sigbus.XXXXXX"; char f_name1[] = "/tmp/sigbus.XXXXXX"; int fd_src = mkstemp(f_name0); int fd_dst = mkstemp(f_name1); char buf[TEST_BLOCKSIZE]; struct stat st; bool res; memset(buf, 0, TEST_BLOCKSIZE); write(fd_src, buf, TEST_BLOCKSIZE); close(fd_src); close(fd_dst); unlink(f_name1); stat(f_name0, &st); if (!copyReg(f_name0, &st, f_name1)) return EXIT_FAILURE; is_gremlin = true; Esocketpair(AF_LOCAL, SOCK_STREAM, 0, sync_p); signal(SIGCHLD, SIG_IGN); res = (checkTrunc(f_name0, f_name1, &st, TEST_BLOCKSIZE/2) && checkTrunc(f_name0, f_name1, &st, 0x2345)); unlink(f_name0); unlink(f_name1); return res ? EXIT_SUCCESS : EXIT_FAILURE; }
void read(Register to) { yyparse(); yyrestart(stdin); copyReg(to, regSimple); }
void sequenceToExp(Register result, Register seq) { if (isNull(seq)) copyReg(result, seq); else { isLastExp(result, seq); if (isTrue(result)) firstExp(result, seq); else makeBegin(result, seq); } }
static bool checkTrunc(char const *src, char const *dst, struct stat const *st, size_t pos) { pid_t pid = Efork(); if (pid==0) { char c; Erecv(sync_p[0], &c, 1, 0); Etruncate(src, pos); Esend(sync_p[0], &c, 1, 0); exit(0); } unlink(dst); return !copyReg(src, st, dst); }
bool Unify_copy(char const *src, struct stat const *src_stat, char const *dst) { // skip sockets // TODO: message if (S_ISSOCK(src_stat->st_mode)) return true; return (((S_ISLNK (src_stat->st_mode) && copyLnk (src, dst)) || (S_ISREG (src_stat->st_mode) && copyReg (src, src_stat, dst)) || (S_ISDIR (src_stat->st_mode) && copyDir (src, src_stat, dst)) || ((S_ISBLK (src_stat->st_mode) || S_ISCHR (src_stat->st_mode) || S_ISFIFO(src_stat->st_mode)) && copyNode(src, src_stat, dst)) ) && setModes(dst, src_stat) && Unify_setTime(dst, src_stat)); }