efl
1/* EVIL - EFL library for Windows port
2* Copyright (C) 2017 Vincent Torri
3*
4* This library is free software; you can redistribute it and/or
5* modify it under the terms of the GNU Lesser General Public
6* License as published by the Free Software Foundation; either
7* version 2.1 of the License, or (at your option) any later version.
8*
9* This library is distributed in the hope that it will be useful,
10* but WITHOUT ANY WARRANTY; without even the implied warranty of
11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12* Lesser General Public License for more details.
13*
14* You should have received a copy of the GNU Lesser General Public
15* License along with this library;
16* if not, see <http://www.gnu.org/licenses/>.
17*/
18
19#ifdef HAVE_CONFIG_H20# include "config.h"21#endif22
23#include <stdlib.h>24#include <stdio.h>25
26# define WIN32_LEAN_AND_MEAN27# include <winsock2.h>28# undef WIN32_LEAN_AND_MEAN29
30#include <evil_private.h>31
32#include "evil_suite.h"33
34
35#define FDREAD 036#define FDWRITE 137
38typedef struct39{
40int val;41int fd_write;42} data;43
44
45static DWORD WINAPI46thread(void *param)47{
48data *d;49void *buf[1];50
51Sleep (2 * 1000);52d = (data *)param;53buf[0] = param;54send(d->fd_write, (char *)buf, sizeof(buf), 0);55
56return 0;57}
58
59EFL_START_TEST(evil_unistd_pipe)60{
61int sockets[2];62struct timeval t;63fd_set rfds;64int ret;65data *d;66DWORD thread_id;67HANDLE h;68
69FD_ZERO(&rfds);70t.tv_sec = 5;71t.tv_usec = 0;72
73ret = pipe(sockets);74fail_if(ret < 0);75
76FD_SET(sockets[FDREAD], &rfds);77fcntl(sockets[FDREAD], F_SETFL, O_NONBLOCK);78
79d = (data *)malloc(sizeof (data));80fail_if(d == NULL);81
82d->val = 14;83d->fd_write = sockets[FDWRITE];84
85h = CreateThread(NULL, 0, thread, d, 0, &thread_id);86fail_if(h == NULL);87
88ret = select(sockets[FDREAD] + 1, &rfds, NULL, NULL, &t);89fail_if(ret <= 0);90
91{92void *buf[1];93data *d2 = NULL;94int len;95
96while ((len = recv(sockets[FDREAD], (char *)buf, sizeof(buf), 0)) > 0)97{98if (len == sizeof(buf))99{100d2 = (data *)buf[0];101break;102}103}104fail_if(!d2 || (d2->val != d->val));105}106
107CloseHandle(h);108free(d);109}
110EFL_END_TEST
111
112void evil_test_unistd(TCase *tc)113{
114tcase_add_test(tc, evil_unistd_pipe);115}
116