X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=mutt_tunnel.c;h=92fcea56171388cce556957de065480c93d9353e;hp=01338d70b79db26fc05f7ad5f58db0247d13c1c9;hb=2ea77d3b2827ba23feb756ce2fb936565ae38998;hpb=f404a0ca916be07049af51a3022baaaaab94def6 diff --git a/mutt_tunnel.c b/mutt_tunnel.c index 01338d7..92fcea5 100644 --- a/mutt_tunnel.c +++ b/mutt_tunnel.c @@ -1,30 +1,26 @@ /* + * Copyright notice from original mutt: * Copyright (C) 2000 Manoj Kasichainula - * Copyright (C) 2001 Brendan Cully + * Copyright (C) 2001,2005 Brendan Cully * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. */ #if HAVE_CONFIG_H # include "config.h" #endif +#include +#include +#include + #include "mutt.h" #include "mutt_socket.h" #include "mutt_tunnel.h" + #include #include #include @@ -33,56 +29,53 @@ #include /* -- data types -- */ -typedef struct -{ +typedef struct { pid_t pid; int readfd; int writefd; } TUNNEL_DATA; /* forward declarations */ -static int tunnel_socket_open (CONNECTION*); -static int tunnel_socket_close (CONNECTION*); -static int tunnel_socket_read (CONNECTION* conn, char* buf, size_t len); -static int tunnel_socket_write (CONNECTION* conn, const char* buf, size_t len); +static int tunnel_socket_open (CONNECTION *); +static int tunnel_socket_close (CONNECTION *); +static int tunnel_socket_read (CONNECTION * conn, char *buf, size_t len); +static int tunnel_socket_write (CONNECTION * conn, const char *buf, + size_t len); /* -- public functions -- */ -int mutt_tunnel_socket_setup (CONNECTION *conn) +int mutt_tunnel_socket_setup (CONNECTION * conn) { - conn->open = tunnel_socket_open; - conn->close = tunnel_socket_close; - conn->read = tunnel_socket_read; - conn->write = tunnel_socket_write; + conn->conn_open = tunnel_socket_open; + conn->conn_close = tunnel_socket_close; + conn->conn_read = tunnel_socket_read; + conn->conn_write = tunnel_socket_write; return 0; } -static int tunnel_socket_open (CONNECTION *conn) +static int tunnel_socket_open (CONNECTION * conn) { - TUNNEL_DATA* tunnel; + TUNNEL_DATA *tunnel; int pid; int rc; int pin[2], pout[2]; - tunnel = (TUNNEL_DATA*) safe_malloc (sizeof (TUNNEL_DATA)); + tunnel = p_new(TUNNEL_DATA, 1); conn->sockdata = tunnel; mutt_message (_("Connecting with \"%s\"..."), Tunnel); - if ((rc = pipe (pin)) == -1) - { + if ((rc = pipe (pin)) == -1) { mutt_perror ("pipe"); return -1; } - if ((rc = pipe (pout)) == -1) - { + if ((rc = pipe (pout)) == -1) { mutt_perror ("pipe"); return -1; } mutt_block_signals_system (); - if ((pid = fork ()) == 0) - { + if ((pid = fork ()) == 0) { mutt_unblock_signals_system (0); if (dup2 (pout[0], STDIN_FILENO) < 0 || dup2 (pin[1], STDOUT_FILENO) < 0) _exit (127); @@ -100,8 +93,7 @@ static int tunnel_socket_open (CONNECTION *conn) } mutt_unblock_signals_system (1); - if (pid == -1) - { + if (pid == -1) { close (pin[0]); close (pin[1]); close (pout[0]); @@ -119,49 +111,54 @@ static int tunnel_socket_open (CONNECTION *conn) tunnel->writefd = pout[1]; tunnel->pid = pid; - conn->fd = 42; /* stupid hack */ + conn->fd = 42; /* stupid hack */ return 0; } -static int tunnel_socket_close (CONNECTION* conn) +static int tunnel_socket_close (CONNECTION * conn) { - TUNNEL_DATA* tunnel = (TUNNEL_DATA*) conn->sockdata; + TUNNEL_DATA *tunnel = (TUNNEL_DATA *) conn->sockdata; + int status; close (tunnel->readfd); close (tunnel->writefd); - waitpid (tunnel->pid, NULL, 0); - FREE (&conn->sockdata); - + waitpid (tunnel->pid, &status, 0); + if (!WIFEXITED(status) || WEXITSTATUS(status)) { + mutt_error(_("Tunnel to %s returned error %d (%s)"), + conn->account.host, WEXITSTATUS(status), + NONULL(mutt_strsysexit(WEXITSTATUS(status)))); + mutt_sleep (2); + } + p_delete(&conn->sockdata); return 0; } -static int tunnel_socket_read (CONNECTION* conn, char* buf, size_t len) +static int tunnel_socket_read (CONNECTION * conn, char *buf, size_t len) { - TUNNEL_DATA* tunnel = (TUNNEL_DATA*) conn->sockdata; + TUNNEL_DATA *tunnel = (TUNNEL_DATA *) conn->sockdata; int rc; rc = read (tunnel->readfd, buf, len); - if (rc == -1) - { + if (rc == -1) { mutt_error (_("Tunnel error talking to %s: %s"), conn->account.host, - strerror (errno)); + strerror (errno)); mutt_sleep (1); } return rc; } -static int tunnel_socket_write (CONNECTION* conn, const char* buf, size_t len) +static int tunnel_socket_write (CONNECTION * conn, const char *buf, + size_t len) { - TUNNEL_DATA* tunnel = (TUNNEL_DATA*) conn->sockdata; + TUNNEL_DATA *tunnel = (TUNNEL_DATA *) conn->sockdata; int rc; rc = write (tunnel->writefd, buf, len); - if (rc == -1) - { + if (rc == -1) { mutt_error (_("Tunnel error talking to %s: %s"), conn->account.host, - strerror (errno)); + strerror (errno)); mutt_sleep (1); }