Annotation of embedaddon/curl/lib/sigpipe.h, revision 1.1
1.1 ! misho 1: #ifndef HEADER_CURL_SIGPIPE_H
! 2: #define HEADER_CURL_SIGPIPE_H
! 3: /***************************************************************************
! 4: * _ _ ____ _
! 5: * Project ___| | | | _ \| |
! 6: * / __| | | | |_) | |
! 7: * | (__| |_| | _ <| |___
! 8: * \___|\___/|_| \_\_____|
! 9: *
! 10: * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
! 11: *
! 12: * This software is licensed as described in the file COPYING, which
! 13: * you should have received as part of this distribution. The terms
! 14: * are also available at https://curl.haxx.se/docs/copyright.html.
! 15: *
! 16: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 17: * copies of the Software, and permit persons to whom the Software is
! 18: * furnished to do so, under the terms of the COPYING file.
! 19: *
! 20: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 21: * KIND, either express or implied.
! 22: *
! 23: ***************************************************************************/
! 24: #include "curl_setup.h"
! 25:
! 26: #if defined(HAVE_SIGNAL_H) && defined(HAVE_SIGACTION) && \
! 27: (defined(USE_OPENSSL) || defined(USE_MBEDTLS))
! 28: #include <signal.h>
! 29:
! 30: struct sigpipe_ignore {
! 31: struct sigaction old_pipe_act;
! 32: bool no_signal;
! 33: };
! 34:
! 35: #define SIGPIPE_VARIABLE(x) struct sigpipe_ignore x
! 36:
! 37: /*
! 38: * sigpipe_ignore() makes sure we ignore SIGPIPE while running libcurl
! 39: * internals, and then sigpipe_restore() will restore the situation when we
! 40: * return from libcurl again.
! 41: */
! 42: static void sigpipe_ignore(struct Curl_easy *data,
! 43: struct sigpipe_ignore *ig)
! 44: {
! 45: /* get a local copy of no_signal because the Curl_easy might not be
! 46: around when we restore */
! 47: ig->no_signal = data->set.no_signal;
! 48: if(!data->set.no_signal) {
! 49: struct sigaction action;
! 50: /* first, extract the existing situation */
! 51: memset(&ig->old_pipe_act, 0, sizeof(struct sigaction));
! 52: sigaction(SIGPIPE, NULL, &ig->old_pipe_act);
! 53: action = ig->old_pipe_act;
! 54: /* ignore this signal */
! 55: action.sa_handler = SIG_IGN;
! 56: sigaction(SIGPIPE, &action, NULL);
! 57: }
! 58: }
! 59:
! 60: /*
! 61: * sigpipe_restore() puts back the outside world's opinion of signal handler
! 62: * and SIGPIPE handling. It MUST only be called after a corresponding
! 63: * sigpipe_ignore() was used.
! 64: */
! 65: static void sigpipe_restore(struct sigpipe_ignore *ig)
! 66: {
! 67: if(!ig->no_signal)
! 68: /* restore the outside state */
! 69: sigaction(SIGPIPE, &ig->old_pipe_act, NULL);
! 70: }
! 71:
! 72: #else
! 73: /* for systems without sigaction */
! 74: #define sigpipe_ignore(x,y) Curl_nop_stmt
! 75: #define sigpipe_restore(x) Curl_nop_stmt
! 76: #define SIGPIPE_VARIABLE(x)
! 77: #endif
! 78:
! 79: #endif /* HEADER_CURL_SIGPIPE_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>