/* Making a pair of ConnectedSockets is relatively convoluted, since we have to create them via a BoundSocket/SocketAddress pair. */ void make_socket_pair(int pair[2]) { int bound_pair[2]; int rc; rc = imc_makeboundsock(bound_pair); assert(rc == 0); connect_and_accept(bound_pair[0], bound_pair[1], &pair[0], &pair[1]); checked_close(bound_pair[0]); checked_close(bound_pair[1]); }
void test_imc_connect_with_no_acceptor(void) { int bound_pair[2]; int rc; rc = imc_makeboundsock(bound_pair); assert(rc == 0); printf("Test imc_connect() when BoundSocket has been dropped...\n"); checked_close(bound_pair[0]); rc = imc_connect(bound_pair[1]); assert(rc == -1); assert(errno == EIO); checked_close(bound_pair[1]); }
void test_imc_accept_end_of_stream(void) { int bound_pair[2]; int rc; rc = imc_makeboundsock(bound_pair); assert(rc == 0); printf("Test imc_accept() when SocketAddress has been dropped...\n"); checked_close(bound_pair[1]); rc = imc_accept(bound_pair[0]); assert(rc == -1); assert(errno == EIO); checked_close(bound_pair[0]); }
void test_socket_transfer(void) { int sock_pair[2]; int bound_pair[2]; int rc; int fd1; int fd2; char buf[100]; int received_fds[8]; int received_fd_count; int received_bytes; make_socket_pair(sock_pair); printf("Test data-only messages...\n"); check_send_and_receive_data(sock_pair[0], sock_pair[1]); check_send_and_receive_data(sock_pair[1], sock_pair[0]); rc = imc_makeboundsock(bound_pair); assert(rc == 0); printf("Test sending a BoundSocket (this is rejected)...\n"); rc = send_message(sock_pair[0], test_message, strlen(test_message), &bound_pair[0], 1); assert(rc == -1); assert(errno == EIO); printf("Test sending a ConnectedSocket (this is rejected)...\n"); send_message(sock_pair[0], test_message, strlen(test_message), &sock_pair[0], 1); assert(rc == -1); assert(errno == EIO); printf("Test sending a SocketAddress...\n"); rc = send_message(sock_pair[0], test_message, strlen(test_message), &bound_pair[1], 1); assert(rc == strlen(test_message)); printf("Check that we can receive the SocketAddress we sent...\n"); received_bytes = receive_message(sock_pair[1], buf, sizeof(buf), received_fds, 8, &received_fd_count); assert(received_bytes == strlen(test_message)); assert(memcmp(buf, test_message, strlen(test_message)) == 0); assert(received_fd_count == 1); printf("Check that the received SocketAddress works...\n"); connect_and_accept(bound_pair[0], received_fds[0], &fd1, &fd2); checked_close(received_fds[0]); check_send_and_receive_data(fd1, fd2); check_send_and_receive_data(fd2, fd1); checked_close(fd1); checked_close(fd2); checked_close(sock_pair[0]); checked_close(sock_pair[1]); checked_close(bound_pair[0]); checked_close(bound_pair[1]); }
void test_sending_and_receiving_max_fd_count(void) { int sock_pair[2]; int sent; int received; char data_buf[10]; int fds_send_buf[NACL_ABI_IMC_DESC_MAX + 1]; int fds_receive_buf[NACL_ABI_IMC_DESC_MAX]; int fds_got; int i; printf("Test sending and receiving many FDs...\n"); make_socket_pair(sock_pair); /* Test exactly the maximum. */ for (i = 0; i < NACL_ABI_IMC_DESC_MAX; i++) { fds_send_buf[i] = kKnownInvalidDescNumber; } sent = send_message(sock_pair[0], "", 0, fds_send_buf, NACL_ABI_IMC_DESC_MAX); assert(sent == 0); received = receive_message(sock_pair[1], data_buf, sizeof(data_buf), fds_receive_buf, NACL_ABI_IMC_DESC_MAX, &fds_got); assert(received == 0); assert(fds_got == NACL_ABI_IMC_DESC_MAX); for (i = 0; i < NACL_ABI_IMC_DESC_MAX; i++) { assert(fds_receive_buf[i] == kKnownInvalidDescNumber); } /* Test above the maximum. */ for (i = 0; i < NACL_ABI_IMC_DESC_MAX + 1; i++) { fds_send_buf[i] = kKnownInvalidDescNumber; } sent = send_message(sock_pair[0], "", 0, fds_send_buf, NACL_ABI_IMC_DESC_MAX + 1); assert(sent == -1); assert(errno == EINVAL); checked_close(sock_pair[0]); checked_close(sock_pair[1]); }
void * consume(void *arg_) { struct consume_arg *arg = arg_; struct queue *q = arg->q; struct kmp_table *t = arg->t; char buffer[BUFFER_SIZE]; for (;;) { char *path = dequeue(q); int pos = 0; int file; int bytes_read = 0; struct kmp_result r; if (!path) { return (NULL); } file = checked_open(path, O_RDONLY); if (file == -1) { fprintf_ts(stderr, "Cannot open %s\n", path); free(path); continue; } while ((bytes_read = checked_read(file, buffer, BUFFER_SIZE)) > 0) { int i; for (i = 0; i < bytes_read; i++) { advance(t, &r, buffer[i], pos); pos = r.pos; if (r.match) { fprintf_ts(stdout, "%s\n", path); break; } } if (r.match) { break; } } free(path); checked_close(file); } }
void test_special_invalid_fd(void) { int sock_pair[2]; int sent; int received; int fd_to_send; char data_buf[10]; int fds_buf[NACL_ABI_IMC_DESC_MAX]; int fds_got; printf("Test sending and receiving the special 'invalid' descriptor...\n"); make_socket_pair(sock_pair); fd_to_send = kKnownInvalidDescNumber; sent = send_message(sock_pair[0], "", 0, &fd_to_send, 1); assert(sent == 0); received = receive_message(sock_pair[1], data_buf, sizeof(data_buf), fds_buf, NACL_ABI_IMC_DESC_MAX, &fds_got); assert(received == 0); assert(fds_got == 1); assert(fds_buf[0] == kKnownInvalidDescNumber); /* Other invalid FD numbers are not accepted. */ fd_to_send = 1234; sent = send_message(sock_pair[0], "", 0, &fd_to_send, 1); assert(sent == -1); assert(errno == EBADF); /* We don't accept other negative numbers. */ fd_to_send = -2; sent = send_message(sock_pair[0], "", 0, &fd_to_send, 1); assert(sent == -1); assert(errno == EBADF); checked_close(sock_pair[0]); checked_close(sock_pair[1]); }
int main(int argc, char *argv[]) { int nr = 2; char c; int mapflag = MAP_SHARED; unsigned long memsize = 0; int hugetlbfd1; char *phugetlbfile1; unsigned long address = ADDR_INPUT; char *filename; while ((c = getopt(argc, argv, "h:f:n:v")) != -1) { switch(c) { case 'h': HPS = strtoul(optarg, NULL, 10) * 1024; break; case 'f': filename = optarg; break; case 'n': nr = strtoul(optarg, NULL, 10); break; case 'v': verbose = 1; break; } } if (!filename) { errmsg("need to specify file path with -f\n"); } validate_hugepage_size(HPS); memsize = nr * HPS; signal(SIGUSR1, sig_handle); Dprintf("memsize = 0x%x, hpsize = %d, mapflag = 0x%x\n", memsize, HPS, mapflag); hugetlbfd1 = checked_open(filename, O_CREAT|O_RDWR); phugetlbfile1 = checked_mmap((void *)address, memsize, MMAP_PROT, mapflag, hugetlbfd1, 0); Dprintf("p %p\n", phugetlbfile1); memset(phugetlbfile1, 'a', memsize); munmap(phugetlbfile1, memsize); checked_close(hugetlbfd1); pprintf("%s exit\n", argv[0]); exit(EXIT_SUCCESS); }