1
#ifndef HEADER_CURL_SIGPIPE_H
2
#define HEADER_CURL_SIGPIPE_H
3
/***************************************************************************
5
* Project ___| | | | _ \| |
7
* | (__| |_| | _ <| |___
8
* \___|\___/|_| \_\_____|
10
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
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 http://curl.haxx.se/docs/copyright.html.
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.
20
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21
* KIND, either express or implied.
23
***************************************************************************/
24
#include "curl_setup.h"
26
#if defined(HAVE_SIGNAL_H) && defined(HAVE_SIGACTION) && defined(USE_OPENSSL)
29
struct sigpipe_ignore {
30
struct sigaction old_pipe_act;
34
#define SIGPIPE_VARIABLE(x) struct sigpipe_ignore x
37
* sigpipe_ignore() makes sure we ignore SIGPIPE while running libcurl
38
* internals, and then sigpipe_restore() will restore the situation when we
39
* return from libcurl again.
41
static void sigpipe_ignore(struct SessionHandle *data,
42
struct sigpipe_ignore *ig)
44
/* get a local copy of no_signal because the SessionHandle might not be
45
around when we restore */
46
ig->no_signal = data->set.no_signal;
47
if(!data->set.no_signal) {
48
struct sigaction action;
49
/* first, extract the existing situation */
50
memset(&ig->old_pipe_act, 0, sizeof(struct sigaction));
51
sigaction(SIGPIPE, NULL, &ig->old_pipe_act);
52
action = ig->old_pipe_act;
53
/* ignore this signal */
54
action.sa_handler = SIG_IGN;
55
sigaction(SIGPIPE, &action, NULL);
60
* sigpipe_restore() puts back the outside world's opinion of signal handler
61
* and SIGPIPE handling. It MUST only be called after a corresponding
62
* sigpipe_ignore() was used.
64
static void sigpipe_restore(struct sigpipe_ignore *ig)
67
/* restore the outside state */
68
sigaction(SIGPIPE, &ig->old_pipe_act, NULL);
72
/* for systems without sigaction */
73
#define sigpipe_ignore(x,y) Curl_nop_stmt
74
#define sigpipe_restore(x) Curl_nop_stmt
75
#define SIGPIPE_VARIABLE(x)
78
#endif /* HEADER_CURL_SIGPIPE_H */