/* * Copyright (c) 2002, Intel Corporation. * Created by: julie.n.fleischer REMOVE-THIS AT intel DOT com * This file is licensed under the GPL license. For the full content * of this license, see the COPYING file at the top level of this * source tree. */ #include <sys/select.h> int sync_pipe_create(int fd[]) { return pipe (fd); } int sync_pipe_close(int fd[]) { int r = 0; if (fd[0] != -1) r = close (fd[0]); if (fd[1] != -1) r |= close (fd[1]); return r; } int sync_pipe_wait(int fd[]) { char buf; int r; if (fd[1] != -1) { close (fd[1]); fd[1] = -1; } r = read (fd[0], &buf, 1); if ((r != 1) || (buf != 'A')) return -1; return 0; } int sync_pipe_wait_select(int fd[], long tv_sec) { int r; fd_set rfds; struct timeval tv; int err; tv.tv_sec = tv_sec; tv.tv_usec = 0; if (fd[1] != -1) { close (fd[1]); fd[1] = -1; } FD_ZERO(&rfds); FD_SET(fd[0], &rfds); r = select(fd[0] + 1, &rfds, NULL, NULL, &tv); err = errno; if (FD_ISSET(fd[0], &rfds)) { return sync_pipe_wait(fd); } return r ? err : -ETIMEDOUT; } int sync_pipe_notify(int fd[]) { char buf = 'A'; int r; if (fd[0] != -1) { close (fd[0]); fd[0] = -1; } r = write (fd[1], &buf, 1); if (r != 1) return -1; return 0; }