From aee369f6f75c3e2ec4e82c9dced4950498df4551333e3f9495d932f9db75547f Mon Sep 17 00:00:00 2001 From: Marcus Rueckert Date: Tue, 30 Nov 2010 15:30:13 +0000 Subject: [PATCH] Accepting request 54144 from GNOME:Apps Accepted submit request 54144 from user vuntz OBS-URL: https://build.opensuse.org/request/show/54144 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/pidgin?expand=0&rev=63 --- _service | 7 + _service:download_url:pidgin-2.7.7.tar.bz2 | 3 + pidgin-2.7.6.tar.bz2 | 3 - pidgin-nonblock-aim.patch | 487 --------------------- pidgin.changes | 25 ++ pidgin.spec | 8 +- 6 files changed, 37 insertions(+), 496 deletions(-) create mode 100644 _service create mode 100644 _service:download_url:pidgin-2.7.7.tar.bz2 delete mode 100644 pidgin-2.7.6.tar.bz2 delete mode 100644 pidgin-nonblock-aim.patch diff --git a/_service b/_service new file mode 100644 index 0000000..f514dfb --- /dev/null +++ b/_service @@ -0,0 +1,7 @@ + + + sourceforge.net + http + /projects/pidgin/files/Pidgin/2.7.7/pidgin-2.7.7.tar.bz2/download + + \ No newline at end of file diff --git a/_service:download_url:pidgin-2.7.7.tar.bz2 b/_service:download_url:pidgin-2.7.7.tar.bz2 new file mode 100644 index 0000000..dd5abfa --- /dev/null +++ b/_service:download_url:pidgin-2.7.7.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ceedc24510e3577e1f8c57bb01b3abdaa92f6d067e2602125f0d7fc75f72f1d +size 9829698 diff --git a/pidgin-2.7.6.tar.bz2 b/pidgin-2.7.6.tar.bz2 deleted file mode 100644 index 317c223..0000000 --- a/pidgin-2.7.6.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f02602c4de78015c542dd873abe61521bafbe074be624ae1d2bab53da9671753 -size 9828413 diff --git a/pidgin-nonblock-aim.patch b/pidgin-nonblock-aim.patch deleted file mode 100644 index 0bb91d6..0000000 --- a/pidgin-nonblock-aim.patch +++ /dev/null @@ -1,487 +0,0 @@ -diff -upr gaim-1.5.0/libgaim/protocols/oscar/aim.h gaim-1.5.0-new/libgaim/protocols/oscar/aim.h ---- gaim-1.5.0/libpurple/protocols/oscar/aim.h 2005-08-07 23:36:16.000000000 -0500 -+++ gaim-1.5.0-new/libpurple/protocols/oscar/aim.h 2005-09-28 11:29:23.000000000 -0500 -@@ -35,6 +35,8 @@ - #include "libc_interface.h" - #endif - -+#include "gaim-io.h" -+ - #ifdef __cplusplus - extern "C" { - #endif -@@ -310,8 +312,13 @@ struct client_info_s { - #define AIM_FRAMETYPE_FLAP 0x0000 - #define AIM_FRAMETYPE_OFT 0x0001 - -+typedef struct aim_frame_s aim_frame_t; -+ - typedef struct aim_conn_s { - int fd; -+ GaimIO *io; -+ aim_frame_t *current_frame; -+ int current_payload_len; - fu16_t type; - fu16_t subtype; - flap_seqnum_t seqnum; -@@ -346,7 +353,7 @@ typedef struct aim_bstream_s { - fu32_t offset; - } aim_bstream_t; - --typedef struct aim_frame_s { -+struct aim_frame_s { - fu8_t hdrtype; /* defines which piece of the union to use */ - union { - struct { -@@ -363,7 +370,7 @@ typedef struct aim_frame_s { - aim_conn_t *conn; /* the connection it came in on/is going out on */ - fu8_t handled; /* 0 = new, !0 = been handled */ - struct aim_frame_s *next; --} aim_frame_t; -+}; - - typedef struct aim_msgcookie_s { - fu8_t cookie[8]; -diff -upr gaim-1.5.0/libgaim/protocols/oscar/aim_internal.h gaim-1.5.0-new/libgaim/protocols/oscar/aim_internal.h ---- gaim-1.5.0/libgaim/protocols/oscar/aim_internal.h 2005-03-06 22:51:56.000000000 -0600 -+++ gaim-1.5.0-new/libgaim/protocols/oscar/aim_internal.h 2005-09-28 11:29:23.000000000 -0500 -@@ -102,8 +102,8 @@ faim_internal int aim_parse_unknown(aim_ - faim_internal void aim_clonehandlers(aim_session_t *sess, aim_conn_t *dest, aim_conn_t *libgaim); - - /* rxqueue.c */ --faim_internal int aim_recv(int fd, void *buf, size_t count); --faim_internal int aim_bstream_recv(aim_bstream_t *bs, int fd, size_t count); -+faim_internal int aim_recv(aim_conn_t *conn, void *buf, size_t count); -+faim_internal int aim_bstream_recv(aim_bstream_t *bs, aim_conn_t *conn, size_t count); - faim_internal void aim_rxqueue_cleanbyconn(aim_session_t *sess, aim_conn_t *conn); - faim_internal void aim_frame_destroy(aim_frame_t *); - -diff -upr gaim-1.5.0/libgaim/protocols/oscar/conn.c gaim-1.5.0-new/libgaim/protocols/oscar/conn.c ---- gaim-1.5.0/libgaim/protocols/oscar/conn.c 2005-07-09 14:26:51.000000000 -0500 -+++ gaim-1.5.0-new/libgaim/protocols/oscar/conn.c 2005-09-28 11:29:23.000000000 -0500 -@@ -161,6 +161,9 @@ static void connkill_real(aim_session_t - if ((*deadconn)->fd != -1) - aim_conn_close(*deadconn); - -+ if ((*deadconn)->io) -+ gaim_io_destroy ((*deadconn)->io); -+ - /* - * This will free ->internal if it necessary... - */ -@@ -218,6 +221,7 @@ static void aim_conn_init(aim_conn_t *de - return; - - deadconn->fd = -1; -+ deadconn->io = NULL; - deadconn->subtype = -1; - deadconn->type = -1; - deadconn->seqnum = 0; -@@ -304,8 +308,12 @@ faim_export void aim_conn_close(aim_conn - { - aim_rxcallback_t userfunc; - -- if (deadconn->fd >= 3) -+ if (deadconn->io) { -+ gaim_io_destroy (deadconn->io); -+ deadconn->io = NULL; -+ } else if (deadconn->fd >= 3) { - close(deadconn->fd); -+ } - - deadconn->fd = -1; - -@@ -559,6 +567,7 @@ faim_internal aim_conn_t *aim_cloneconn( - return NULL; - - conn->fd = libgaim->fd; -+ conn->io = gaim_io_new (conn->fd); - conn->type = libgaim->type; - conn->subtype = libgaim->subtype; - conn->seqnum = libgaim->seqnum; -@@ -606,6 +615,7 @@ faim_export aim_conn_t *aim_newconn(aim_ - - connstruct->sessv = (void *)sess; - connstruct->type = type; -+ connstruct->io = NULL; - - if (!dest) { /* just allocate a struct */ - connstruct->fd = -1; -diff -upr gaim-1.5.0/libgaim/protocols/oscar/ft.c gaim-1.5.0-new/libgaim/protocols/oscar/ft.c ---- gaim-1.5.0/libgaim/protocols/oscar/ft.c 2005-08-07 23:36:17.000000000 -0500 -+++ gaim-1.5.0-new/libgaim/protocols/oscar/ft.c 2005-09-28 11:29:23.000000000 -0500 -@@ -630,9 +630,9 @@ static int handlehdr_odc(aim_session_t * - - while (payloadlength - recvd) { - if (payloadlength - recvd >= 1024) -- i = aim_recv(conn->fd, &msg[recvd], 1024); -+ i = aim_recv(conn, &msg[recvd], 1024); - else -- i = aim_recv(conn->fd, &msg[recvd], payloadlength - recvd); -+ i = aim_recv(conn, &msg[recvd], payloadlength - recvd); - if (i <= 0) { - free(msg); - free(snptr); -diff -upr gaim-1.5.0/libgaim/protocols/oscar/oscar.c gaim-1.5.0-new/libgaim/protocols/oscar/oscar.c ---- gaim-1.5.0/libgaim/protocols/oscar/oscar.c 2005-08-11 19:57:27.000000000 -0500 -+++ gaim-1.5.0-new/libgaim/protocols/oscar/oscar.c 2005-09-28 11:29:24.000000000 -0500 -@@ -1580,7 +1580,7 @@ static void oscar_callback(gpointer data - gaim_debug_error("oscar", "Waiting to be destroyed\n"); - return; - } -- } else { -+ } else if (!conn->io || !gaim_io_is_connected (conn->io)) { - if ((conn->type == AIM_CONN_TYPE_BOS) || - !(aim_getconn_type(od->sess, AIM_CONN_TYPE_BOS))) { - gaim_debug_error("oscar", -@@ -3243,6 +3243,11 @@ static void oscar_sendfile_connected(gpo - return; - } - -+static void oscar_sendfile_ready_to_xfer (GaimIO *io, GaimXfer *xfer) -+{ -+ gaim_xfer_start(xfer, xfer->fd, NULL, 0); -+} -+ - /* - * This is called when a buddy sends us some file info. This happens when they - * are sending a file to you, and you have just established a connection to them. -@@ -3285,7 +3290,12 @@ static int oscar_sendfile_prompt(aim_ses - - /* XXX - convert the name from UTF-8 to UCS-2 if necessary, and pass the encoding to the call below */ - aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_ACK, oft_info); -- gaim_xfer_start(xfer, xfer->fd, NULL, 0); -+ -+ if (xfer->fd == conn->fd && conn->io && gaim_io_get_pending_write (conn->io)) { -+ gaim_io_set_flushed_func (conn->io, (GaimIOFunc) oscar_sendfile_ready_to_xfer, xfer); -+ } else { -+ oscar_sendfile_ready_to_xfer (conn->io, xfer); -+ } - - return 0; - } -@@ -3317,7 +3327,11 @@ static int oscar_sendfile_ack(aim_sessio - gaim_input_remove(xfer->watcher); - xfer->watcher = 0; - -- gaim_xfer_start(xfer, xfer->fd, NULL, 0); -+ if (xfer->fd == conn->fd && conn->io && gaim_io_get_pending_write (conn->io)) { -+ gaim_io_set_flushed_func (conn->io, (GaimIOFunc) oscar_sendfile_ready_to_xfer, xfer); -+ } else { -+ oscar_sendfile_ready_to_xfer (conn->io, xfer); -+ } - - return 0; - } -diff -upr gaim-1.5.0/libgaim/protocols/oscar/rxqueue.c gaim-1.5.0-new/libgaim/protocols/oscar/rxqueue.c ---- gaim-1.5.0/libgaim/protocols/oscar/rxqueue.c 2004-05-05 23:41:24.000000000 -0500 -+++ gaim-1.5.0-new/libgaim/protocols/oscar/rxqueue.c 2005-09-28 11:29:24.000000000 -0500 -@@ -5,7 +5,7 @@ - */ - - #define FAIM_INTERNAL --#include -+#include - - #ifndef _WIN32 - #include -@@ -14,43 +14,44 @@ - /* - * - */ --faim_internal int aim_recv(int fd, void *buf, size_t count) -+faim_internal int aim_recv(aim_conn_t *conn, void *buf, size_t count) - { -- int left, cur; -+ int left, cur; - -- for (cur = 0, left = count; left; ) { -- int ret; -- -- ret = recv(fd, ((unsigned char *)buf)+cur, left, 0); -+ if (!conn->io) -+ conn->io = gaim_io_new (conn->fd); - -- /* Of course EOF is an error, only morons disagree with that. */ -- if (ret <= 0) -- return -1; -- -- cur += ret; -- left -= ret; -+ if (gaim_io_get_fd (conn->io) != conn->fd) { -+ gaim_io_destroy (conn->io); -+ conn->io = gaim_io_new (conn->fd); - } - -- return cur; -+ if (!gaim_io_is_connected (conn->io)) -+ return -1; -+ -+ if (!gaim_io_read_bytes (conn->io, buf, count)) -+ return gaim_io_is_connected (conn->io) ? 0 : -1; -+ -+ return count; - } - - /* - * Read into a byte stream. Will not read more than count, but may read - * less if there is not enough room in the stream buffer. - */ --faim_internal int aim_bstream_recv(aim_bstream_t *bs, int fd, size_t count) -+faim_internal int aim_bstream_recv(aim_bstream_t *bs, aim_conn_t *conn, size_t count) - { - int red = 0; - -- if (!bs || (fd < 0) || (count < 0)) -+ if (!bs || (conn->fd < 0) || (count < 0)) - return -1; -- -+ - if (count > (bs->len - bs->offset)) - count = bs->len - bs->offset; /* truncate to remaining space */ - - if (count) { - -- red = aim_recv(fd, bs->data + bs->offset, count); -+ red = aim_recv(conn, bs->data + bs->offset, count); - - if (red <= 0) - return -1; -@@ -86,7 +87,7 @@ static int aim_get_command_flap(aim_sess - { - fu8_t hdr_raw[6]; - aim_bstream_t hdr; -- -+ - fr->hdrtype = AIM_FRAMETYPE_FLAP; - - /* -@@ -101,8 +102,7 @@ static int aim_get_command_flap(aim_sess - * 0x04 | Number of data bytes that follow, 2 bytes. - */ - aim_bstream_init(&hdr, hdr_raw, sizeof(hdr_raw)); -- if (aim_bstream_recv(&hdr, conn->fd, 6) < 6) { -- aim_conn_close(conn); -+ if (aim_bstream_recv(&hdr, conn, 6) < 6) { - return -1; - } - -@@ -113,10 +113,10 @@ static int aim_get_command_flap(aim_sess - * or we break. We must handle it just in case. - */ - if (aimbs_get8(&hdr) != 0x2a) { -- faimdprintf(sess, 0, "Invalid FLAP frame received on FLAP connection!"); -+ gaim_debug_misc("oscar", "Invalid FLAP frame received on FLAP connection!"); - aim_conn_close(conn); - return -1; -- } -+ } - - fr->hdr.flap.channel = aimbs_get8(&hdr); - fr->hdr.flap.seqnum = aimbs_get16(&hdr); -@@ -141,8 +141,7 @@ static int aim_get_command_rendezvous(ai - * Read rendezvous header - */ - aim_bstream_init(&hdr, hdr_raw, sizeof(hdr_raw)); -- if (aim_bstream_recv(&hdr, conn->fd, 8) < 8) { -- aim_conn_close(conn); -+ if (aim_bstream_recv(&hdr, conn, 8) < 8) { - return -1; - } - -@@ -163,7 +162,6 @@ static int aim_get_command_rendezvous(ai - */ - faim_export int aim_get_command(aim_session_t *sess, aim_conn_t *conn) - { -- aim_frame_t *fr; - int payloadlen; - - if (!sess || !conn) -@@ -172,69 +170,81 @@ faim_export int aim_get_command(aim_sess - if (conn->fd == -1) - return -1; /* it's an aim_conn_close()'d connection */ - -- if (conn->fd < 3) /* can happen when people abuse the interface */ -+ /* If stdin is closed, then zero becomes a valid fd -+ if (conn->fd < 3) - return -1; -+ */ - - if (conn->status & AIM_CONN_STATUS_INPROGRESS) - return aim_conn_completeconnect(sess, conn); - -- if (!(fr = (aim_frame_t *)calloc(sizeof(aim_frame_t), 1))) -- return -ENOMEM; -+ if (!conn->current_frame) { -+ if (!(conn->current_frame = (aim_frame_t *)calloc(sizeof(aim_frame_t), 1))) -+ return -ENOMEM; -+ -+ /* -+ * Rendezvous (client to client) connections do not speak FLAP, so this -+ * function will break on them. -+ */ -+ if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) -+ payloadlen = aim_get_command_rendezvous(sess, conn, conn->current_frame); -+ else if (conn->type == AIM_CONN_TYPE_LISTENER) { -+ gaim_debug_misc("oscar", "AIM_CONN_TYPE_LISTENER on fd %d\n", conn->fd); -+ free(conn->current_frame); -+ conn->current_frame = NULL; -+ return -1; -+ } else -+ payloadlen = aim_get_command_flap(sess, conn, conn->current_frame); - -- /* -- * Rendezvous (client to client) connections do not speak FLAP, so this -- * function will break on them. -- */ -- if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) -- payloadlen = aim_get_command_rendezvous(sess, conn, fr); -- else if (conn->type == AIM_CONN_TYPE_LISTENER) { -- faimdprintf(sess, 0, "AIM_CONN_TYPE_LISTENER on fd %d\n", conn->fd); -- free(fr); -- return -1; -- } else -- payloadlen = aim_get_command_flap(sess, conn, fr); -+ if (payloadlen < 0) { -+ free(conn->current_frame); -+ conn->current_frame = NULL; -+ return -1; -+ } - -- if (payloadlen < 0) { -- free(fr); -- return -1; -- } -+ conn->current_payload_len = payloadlen; -+ } else -+ payloadlen = conn->current_payload_len; - -- if (payloadlen > 0) { -+ if (conn->current_payload_len > 0) { - fu8_t *payload = NULL; - - if (!(payload = (fu8_t *) malloc(payloadlen))) { -- aim_frame_destroy(fr); - return -1; - } - -- aim_bstream_init(&fr->data, payload, payloadlen); -+ aim_bstream_init(&conn->current_frame->data, payload, payloadlen); - - /* read the payload */ -- if (aim_bstream_recv(&fr->data, conn->fd, payloadlen) < payloadlen) { -- aim_frame_destroy(fr); /* free's payload */ -- aim_conn_close(conn); -+ if (aim_bstream_recv(&conn->current_frame->data, conn, payloadlen) < payloadlen) { -+ free (payload); - return -1; - } -- } else -- aim_bstream_init(&fr->data, NULL, 0); -+ } else if (conn->current_payload_len == 0) -+ aim_bstream_init(&conn->current_frame->data, NULL, 0); - -- aim_bstream_rewind(&fr->data); -+ if (conn->current_payload_len >= 0) { -+ aim_bstream_rewind(&conn->current_frame->data); - -- fr->conn = conn; -+ conn->current_frame->conn = conn; - -- /* Enqueue this puppy */ -- fr->next = NULL; /* this will always be at the bottom */ -- if (sess->queue_incoming == NULL) -- sess->queue_incoming = fr; -- else { -- aim_frame_t *cur; -- for (cur = sess->queue_incoming; cur->next; cur = cur->next); -- cur->next = fr; -- } -+ /* Enqueue this puppy */ -+ conn->current_frame->next = NULL; /* this will always be at the bottom */ -+ if (sess->queue_incoming == NULL) -+ sess->queue_incoming = conn->current_frame; -+ else { -+ aim_frame_t *cur; -+ for (cur = sess->queue_incoming; cur->next; cur = cur->next); -+ cur->next = conn->current_frame; -+ } - -- fr->conn->lastactivity = time(NULL); -+ conn->current_frame->conn->lastactivity = time(NULL); - -- return 0; -+ conn->current_frame = NULL; -+ return 0; -+ } -+ -+ return -1; - } - - /* -@@ -270,7 +280,7 @@ faim_internal void aim_rxqueue_cleanbyco - for (currx = sess->queue_incoming; currx; currx = currx->next) { - if ((!currx->handled) && (currx->conn == conn)) - currx->handled = 1; -- } -+ } - - return; - } -diff -upr gaim-1.5.0/libgaim/protocols/oscar/txqueue.c gaim-1.5.0-new/libgaim/protocols/oscar/txqueue.c ---- gaim-1.5.0/libgaim/protocols/oscar/txqueue.c 2004-07-06 02:00:32.000000000 -0500 -+++ gaim-1.5.0-new/libgaim/protocols/oscar/txqueue.c 2005-09-28 11:29:24.000000000 -0500 -@@ -192,25 +192,22 @@ faim_internal int aim_tx_enqueue(aim_ses - return (*sess->tx_enqueue)(sess, fr); - } - --static int aim_send(int fd, const void *buf, size_t count) -+static int aim_send(aim_conn_t *conn, const void *buf, size_t count) - { - int left, cur; - -- for (cur = 0, left = count; left; ) { -- int ret; -+ if (!conn->io) -+ conn->io = gaim_io_new (conn->fd); - -- ret = send(fd, ((unsigned char *)buf)+cur, left, 0); -- -- if (ret == -1) -- return -1; -- else if (ret == 0) -- return cur; -- -- cur += ret; -- left -= ret; -+ if (gaim_io_get_fd (conn->io) != conn->fd) { -+ gaim_io_destroy (conn->io); -+ conn->io = gaim_io_new (conn->fd); - } - -- return cur; -+ if (!gaim_io_write_bytes (conn->io, buf, count)) -+ return -1; -+ -+ return count; - } - - static int aim_bstream_send(aim_bstream_t *bs, aim_conn_t *conn, size_t count) -@@ -239,7 +236,7 @@ static int aim_bstream_send(aim_bstream_ - while (count - wrote > 1024) { - int ret; - -- ret = aim_send(conn->fd, bs->data + bs->offset + wrote, 1024); -+ ret = aim_send(conn, bs->data + bs->offset + wrote, 1024); - if (ret > 0) - wrote += ret; - if (ret < 0) -@@ -250,7 +247,7 @@ static int aim_bstream_send(aim_bstream_ - } - - if (count - wrote) { -- wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, count - wrote); -+ wrote = wrote + aim_send(conn, bs->data + bs->offset + wrote, count - wrote); - } - } - diff --git a/pidgin.changes b/pidgin.changes index 6ba457d..0f3f0f8 100644 --- a/pidgin.changes +++ b/pidgin.changes @@ -1,3 +1,28 @@ +------------------------------------------------------------------- +Tue Nov 30 07:51:09 UTC 2010 - dimstar@opensuse.org + +- Drop pidgin-nonblock-aim.patch: Does not apply and seems + obsoleted. Part of bnc#569271. + +------------------------------------------------------------------- +Thu Nov 25 13:29:36 UTC 2010 - christoph.miebach@web.de + +- Update to version 2.7.7: + + General: + - Allow multiple CA certificates to share the same + Distinguished Name (DN). Partially fixes remaining MSN + issues. + - The GNUTLS SSL plugin now discards any certificate (and all + subsequent certificates) in a chain if it did not sign the + previous certificate. Partially fixes remaining MSN issues. + - Open requests related to a file transfer are now closed when + the request is cancelled locally. + + AIM and ICQ: + - AIM should now connect if "Use clientLogin" is turned off and + the "Server" field is set to anything other than + "login.oscar.aol.com" or "slogin.oscar.aol.com". + - Fix a crash on connection loss. + ------------------------------------------------------------------- Tue Nov 23 11:37:36 UTC 2010 - lchiquitto@novell.com diff --git a/pidgin.spec b/pidgin.spec index 7d6f58d..8842299 100644 --- a/pidgin.spec +++ b/pidgin.spec @@ -1,5 +1,5 @@ # -# spec file for package pidgin (Version 2.7.6) +# spec file for package pidgin (Version 2.7.7) # # Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany. # @@ -25,7 +25,7 @@ Name: pidgin Summary: GTK+-Based Multiprotocol Instant Messaging Client -Version: 2.7.6 +Version: 2.7.7 Release: 1 License: GPLv2+ Group: Productivity/Networking/Instant Messenger @@ -34,8 +34,6 @@ Source: http://downloads.sourceforge.net/pidgin/%{name}-%{version}.tar.b Source1: pidgin-NLD-smiley-theme.tar.bz2 Source2: pidgin-Tango-smiley-theme.tar.bz2 Patch1: pidgin-gnome-keyring.patch -# PATCH-NEEDS-REBASE -Patch2: pidgin-nonblock-aim.patch Patch3: pidgin-nonblock-common.patch Patch4: pidgin-nonblock-gwim.patch Patch5: pidgin-nonblock-common2.patch @@ -324,8 +322,6 @@ translation-update-upstream %if 0%{?building_for_sle_ge_11} %patch1 -p1 %endif -# FIXME: Port this patch: -#%patch2 -p1 %patch3 -p1 %patch4 -p1 %patch5 -p1