1f08c3bdfSopenharmony_ci
2f08c3bdfSopenharmony_ci/*
3f08c3bdfSopenharmony_ci * Copyright (c) 2002, Intel Corporation.
4f08c3bdfSopenharmony_ci * Created by:  julie.n.fleischer REMOVE-THIS AT intel DOT com
5f08c3bdfSopenharmony_ci * This file is licensed under the GPL license.  For the full content
6f08c3bdfSopenharmony_ci * of this license, see the COPYING file at the top level of this
7f08c3bdfSopenharmony_ci * source tree.
8f08c3bdfSopenharmony_ci */
9f08c3bdfSopenharmony_ci
10f08c3bdfSopenharmony_ci
11f08c3bdfSopenharmony_ci#include <sys/select.h>
12f08c3bdfSopenharmony_ci
13f08c3bdfSopenharmony_ci
14f08c3bdfSopenharmony_ciint sync_pipe_create(int fd[])
15f08c3bdfSopenharmony_ci{
16f08c3bdfSopenharmony_ci        return pipe (fd);
17f08c3bdfSopenharmony_ci}
18f08c3bdfSopenharmony_ci
19f08c3bdfSopenharmony_ciint sync_pipe_close(int fd[])
20f08c3bdfSopenharmony_ci{
21f08c3bdfSopenharmony_ci        int r = 0;
22f08c3bdfSopenharmony_ci
23f08c3bdfSopenharmony_ci        if (fd[0] != -1)
24f08c3bdfSopenharmony_ci                r = close (fd[0]);
25f08c3bdfSopenharmony_ci        if (fd[1] != -1)
26f08c3bdfSopenharmony_ci                r |= close (fd[1]);
27f08c3bdfSopenharmony_ci        return r;
28f08c3bdfSopenharmony_ci}
29f08c3bdfSopenharmony_ci
30f08c3bdfSopenharmony_ciint sync_pipe_wait(int fd[])
31f08c3bdfSopenharmony_ci{
32f08c3bdfSopenharmony_ci        char buf;
33f08c3bdfSopenharmony_ci        int r;
34f08c3bdfSopenharmony_ci
35f08c3bdfSopenharmony_ci        if (fd[1] != -1) {
36f08c3bdfSopenharmony_ci                close (fd[1]);
37f08c3bdfSopenharmony_ci                fd[1] = -1;
38f08c3bdfSopenharmony_ci        }
39f08c3bdfSopenharmony_ci
40f08c3bdfSopenharmony_ci        r = read (fd[0], &buf, 1);
41f08c3bdfSopenharmony_ci
42f08c3bdfSopenharmony_ci        if ((r != 1) || (buf != 'A'))
43f08c3bdfSopenharmony_ci                return -1;
44f08c3bdfSopenharmony_ci        return 0;
45f08c3bdfSopenharmony_ci}
46f08c3bdfSopenharmony_ci
47f08c3bdfSopenharmony_ciint sync_pipe_wait_select(int fd[], long tv_sec)
48f08c3bdfSopenharmony_ci{
49f08c3bdfSopenharmony_ci        int r;
50f08c3bdfSopenharmony_ci       fd_set rfds;
51f08c3bdfSopenharmony_ci       struct timeval tv;
52f08c3bdfSopenharmony_ci       int err;
53f08c3bdfSopenharmony_ci
54f08c3bdfSopenharmony_ci       tv.tv_sec = tv_sec;
55f08c3bdfSopenharmony_ci       tv.tv_usec = 0;
56f08c3bdfSopenharmony_ci
57f08c3bdfSopenharmony_ci        if (fd[1] != -1) {
58f08c3bdfSopenharmony_ci                close (fd[1]);
59f08c3bdfSopenharmony_ci                fd[1] = -1;
60f08c3bdfSopenharmony_ci        }
61f08c3bdfSopenharmony_ci
62f08c3bdfSopenharmony_ci       FD_ZERO(&rfds);
63f08c3bdfSopenharmony_ci       FD_SET(fd[0], &rfds);
64f08c3bdfSopenharmony_ci
65f08c3bdfSopenharmony_ci       r = select(fd[0] + 1, &rfds, NULL, NULL, &tv);
66f08c3bdfSopenharmony_ci       err = errno;
67f08c3bdfSopenharmony_ci
68f08c3bdfSopenharmony_ci       if (FD_ISSET(fd[0], &rfds)) {
69f08c3bdfSopenharmony_ci               return sync_pipe_wait(fd);
70f08c3bdfSopenharmony_ci       }
71f08c3bdfSopenharmony_ci
72f08c3bdfSopenharmony_ci       return r ? err : -ETIMEDOUT;
73f08c3bdfSopenharmony_ci}
74f08c3bdfSopenharmony_ci
75f08c3bdfSopenharmony_ci
76f08c3bdfSopenharmony_ciint sync_pipe_notify(int fd[])
77f08c3bdfSopenharmony_ci{
78f08c3bdfSopenharmony_ci        char buf = 'A';
79f08c3bdfSopenharmony_ci        int r;
80f08c3bdfSopenharmony_ci
81f08c3bdfSopenharmony_ci        if (fd[0] != -1) {
82f08c3bdfSopenharmony_ci                close (fd[0]);
83f08c3bdfSopenharmony_ci                fd[0] = -1;
84f08c3bdfSopenharmony_ci        }
85f08c3bdfSopenharmony_ci
86f08c3bdfSopenharmony_ci        r = write (fd[1], &buf, 1);
87f08c3bdfSopenharmony_ci
88f08c3bdfSopenharmony_ci        if (r != 1)
89f08c3bdfSopenharmony_ci                return -1;
90f08c3bdfSopenharmony_ci        return 0;
91f08c3bdfSopenharmony_ci}
92