182657471SMarkus Pfeiffer /* 282657471SMarkus Pfeiffer * Copyright (c) 2013 Larisa Grigore <larisagrigore@gmail.com> 382657471SMarkus Pfeiffer * 482657471SMarkus Pfeiffer * Redistribution and use in source and binary forms, with or without 582657471SMarkus Pfeiffer * modification, are permitted provided that the following conditions 682657471SMarkus Pfeiffer * are met: 782657471SMarkus Pfeiffer * 1. Redistributions of source code must retain the above copyright 882657471SMarkus Pfeiffer * notice, this list of conditions and the following disclaimer. 982657471SMarkus Pfeiffer * 2. Redistributions in binary form must reproduce the above copyright 1082657471SMarkus Pfeiffer * notice, this list of conditions and the following disclaimer in the 1182657471SMarkus Pfeiffer * documentation and/or other materials provided with the distribution. 1282657471SMarkus Pfeiffer * 3. All advertising materials mentioning features or use of this software 1382657471SMarkus Pfeiffer * must display the following acknowledgement: 1482657471SMarkus Pfeiffer * This product includes software developed by Adam Glass and Charles 1582657471SMarkus Pfeiffer * Hannum. 1682657471SMarkus Pfeiffer * 4. The names of the authors may not be used to endorse or promote products 1782657471SMarkus Pfeiffer * derived from this software without specific prior written permission. 1882657471SMarkus Pfeiffer * 1982657471SMarkus Pfeiffer * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 2082657471SMarkus Pfeiffer * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2182657471SMarkus Pfeiffer * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2282657471SMarkus Pfeiffer * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2382657471SMarkus Pfeiffer * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2482657471SMarkus Pfeiffer * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2582657471SMarkus Pfeiffer * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2682657471SMarkus Pfeiffer * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2782657471SMarkus Pfeiffer * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2882657471SMarkus Pfeiffer * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2982657471SMarkus Pfeiffer */ 3082657471SMarkus Pfeiffer 3182657471SMarkus Pfeiffer #include <sys/types.h> 3282657471SMarkus Pfeiffer #include <sys/syscall.h> 3382657471SMarkus Pfeiffer #include <unistd.h> 3482657471SMarkus Pfeiffer 3582657471SMarkus Pfeiffer void (*cb_prepare)(void) = 0; 3682657471SMarkus Pfeiffer void (*cb_parent)(void) = 0; 3782657471SMarkus Pfeiffer void (*cb_child)(void) = 0; 3882657471SMarkus Pfeiffer 3982657471SMarkus Pfeiffer int 40*790693b1SSascha Wildner __fork(void) 4182657471SMarkus Pfeiffer { 4282657471SMarkus Pfeiffer int ret; 4382657471SMarkus Pfeiffer 4482657471SMarkus Pfeiffer if (cb_prepare) 4582657471SMarkus Pfeiffer cb_prepare(); 4682657471SMarkus Pfeiffer 4782657471SMarkus Pfeiffer if ((ret = __syscall(SYS_fork)) == 0) { 4882657471SMarkus Pfeiffer if (cb_child) 4982657471SMarkus Pfeiffer cb_child(); 5082657471SMarkus Pfeiffer } else { 5182657471SMarkus Pfeiffer if (cb_parent) 5282657471SMarkus Pfeiffer cb_parent(); 5382657471SMarkus Pfeiffer } 5482657471SMarkus Pfeiffer return (ret); 5582657471SMarkus Pfeiffer } 5682657471SMarkus Pfeiffer __weak_reference(__fork, fork); 57