annotate lib/sockutils.c @ 952:a490d94a5b8e

2008-03-28 Brian Masney <masneyb@gftp.org> * lib/Makefile.am lib/misc.c lib/socket-connect.c lib/socket-connect-getaddrinfo.c lib/socket-connect-gethostbyname.c lib/sockutils.c lib/gftp.h - cleaned up more of the socket functions and split them up into their own files. Cleanups and bug fixes to the DNS lookup code.
author masneyb
date Fri, 28 Mar 2008 11:44:36 +0000
parents c7d7a081cd9c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
950
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
1 /*****************************************************************************/
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
2 /* sockutils.c - various utilities for dealing with sockets */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
3 /* Copyright (C) 1998-2008 Brian Masney <masneyb@gftp.org> */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
4 /* */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
5 /* This program is free software; you can redistribute it and/or modify */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
6 /* it under the terms of the GNU General Public License as published by */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
7 /* the Free Software Foundation; either version 2 of the License, or */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
8 /* (at your option) any later version. */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
9 /* */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
10 /* This program is distributed in the hope that it will be useful, */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
13 /* GNU General Public License for more details. */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
14 /* */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
15 /* You should have received a copy of the GNU General Public License */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
16 /* along with this program; if not, write to the Free Software */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
17 /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
18 /*****************************************************************************/
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
19
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
20 #include "gftp.h"
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
21 static const char cvsid[] = "$Id: protocols.c 952 2008-01-24 23:31:26Z masneyb $";
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
22
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
23 ssize_t
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
24 gftp_get_line (gftp_request * request, gftp_getline_buffer ** rbuf,
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
25 char * str, size_t len, int fd)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
26 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
27 ssize_t (*read_function) (gftp_request * request, void *ptr, size_t size,
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
28 int fd);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
29 char *pos, *nextpos;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
30 size_t rlen, nslen;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
31 int end_of_buffer;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
32 ssize_t ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
33
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
34 if (request == NULL || request->read_function == NULL)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
35 read_function = gftp_fd_read;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
36 else
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
37 read_function = request->read_function;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
38
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
39 if (*rbuf == NULL)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
40 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
41 *rbuf = g_malloc0 (sizeof (**rbuf));
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
42 (*rbuf)->max_bufsize = len;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
43 (*rbuf)->buffer = g_malloc0 ((gulong) ((*rbuf)->max_bufsize + 1));
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
44
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
45 if ((ret = read_function (request, (*rbuf)->buffer,
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
46 (*rbuf)->max_bufsize, fd)) <= 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
47 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
48 gftp_free_getline_buffer (rbuf);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
49 return (ret);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
50 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
51 (*rbuf)->buffer[ret] = '\0';
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
52 (*rbuf)->cur_bufsize = ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
53 (*rbuf)->curpos = (*rbuf)->buffer;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
54 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
55
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
56 ret = 0;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
57 while (1)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
58 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
59 pos = strchr ((*rbuf)->curpos, '\n');
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
60 end_of_buffer = (*rbuf)->curpos == (*rbuf)->buffer &&
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
61 ((*rbuf)->max_bufsize == (*rbuf)->cur_bufsize || (*rbuf)->eof);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
62
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
63 if ((*rbuf)->cur_bufsize > 0 && (pos != NULL || end_of_buffer))
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
64 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
65 if (pos != NULL)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
66 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
67 nslen = pos - (*rbuf)->curpos + 1;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
68 nextpos = pos + 1;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
69 if (pos > (*rbuf)->curpos && *(pos - 1) == '\r')
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
70 pos--;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
71 *pos = '\0';
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
72 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
73 else
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
74 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
75 nslen = (*rbuf)->cur_bufsize;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
76 nextpos = NULL;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
77
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
78 /* This is not an overflow since we allocated one extra byte to
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
79 buffer above */
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
80 ((*rbuf)->buffer)[nslen] = '\0';
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
81 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
82
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
83 strncpy (str, (*rbuf)->curpos, len);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
84 str[len - 1] = '\0';
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
85 (*rbuf)->cur_bufsize -= nslen;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
86
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
87 if (nextpos != NULL)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
88 (*rbuf)->curpos = nextpos;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
89 else
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
90 (*rbuf)->cur_bufsize = 0;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
91
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
92 ret = nslen;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
93 break;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
94 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
95 else
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
96 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
97 if ((*rbuf)->cur_bufsize == 0 || *(*rbuf)->curpos == '\0')
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
98 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
99 rlen = (*rbuf)->max_bufsize;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
100 pos = (*rbuf)->buffer;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
101 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
102 else
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
103 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
104 memmove ((*rbuf)->buffer, (*rbuf)->curpos, (*rbuf)->cur_bufsize);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
105 pos = (*rbuf)->buffer + (*rbuf)->cur_bufsize;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
106 rlen = (*rbuf)->max_bufsize - (*rbuf)->cur_bufsize;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
107 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
108
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
109 (*rbuf)->curpos = (*rbuf)->buffer;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
110
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
111 if ((*rbuf)->eof)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
112 ret = 0;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
113 else
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
114 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
115 ret = read_function (request, pos, rlen, fd);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
116 if (ret < 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
117 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
118 gftp_free_getline_buffer (rbuf);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
119 return (ret);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
120 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
121 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
122
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
123 if (ret == 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
124 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
125 if ((*rbuf)->cur_bufsize == 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
126 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
127 gftp_free_getline_buffer (rbuf);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
128 return (ret);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
129 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
130
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
131 (*rbuf)->eof = 1;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
132 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
133
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
134 (*rbuf)->cur_bufsize += ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
135 (*rbuf)->buffer[(*rbuf)->cur_bufsize] = '\0';
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
136 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
137 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
138
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
139 return (ret);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
140 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
141
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
142
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
143 void
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
144 gftp_free_getline_buffer (gftp_getline_buffer ** rbuf)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
145 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
146 g_free ((*rbuf)->buffer);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
147 g_free (*rbuf);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
148 *rbuf = NULL;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
149 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
150
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
151
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
152 ssize_t
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
153 gftp_fd_read (gftp_request * request, void *ptr, size_t size, int fd)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
154 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
155 intptr_t network_timeout;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
156 struct timeval tv;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
157 fd_set fset;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
158 ssize_t ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
159 int s_ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
160
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
161 g_return_val_if_fail (fd >= 0, GFTP_EFATAL);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
162
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
163 gftp_lookup_request_option (request, "network_timeout", &network_timeout);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
164
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
165 errno = 0;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
166 ret = 0;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
167 FD_ZERO (&fset);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
168
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
169 do
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
170 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
171 FD_SET (fd, &fset);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
172 tv.tv_sec = network_timeout;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
173 tv.tv_usec = 0;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
174 s_ret = select (fd + 1, &fset, NULL, NULL, &tv);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
175 if (s_ret == -1 && (errno == EINTR || errno == EAGAIN))
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
176 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
177 if (request != NULL && request->cancel)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
178 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
179 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
180 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
181 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
182
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
183 continue;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
184 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
185 else if (s_ret <= 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
186 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
187 if (request != NULL)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
188 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
189 request->logging_function (gftp_logging_error, request,
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
190 _("Connection to %s timed out\n"),
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
191 request->hostname);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
192 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
193 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
194
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
195 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
196 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
197
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
198 if ((ret = read (fd, ptr, size)) < 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
199 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
200 if (errno == EINTR || errno == EAGAIN)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
201 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
202 if (request != NULL && request->cancel)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
203 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
204 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
205 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
206 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
207
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
208 continue;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
209 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
210
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
211 if (request != NULL)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
212 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
213 request->logging_function (gftp_logging_error, request,
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
214 _("Error: Could not read from socket: %s\n"),
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
215 g_strerror (errno));
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
216 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
217 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
218
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
219 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
220 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
221
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
222 break;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
223 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
224 while (1);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
225
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
226 return (ret);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
227 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
228
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
229
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
230 ssize_t
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
231 gftp_fd_write (gftp_request * request, const char *ptr, size_t size, int fd)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
232 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
233 intptr_t network_timeout;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
234 struct timeval tv;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
235 int ret, s_ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
236 ssize_t w_ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
237 fd_set fset;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
238
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
239 g_return_val_if_fail (fd >= 0, GFTP_EFATAL);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
240
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
241 gftp_lookup_request_option (request, "network_timeout", &network_timeout);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
242
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
243 errno = 0;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
244 ret = 0;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
245 FD_ZERO (&fset);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
246
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
247 do
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
248 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
249 FD_SET (fd, &fset);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
250 tv.tv_sec = network_timeout;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
251 tv.tv_usec = 0;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
252 s_ret = select (fd + 1, NULL, &fset, NULL, &tv);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
253 if (s_ret == -1 && (errno == EINTR || errno == EAGAIN))
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
254 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
255 if (request != NULL && request->cancel)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
256 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
257 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
258 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
259 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
260
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
261 continue;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
262 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
263 else if (s_ret <= 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
264 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
265 if (request != NULL)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
266 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
267 request->logging_function (gftp_logging_error, request,
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
268 _("Connection to %s timed out\n"),
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
269 request->hostname);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
270 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
271 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
272
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
273 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
274 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
275
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
276 w_ret = write (fd, ptr, size);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
277 if (w_ret < 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
278 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
279 if (errno == EINTR || errno == EAGAIN)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
280 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
281 if (request != NULL && request->cancel)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
282 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
283 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
284 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
285 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
286
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
287 continue;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
288 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
289
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
290 if (request != NULL)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
291 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
292 request->logging_function (gftp_logging_error, request,
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
293 _("Error: Could not write to socket: %s\n"),
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
294 g_strerror (errno));
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
295 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
296 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
297
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
298 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
299 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
300
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
301 ptr += w_ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
302 size -= w_ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
303 ret += w_ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
304 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
305 while (size > 0);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
306
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
307 return (ret);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
308 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
309
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
310
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
311 ssize_t
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
312 gftp_writefmt (gftp_request * request, int fd, const char *fmt, ...)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
313 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
314 char *tempstr;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
315 va_list argp;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
316 ssize_t ret;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
317
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
318 va_start (argp, fmt);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
319 tempstr = g_strdup_vprintf (fmt, argp);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
320 va_end (argp);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
321
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
322 ret = request->write_function (request, tempstr, strlen (tempstr), fd);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
323 g_free (tempstr);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
324 return (ret);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
325 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
326
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
327
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
328 int
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
329 gftp_fd_set_sockblocking (gftp_request * request, int fd, int non_blocking)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
330 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
331 int flags;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
332
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
333 g_return_val_if_fail (fd >= 0, GFTP_EFATAL);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
334
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
335 if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
336 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
337 request->logging_function (gftp_logging_error, request,
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
338 _("Cannot get socket flags: %s\n"),
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
339 g_strerror (errno));
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
340 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
341 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
342 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
343
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
344 if (non_blocking)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
345 flags |= O_NONBLOCK;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
346 else
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
347 flags &= ~O_NONBLOCK;
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
348
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
349 if (fcntl (fd, F_SETFL, flags) < 0)
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
350 {
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
351 request->logging_function (gftp_logging_error, request,
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
352 _("Cannot set socket to non-blocking: %s\n"),
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
353 g_strerror (errno));
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
354 gftp_disconnect (request);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
355 return (GFTP_ERETRYABLE);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
356 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
357
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
358 return (0);
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
359 }
c7d7a081cd9c 2008-03-04 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
360
952
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
361
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
362 struct servent *
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
363 r_getservbyname (const char *name, const char *proto,
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
364 struct servent *result_buf, int *h_errnop)
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
365 {
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
366 static GStaticMutex servfunclock = G_STATIC_MUTEX_INIT;
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
367 struct servent *sent;
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
368
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
369 if (g_thread_supported ())
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
370 g_static_mutex_lock (&servfunclock);
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
371
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
372 if ((sent = getservbyname (name, proto)) == NULL)
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
373 {
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
374 if (h_errnop)
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
375 *h_errnop = h_errno;
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
376 }
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
377 else
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
378 {
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
379 *result_buf = *sent;
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
380 sent = result_buf;
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
381 }
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
382
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
383 if (g_thread_supported ())
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
384 g_static_mutex_unlock (&servfunclock);
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
385 return (sent);
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
386 }
a490d94a5b8e 2008-03-28 Brian Masney <masneyb@gftp.org>
masneyb
parents: 950
diff changeset
387