/** * literal_comple: compile literal for search. * * @param[in] pattern literal string * * Literal string is treated as is. */ void literal_comple(const char *pattern) { /* * convert spaces into %FF format. */ encode(encoded_pattern, sizeof(encoded_pattern), pattern); /* * construct a goto table. */ cgotofn(pattern); /* * construct fail links. */ cfail(); }
int main(int __unused argc, char __unused *argv[]) { struct shared_info *info; pid_t pid; int fd, i; printf("1..15\n"); /* We better start up with fd's 0, 1, and 2 open. */ fd = devnull(); if (fd != 3) fail("open", "bad descriptor %d", fd); ok("open"); /* Make sure highest_fd() works. */ fd = highest_fd(); if (fd != 3) fail("highest_fd", "bad descriptor %d", fd); ok("highest_fd"); /* Try to use closefrom() for just closing fd 3. */ closefrom(3); fd = highest_fd(); if (fd != 2) fail("closefrom", "highest fd %d", fd); ok("closefrom"); /* Eat up 16 descriptors. */ for (i = 0; i < 16; i++) (void)devnull(); fd = highest_fd(); if (fd != 18) fail("open 16", "highest fd %d", fd); ok("open 16"); /* Close half of them. */ closefrom(11); fd = highest_fd(); if (fd != 10) fail("closefrom", "highest fd %d", fd); ok("closefrom"); /* Explicitly close descriptors 6 and 8 to create holes. */ if (close(6) < 0 || close(8) < 0) fail_err("close2 "); ok("close 2"); /* Verify that close on 6 and 8 fails with EBADF. */ if (close(6) == 0) fail("close(6)", "did not fail"); if (errno != EBADF) fail_err("close(6)"); ok("close(6)"); if (close(8) == 0) fail("close(8)", "did not fail"); if (errno != EBADF) fail_err("close(8)"); ok("close(8)"); /* Close from 4 on. */ closefrom(4); fd = highest_fd(); if (fd != 3) fail("closefrom", "highest fd %d", fd); ok("closefrom"); /* Allocate a small SHM region for IPC with our child. */ info = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0); if (info == MAP_FAILED) fail_err("mmap"); ok("mmap"); /* Fork a child process to test closefrom(0). */ pid = fork(); if (pid < 0) fail_err("fork"); if (pid == 0) { /* Child. */ closefrom(0); fd = highest_fd(); if (fd >= 0) cfail(info, "closefrom(0)", "highest fd %d", fd); c*k(info, "closefrom(0)"); } if (wait(NULL) < 0) fail_err("wait"); if (info->failed) fail(info->tag, "%s", info->message); ok(info->tag); /* Fork a child process to test closefrom(-1). */ pid = fork(); if (pid < 0) fail_err("fork"); if (pid == 0) { /* Child. */ closefrom(-1); fd = highest_fd(); if (fd >= 0) cfail(info, "closefrom(-1)", "highest fd %d", fd); c*k(info, "closefrom(-1)"); } if (wait(NULL) < 0) fail_err("wait"); if (info->failed) fail(info->tag, "%s", info->message); ok(info->tag); /* Dup stdout to 6. */ if (dup2(1, 6) < 0) fail_err("dup2"); fd = highest_fd(); if (fd != 6) fail("dup2", "highest fd %d", fd); ok("dup2"); /* Do a closefrom() starting in a hole. */ closefrom(4); fd = highest_fd(); if (fd != 3) fail("closefrom", "highest fd %d", fd); ok("closefrom"); /* Do a closefrom() beyond our highest open fd. */ closefrom(32); fd = highest_fd(); if (fd != 3) fail("closefrom", "highest fd %d", fd); ok("closefrom"); return (0); }