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