1*cdebaff8SEnji Cooper /* $NetBSD: msg.h,v 1.1 2016/12/05 20:10:10 christos Exp $ */ 2*cdebaff8SEnji Cooper 3*cdebaff8SEnji Cooper /*- 4*cdebaff8SEnji Cooper * Copyright (c) 2016 The NetBSD Foundation, Inc. 5*cdebaff8SEnji Cooper * All rights reserved. 6*cdebaff8SEnji Cooper * 7*cdebaff8SEnji Cooper * This code is derived from software contributed to The NetBSD Foundation 8*cdebaff8SEnji Cooper * by Christos Zoulas. 9*cdebaff8SEnji Cooper * 10*cdebaff8SEnji Cooper * Redistribution and use in source and binary forms, with or without 11*cdebaff8SEnji Cooper * modification, are permitted provided that the following conditions 12*cdebaff8SEnji Cooper * are met: 13*cdebaff8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 14*cdebaff8SEnji Cooper * notice, this list of conditions and the following disclaimer. 15*cdebaff8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 16*cdebaff8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 17*cdebaff8SEnji Cooper * documentation and/or other materials provided with the distribution. 18*cdebaff8SEnji Cooper * 19*cdebaff8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20*cdebaff8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21*cdebaff8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22*cdebaff8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23*cdebaff8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*cdebaff8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*cdebaff8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*cdebaff8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*cdebaff8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*cdebaff8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*cdebaff8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 30*cdebaff8SEnji Cooper */ 31*cdebaff8SEnji Cooper 32*cdebaff8SEnji Cooper struct msg_fds { 33*cdebaff8SEnji Cooper int pfd[2]; 34*cdebaff8SEnji Cooper int cfd[2]; 35*cdebaff8SEnji Cooper }; 36*cdebaff8SEnji Cooper 37*cdebaff8SEnji Cooper #define CLOSEFD(fd) do { \ 38*cdebaff8SEnji Cooper if (fd != -1) { \ 39*cdebaff8SEnji Cooper close(fd); \ 40*cdebaff8SEnji Cooper fd = -1; \ 41*cdebaff8SEnji Cooper } \ 42*cdebaff8SEnji Cooper } while (/*CONSTCOND*/ 0) 43*cdebaff8SEnji Cooper 44*cdebaff8SEnji Cooper static int 45*cdebaff8SEnji Cooper msg_open(struct msg_fds *fds) 46*cdebaff8SEnji Cooper { 47*cdebaff8SEnji Cooper if (pipe(fds->pfd) == -1) 48*cdebaff8SEnji Cooper return -1; 49*cdebaff8SEnji Cooper if (pipe(fds->cfd) == -1) { 50*cdebaff8SEnji Cooper close(fds->pfd[0]); 51*cdebaff8SEnji Cooper close(fds->pfd[1]); 52*cdebaff8SEnji Cooper return -1; 53*cdebaff8SEnji Cooper } 54*cdebaff8SEnji Cooper return 0; 55*cdebaff8SEnji Cooper } 56*cdebaff8SEnji Cooper 57*cdebaff8SEnji Cooper static void 58*cdebaff8SEnji Cooper msg_close(struct msg_fds *fds) 59*cdebaff8SEnji Cooper { 60*cdebaff8SEnji Cooper CLOSEFD(fds->pfd[0]); 61*cdebaff8SEnji Cooper CLOSEFD(fds->pfd[1]); 62*cdebaff8SEnji Cooper CLOSEFD(fds->cfd[0]); 63*cdebaff8SEnji Cooper CLOSEFD(fds->cfd[1]); 64*cdebaff8SEnji Cooper } 65*cdebaff8SEnji Cooper 66*cdebaff8SEnji Cooper static int 67*cdebaff8SEnji Cooper msg_write_child(const char *info, struct msg_fds *fds, void *msg, size_t len) 68*cdebaff8SEnji Cooper { 69*cdebaff8SEnji Cooper ssize_t rv; 70*cdebaff8SEnji Cooper CLOSEFD(fds->cfd[1]); 71*cdebaff8SEnji Cooper CLOSEFD(fds->pfd[0]); 72*cdebaff8SEnji Cooper 73*cdebaff8SEnji Cooper printf("Send %s\n", info); 74*cdebaff8SEnji Cooper rv = write(fds->pfd[1], msg, len); 75*cdebaff8SEnji Cooper if (rv != (ssize_t)len) 76*cdebaff8SEnji Cooper return 1; 77*cdebaff8SEnji Cooper // printf("Wait %s\n", info); 78*cdebaff8SEnji Cooper rv = read(fds->cfd[0], msg, len); 79*cdebaff8SEnji Cooper if (rv != (ssize_t)len) 80*cdebaff8SEnji Cooper return 1; 81*cdebaff8SEnji Cooper return 0; 82*cdebaff8SEnji Cooper } 83*cdebaff8SEnji Cooper 84*cdebaff8SEnji Cooper static int 85*cdebaff8SEnji Cooper msg_write_parent(const char *info, struct msg_fds *fds, void *msg, size_t len) 86*cdebaff8SEnji Cooper { 87*cdebaff8SEnji Cooper ssize_t rv; 88*cdebaff8SEnji Cooper CLOSEFD(fds->pfd[1]); 89*cdebaff8SEnji Cooper CLOSEFD(fds->cfd[0]); 90*cdebaff8SEnji Cooper 91*cdebaff8SEnji Cooper printf("Send %s\n", info); 92*cdebaff8SEnji Cooper rv = write(fds->cfd[1], msg, len); 93*cdebaff8SEnji Cooper if (rv != (ssize_t)len) 94*cdebaff8SEnji Cooper return 1; 95*cdebaff8SEnji Cooper // printf("Wait %s\n", info); 96*cdebaff8SEnji Cooper rv = read(fds->pfd[0], msg, len); 97*cdebaff8SEnji Cooper if (rv != (ssize_t)len) 98*cdebaff8SEnji Cooper return 1; 99*cdebaff8SEnji Cooper return 0; 100*cdebaff8SEnji Cooper } 101*cdebaff8SEnji Cooper 102*cdebaff8SEnji Cooper static int 103*cdebaff8SEnji Cooper msg_read_parent(const char *info, struct msg_fds *fds, void *msg, size_t len) 104*cdebaff8SEnji Cooper { 105*cdebaff8SEnji Cooper ssize_t rv; 106*cdebaff8SEnji Cooper CLOSEFD(fds->pfd[1]); 107*cdebaff8SEnji Cooper CLOSEFD(fds->cfd[0]); 108*cdebaff8SEnji Cooper 109*cdebaff8SEnji Cooper printf("Wait %s\n", info); 110*cdebaff8SEnji Cooper rv = read(fds->pfd[0], msg, len); 111*cdebaff8SEnji Cooper if (rv != (ssize_t)len) 112*cdebaff8SEnji Cooper return 1; 113*cdebaff8SEnji Cooper // printf("Send %s\n", info); 114*cdebaff8SEnji Cooper rv = write(fds->cfd[1], msg, len); 115*cdebaff8SEnji Cooper if (rv != (ssize_t)len) 116*cdebaff8SEnji Cooper return 1; 117*cdebaff8SEnji Cooper return 0; 118*cdebaff8SEnji Cooper } 119*cdebaff8SEnji Cooper 120*cdebaff8SEnji Cooper static int 121*cdebaff8SEnji Cooper msg_read_child(const char *info, struct msg_fds *fds, void *msg, size_t len) 122*cdebaff8SEnji Cooper { 123*cdebaff8SEnji Cooper ssize_t rv; 124*cdebaff8SEnji Cooper CLOSEFD(fds->cfd[1]); 125*cdebaff8SEnji Cooper CLOSEFD(fds->pfd[0]); 126*cdebaff8SEnji Cooper 127*cdebaff8SEnji Cooper printf("Wait %s\n", info); 128*cdebaff8SEnji Cooper rv = read(fds->cfd[0], msg, len); 129*cdebaff8SEnji Cooper if (rv != (ssize_t)len) 130*cdebaff8SEnji Cooper return 1; 131*cdebaff8SEnji Cooper // printf("Send %s\n", info); 132*cdebaff8SEnji Cooper rv = write(fds->pfd[1], msg, len); 133*cdebaff8SEnji Cooper if (rv != (ssize_t)len) 134*cdebaff8SEnji Cooper return 1; 135*cdebaff8SEnji Cooper return 0; 136*cdebaff8SEnji Cooper } 137