1*fd6b1cc3SAndrew Turner /* 2*fd6b1cc3SAndrew Turner * Copyright (c) 2011 Konstantin Belousov <kib@FreeBSD.org> 3*fd6b1cc3SAndrew Turner * All rights reserved. 4*fd6b1cc3SAndrew Turner * 5*fd6b1cc3SAndrew Turner * Redistribution and use in source and binary forms, with or without 6*fd6b1cc3SAndrew Turner * modification, are permitted provided that the following conditions 7*fd6b1cc3SAndrew Turner * are met: 8*fd6b1cc3SAndrew Turner * 9*fd6b1cc3SAndrew Turner * 1. Redistributions of source code must retain the above copyright 10*fd6b1cc3SAndrew Turner * notice, this list of conditions and the following disclaimer. 11*fd6b1cc3SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright 12*fd6b1cc3SAndrew Turner * notice, this list of conditions and the following disclaimer in the 13*fd6b1cc3SAndrew Turner * documentation and/or other materials provided with the distribution. 14*fd6b1cc3SAndrew Turner * 15*fd6b1cc3SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16*fd6b1cc3SAndrew Turner * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17*fd6b1cc3SAndrew Turner * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18*fd6b1cc3SAndrew Turner * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19*fd6b1cc3SAndrew Turner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20*fd6b1cc3SAndrew Turner * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21*fd6b1cc3SAndrew Turner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22*fd6b1cc3SAndrew Turner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23*fd6b1cc3SAndrew Turner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24*fd6b1cc3SAndrew Turner * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25*fd6b1cc3SAndrew Turner */ 26*fd6b1cc3SAndrew Turner 27*fd6b1cc3SAndrew Turner #include <sys/types.h> 28*fd6b1cc3SAndrew Turner #include <sys/ucontext.h> 29*fd6b1cc3SAndrew Turner #include <errno.h> 30*fd6b1cc3SAndrew Turner #include <stdlib.h> 31*fd6b1cc3SAndrew Turner 32*fd6b1cc3SAndrew Turner int 33*fd6b1cc3SAndrew Turner __getcontextx_size(void) 34*fd6b1cc3SAndrew Turner { 35*fd6b1cc3SAndrew Turner 36*fd6b1cc3SAndrew Turner return (sizeof(ucontext_t)); 37*fd6b1cc3SAndrew Turner } 38*fd6b1cc3SAndrew Turner 39*fd6b1cc3SAndrew Turner int 40*fd6b1cc3SAndrew Turner __fillcontextx2(char *ctx) 41*fd6b1cc3SAndrew Turner { 42*fd6b1cc3SAndrew Turner 43*fd6b1cc3SAndrew Turner return (0); 44*fd6b1cc3SAndrew Turner } 45*fd6b1cc3SAndrew Turner 46*fd6b1cc3SAndrew Turner int 47*fd6b1cc3SAndrew Turner __fillcontextx(char *ctx) 48*fd6b1cc3SAndrew Turner { 49*fd6b1cc3SAndrew Turner ucontext_t *ucp; 50*fd6b1cc3SAndrew Turner 51*fd6b1cc3SAndrew Turner ucp = (ucontext_t *)ctx; 52*fd6b1cc3SAndrew Turner return (getcontext(ucp)); 53*fd6b1cc3SAndrew Turner } 54*fd6b1cc3SAndrew Turner 55*fd6b1cc3SAndrew Turner __weak_reference(__getcontextx, getcontextx); 56*fd6b1cc3SAndrew Turner 57*fd6b1cc3SAndrew Turner ucontext_t * 58*fd6b1cc3SAndrew Turner __getcontextx(void) 59*fd6b1cc3SAndrew Turner { 60*fd6b1cc3SAndrew Turner char *ctx; 61*fd6b1cc3SAndrew Turner int error; 62*fd6b1cc3SAndrew Turner 63*fd6b1cc3SAndrew Turner ctx = malloc(__getcontextx_size()); 64*fd6b1cc3SAndrew Turner if (ctx == NULL) 65*fd6b1cc3SAndrew Turner return (NULL); 66*fd6b1cc3SAndrew Turner if (__fillcontextx(ctx) == -1) { 67*fd6b1cc3SAndrew Turner error = errno; 68*fd6b1cc3SAndrew Turner free(ctx); 69*fd6b1cc3SAndrew Turner errno = error; 70*fd6b1cc3SAndrew Turner return (NULL); 71*fd6b1cc3SAndrew Turner } 72*fd6b1cc3SAndrew Turner return ((ucontext_t *)ctx); 73*fd6b1cc3SAndrew Turner } 74