[gridftp-commit] CVS update: MODIFIED: source, globus_i_gwtftp.h, globus_i_gwtftp_server.c ...
John Bresnahan
commit at globus.org
Thu Apr 5 13:04:14 CDT 2007
User: bresnaha
Date: 07/04/05 13:04:14
Modified: gwtftp/source Tag: gfork3 Makefile.am globus_i_gwtftp.c
globus_i_gwtftp.h globus_i_gwtftp_cmd.c
globus_i_gwtftp_server.c
Added: gwtftp/source Tag: gfork3 globus_i_gwtftp_data.c
Log:
Data channel routing when in passive mode works. There are some
semi-hardcoded security attributes that should be cleaned up.
Revision Changes Path
No revision
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/Tag:
No revision
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/gfork3
1.1.2.2 +1 -0 gridftp/gwtftp/source/Attic/Makefile.am
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/Makefile.am.diff?r1=1.1.2.1&r2=1.1.2.2
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Makefile.am
===================================================================
RCS file: /home/globdev/CVS/globus-packages/gridftp/gwtftp/source/Attic/Makefile.am,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -b -r1.1.2.1 -r1.1.2.2
--- Makefile.am 31 Mar 2007 00:01:58 -0000 1.1.2.1
+++ Makefile.am 5 Apr 2007 18:04:14 -0000 1.1.2.2
@@ -10,6 +10,7 @@
globus_i_gwtftp_client.c \
globus_i_gwtftp_server.c \
globus_i_gwtftp_cmd.c \
+ globus_i_gwtftp_data.c \
globus_i_gwtftp_opts.c
1.1.2.4 +21 -1 gridftp/gwtftp/source/Attic/globus_i_gwtftp.c
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/globus_i_gwtftp.c.diff?r1=1.1.2.3&r2=1.1.2.4
(In the diff below, changes in quantity of whitespace are not shown.)
Index: globus_i_gwtftp.c
===================================================================
RCS file: /home/globdev/CVS/globus-packages/gridftp/gwtftp/source/Attic/globus_i_gwtftp.c,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -b -r1.1.2.3 -r1.1.2.4
--- globus_i_gwtftp.c 4 Apr 2007 06:08:33 -0000 1.1.2.3
+++ globus_i_gwtftp.c 5 Apr 2007 18:04:14 -0000 1.1.2.4
@@ -6,9 +6,14 @@
* it hands the new connection to connect.c for the FTP handlshake processing
*/
+globus_xio_driver_t gwtftp_l_tcp_driver;
+globus_xio_driver_t gwtftp_l_gsi_driver;
+globus_xio_stack_t gwtftp_l_data_tcp_stack;
+globus_xio_stack_t gwtftp_l_data_gsi_stack;
+
+static globus_xio_stack_t gwtftp_l_client_stack;
static globus_xio_stack_t gwtftp_l_server_stack;
static globus_xio_stack_t gwtftp_l_client_stack;
-static globus_xio_driver_t gwtftp_l_tcp_driver;
static globus_xio_driver_t gwtftp_l_telnet_driver;
static globus_xio_driver_t gwtftp_l_gssapi_driver;
static globus_xio_server_t gwtftp_l_server;
@@ -156,6 +161,8 @@
globus_xio_stack_init(&gwtftp_l_server_stack, NULL);
globus_xio_stack_init(&gwtftp_l_client_stack, NULL);
+ globus_xio_stack_init(&gwtftp_l_data_tcp_stack, NULL);
+ globus_xio_stack_init(&gwtftp_l_data_gsi_stack, NULL);
result = globus_xio_driver_load("tcp", &gwtftp_l_tcp_driver);
if(result != GLOBUS_SUCCESS)
@@ -172,6 +179,11 @@
{
goto error_gss_load;
}
+ result = globus_xio_driver_load("gsi", &gwtftp_l_gsi_driver);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_gss_load;
+ }
result = globus_xio_stack_push_driver(
gwtftp_l_client_stack, gwtftp_l_tcp_driver);
@@ -198,6 +210,14 @@
{
goto error_server_gss_push;
}
+
+ result = globus_xio_stack_push_driver(
+ gwtftp_l_data_tcp_stack, gwtftp_l_tcp_driver);
+ result = globus_xio_stack_push_driver(
+ gwtftp_l_data_gsi_stack, gwtftp_l_tcp_driver);
+ result = globus_xio_stack_push_driver(
+ gwtftp_l_data_gsi_stack, gwtftp_l_gsi_driver);
+
return GLOBUS_SUCCESS;
error_server_gss_push:
1.1.2.3 +38 -0 gridftp/gwtftp/source/Attic/globus_i_gwtftp.h
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/globus_i_gwtftp.h.diff?r1=1.1.2.2&r2=1.1.2.3
(In the diff below, changes in quantity of whitespace are not shown.)
Index: globus_i_gwtftp.h
===================================================================
RCS file: /home/globdev/CVS/globus-packages/gridftp/gwtftp/source/Attic/globus_i_gwtftp.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -b -r1.1.2.2 -r1.1.2.3
--- globus_i_gwtftp.h 1 Apr 2007 05:39:27 -0000 1.1.2.2
+++ globus_i_gwtftp.h 5 Apr 2007 18:04:14 -0000 1.1.2.3
@@ -7,6 +7,7 @@
#include "globus_xio_telnet.h"
#include "globus_xio_gssapi_ftp.h"
#include "globus_error_generic.h"
+#include "globus_xio_gsi.h"
#if !defined(GLOBUS_I_FTP2GRID_H)
#define GLOBUS_I_FTP2GRID_H 1
@@ -68,6 +69,38 @@
globus_list_t * ip_list;
} globus_i_gwtftp_cmd_opts_t;
+typedef struct gwtftp_l_data_s
+{
+ globus_xio_stack_t active_stack;
+ globus_xio_stack_t passive_stack;
+ globus_xio_server_t server;
+ globus_xio_handle_t passive_xio;
+ globus_xio_handle_t active_xio;
+ globus_mutex_t mutex;
+ globus_byte_t * active_buffer;
+ globus_byte_t * passive_buffer;
+ globus_result_t error_result;
+ globus_size_t buffer_size;
+ globus_xio_callback_t close_cb;
+ void * user_arg;
+ int state;
+ char * active_cs;
+} gwtftp_i_data_t;
+
+globus_result_t
+gwtftp_i_data_new(
+ gwtftp_i_data_t ** out_handle,
+ globus_xio_stack_t active_stack,
+ globus_xio_stack_t passive_stack,
+ char * active_cs,
+ char ** out_passive_cs,
+ globus_xio_callback_t close_cb,
+ void * user_arg);
+
+void
+gwtftp_i_data_close(
+ gwtftp_i_data_t * data_h);
+
globus_result_t
globus_gwtftp_new_session(
globus_xio_handle_t client_xio,
@@ -119,4 +152,9 @@
void
gwtftp_i_server_init();
+extern globus_xio_driver_t gwtftp_l_tcp_driver;
+extern globus_xio_driver_t gwtftp_l_gsi_driver;
+extern globus_xio_stack_t gwtftp_l_data_tcp_stack;
+extern globus_xio_stack_t gwtftp_l_data_gsi_stack;
+
#endif
1.1.2.4 +90 -89 gridftp/gwtftp/source/Attic/globus_i_gwtftp_cmd.c
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/globus_i_gwtftp_cmd.c.diff?r1=1.1.2.3&r2=1.1.2.4
(In the diff below, changes in quantity of whitespace are not shown.)
Index: globus_i_gwtftp_cmd.c
===================================================================
RCS file: /home/globdev/CVS/globus-packages/gridftp/gwtftp/source/Attic/globus_i_gwtftp_cmd.c,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -b -r1.1.2.3 -r1.1.2.4
--- globus_i_gwtftp_cmd.c 4 Apr 2007 06:08:33 -0000 1.1.2.3
+++ globus_i_gwtftp_cmd.c 5 Apr 2007 18:04:14 -0000 1.1.2.4
@@ -4,7 +4,6 @@
{
globus_xio_handle_t read_xio;
globus_xio_handle_t write_xio;
- globus_bool_t data_listening;
globus_fifo_t write_q;
globus_bool_t outstanding_write;
struct gwtftp_l_connection_pair_s * whos_my_daddy;
@@ -17,7 +16,8 @@
globus_mutex_t mutex;
int ref;
globus_bool_t closing;
- globus_xio_server_t data_server;
+ globus_bool_t data_listening;
+ gwtftp_i_data_t * data;
} gwtftp_l_connection_pair_t;
typedef struct gwtftp_l_write_ent_s
@@ -54,7 +54,7 @@
static
globus_bool_t
-gwtftp_l_pasv(
+gwtftp_l_pasv227(
gwtftp_l_connection_t * conn,
globus_byte_t * buffer,
globus_size_t len);
@@ -79,7 +79,7 @@
static gwtftp_l_command_ent_t gwtftp_l_cmd_table[] =
{
- {"PASV", gwtftp_l_pasv},
+ {"227", gwtftp_l_pasv227},
{"221", gwtftp_l_quit},
{NULL, gwtftp_l_route}
};
@@ -220,7 +220,8 @@
for(i = 0; gwtftp_l_cmd_table[i].name != NULL; i++)
{
- if(strncmp(gwtftp_l_cmd_table[i].name, name, len) == 0)
+ if(strncmp(gwtftp_l_cmd_table[i].name, name,
+ strlen(gwtftp_l_cmd_table[i].name)) == 0)
{
return &gwtftp_l_cmd_table[i];
}
@@ -321,10 +322,14 @@
{
int sc;
char * tmp_ptr;
+ char * cs;
+ int host[4];
+ int hi;
+ int low;
if(type == 1)
{
- tmp_ptr = memchr(buffer, '(', nbytes);
+ tmp_ptr = memchr(reply, '(', len);
if(tmp_ptr == NULL)
{
goto error;
@@ -340,7 +345,7 @@
{
goto error;
}
- cs = globus_common_string_create("%d.%d.%d.%d:%d",
+ cs = globus_common_create_string("%d.%d.%d.%d:%d",
host[0], host[1], host[2], host[3], hi*256+low);
}
else
@@ -359,45 +364,95 @@
char *
gwtftp_l_pasv_cs_to_reply(
int type,
- char * reply,
+ char * cs,
globus_size_t len)
{
+ char * reply;
+ char * tmp_ptr;
+ char * port_str;
+ int sc;
+ int port;
+ int i;
+ int hi;
+ int low;
+
+ if(type == 1)
+ {
+ tmp_ptr = strchr(cs, ':');
+ if(tmp_ptr == NULL)
+ {
+ return NULL;
+ }
+ *tmp_ptr = '\0';
+ tmp_ptr++;
+ port_str = tmp_ptr;
+ sc = sscanf(port_str, "%d", &port);
+ if(sc != 1)
+ {
+ return NULL;
+ }
+ hi = port / 256;
+ low = port % 256;
+
+ reply = globus_common_create_string(
+ "227 Entering Passive Mode (%s,%d,%d)\r\n",
+ cs, hi, low);
+
+ for(i = 0; i < 3; i++)
+ {
+ tmp_ptr = strchr(reply, '.');
+ if(tmp_ptr == NULL)
+ {
+ goto error_dots;
+ }
+ *tmp_ptr = ',';
+ }
+
+ return reply;
+ }
+ return NULL;
+error_dots:
+ globus_free(reply);
+ return NULL;
}
static
-void
-gwtftp_l_pasv_read_cb(
- globus_xio_handle_t handle,
- globus_result_t result,
+globus_bool_t
+gwtftp_l_pasv227(
+ gwtftp_l_connection_t * conn,
globus_byte_t * buffer,
- globus_size_t len,
- globus_size_t nbytes,
- globus_xio_data_descriptor_t data_desc,
- void * user_arg)
+ globus_size_t len)
{
+ globus_result_t result;
gwtftp_l_connection_pair_t * conn_pair;
- gwtftp_l_connection_t * conn;
char * passive_cs;
+ char * cs;
+ char * reply;
+ globus_bool_t post;
+ int type = 1;
- conn = (gwtftp_l_connection_t *) user_arg;
conn_pair = conn->whos_my_daddy;
- globus_mutex_lock(&conn_pair->mutex);
- {
- if(result != GLOBUS_SUCCESS)
- {
- goto error;
- }
-
cs = gwtftp_l_pasv_reply_to_cs(type, buffer, len);
if(cs == NULL)
{
/* forward through */
}
+
+ /* create a listener */
+ if(conn_pair->data_listening)
+ {
+ conn_pair->data_listening = GLOBUS_FALSE;
+ /* close the open server */
+ gwtftp_i_data_close(conn_pair->data);
+ }
+
/* parse passive response */
result = gwtftp_i_data_new(
- &conn_pair->data_h,
+ &conn_pair->data,
+ gwtftp_l_data_gsi_stack,
+ gwtftp_l_data_tcp_stack,
cs,
&passive_cs,
gwtftp_l_error_close_cb,
@@ -416,66 +471,12 @@
goto error;
}
/* form new message */
- post = wtftp_l_route(conn_pair->s2c, reply, strlen(reply));
- if(post)
- {
- result = globus_xio_register_read(
- conn->read_xio,
- FAKE_BUFFER,
- FAKE_BUFFER_LENGTH,
- FAKE_BUFFER_LENGTH,
- NULL,
- gwtftp_l_read_cb,
- conn);
- if(result != GLOBUS_SUCCESS)
- {
- goto error_post;
- }
- }
- }
- globus_mutex_unlock(&conn_pair->mutex);
- return;
+ post = gwtftp_l_route(&conn_pair->s2c, reply, strlen(reply));
+
+ return post;
error:
gwtftp_l_error(conn_pair, result);
- globus_mutex_unlock(&conn_pair->mutex);
-}
-static
-globus_bool_t
-gwtftp_l_pasv(
- gwtftp_l_connection_t * conn,
- globus_byte_t * buffer,
- globus_size_t len)
-{
- gwtftp_l_connection_pair_t * conn_pair;
-
- if(result != GLOBUS_SUCCESS)
- {
- goto error;
- }
- conn_pair = conn->whos_my_daddy;
- /* create a listener */
- if(conn_pair->data_listening)
- {
- /* close the open server */
- }
- result = globus_xio_register_read(
- conn->read_xio,
- FAKE_BUFFER,
- FAKE_BUFFER_LENGTH,
- FAKE_BUFFER_LENGTH,
- NULL,
- gwtftp_l_pasv_read_cb,
- conn);
- if(result != GLOBUS_SUCCESS)
- {
- goto error_post;
- }
- return GLOBUS_FALSE;
-
-error_post:
-error:
- gwtftp_l_error(conn->whos_my_daddy, result);
return GLOBUS_FALSE;
}
@@ -577,7 +578,7 @@
tmp_ptr = memchr(buffer, ' ', nbytes);
len = tmp_ptr - (char *)buffer;
/* Look up the command */
- cmd_ent = gwtftp_l_command_lookup(buffer, len);
+ cmd_ent = gwtftp_l_command_lookup(buffer, nbytes);
post = cmd_ent->handler(conn, buffer, nbytes);
1.1.2.4 +4 -2 gridftp/gwtftp/source/Attic/globus_i_gwtftp_server.c
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/globus_i_gwtftp_server.c.diff?r1=1.1.2.3&r2=1.1.2.4
(In the diff below, changes in quantity of whitespace are not shown.)
Index: globus_i_gwtftp_server.c
===================================================================
RCS file: /home/globdev/CVS/globus-packages/gridftp/gwtftp/source/Attic/globus_i_gwtftp_server.c,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -b -r1.1.2.3 -r1.1.2.4
--- globus_i_gwtftp_server.c 4 Apr 2007 06:08:33 -0000 1.1.2.3
+++ globus_i_gwtftp_server.c 5 Apr 2007 18:04:14 -0000 1.1.2.4
@@ -502,6 +502,8 @@
gwtftp_i_server_init()
{
globus_fifo_init(&gwtftp_l_open_cmd_q);
- globus_fifo_enqueue(&gwtftp_l_open_cmd_q, "DCAU N\r\n");
+ /*globus_fifo_enqueue(&gwtftp_l_open_cmd_q, "DCAU N\r\n"); */
+
+ /* gotta have at least 1 in the list. STAT is fine */
globus_fifo_enqueue(&gwtftp_l_open_cmd_q, "STAT\r\n");
}
No revision
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/Tag:
No revision
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/gfork3
1.1.2.1 +548 -0 gridftp/gwtftp/source/Attic/globus_i_gwtftp_data.c
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gwtftp/source/globus_i_gwtftp_data.c.diff?r1=1.1&r2=1.1.2.1
(In the diff below, changes in quantity of whitespace are not shown.)
Index: globus_i_gwtftp_data.c
===================================================================
RCS file: globus_i_gwtftp_data.c
diff -N globus_i_gwtftp_data.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ globus_i_gwtftp_data.c 5 Apr 2007 18:04:14 -0000 1.1.2.1
@@ -0,0 +1,548 @@
+#include "globus_i_gwtftp.h"
+
+#define GWTFTP_BUFFER_SIZE (1024*1024)
+
+enum
+{
+ GWTFTP_DATA_STATE_NONE,
+ GWTFTP_DATA_STATE_ACCEPTING,
+ GWTFTP_DATA_STATE_SEVER_CLOSING,
+ GWTFTP_DATA_STATE_PASSIVE_OPENING,
+ GWTFTP_DATA_STATE_ACTIVE_OPENING,
+ GWTFTP_DATA_STATE_OPEN,
+ GWTFTP_DATA_STATE_CLOSING
+};
+
+static
+void
+gwtftp_l_data_read_cb(
+ globus_xio_handle_t handle,
+ globus_result_t result,
+ globus_byte_t * buffer,
+ globus_size_t len,
+ globus_size_t nbytes,
+ globus_xio_data_descriptor_t data_desc,
+ void * user_arg);
+
+/* closing logic */
+
+static
+void
+gwtftp_l_data_passive_close_cb(
+ globus_xio_handle_t handle,
+ globus_result_t result,
+ void * user_arg)
+{
+ gwtftp_i_data_t * data_h;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+
+ data_h->close_cb(handle, data_h->error_result, data_h->user_arg);
+
+ globus_free(data_h->active_buffer);
+ globus_free(data_h->passive_buffer);
+ globus_free(data_h);
+}
+
+static
+void
+gwtftp_l_data_server_error_close_cb(
+ globus_xio_server_t server,
+ void * user_arg)
+{
+ gwtftp_i_data_t * data_h;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+
+ gwtftp_l_data_passive_close_cb(NULL, data_h->error_result, user_arg);
+}
+
+static
+void
+gwtftp_l_data_active_close_cb(
+ globus_xio_handle_t handle,
+ globus_result_t result,
+ void * user_arg)
+{
+ gwtftp_i_data_t * data_h;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+
+ result = globus_xio_register_close(
+ data_h->passive_xio,
+ NULL,
+ gwtftp_l_data_passive_close_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ /* goto it directly */
+ gwtftp_l_data_passive_close_cb(data_h->passive_xio, result, data_h);
+ }
+}
+
+void
+gwtftp_l_data_close(
+ gwtftp_i_data_t * data_h)
+{
+ globus_xio_callback_t close_cb = NULL;
+ globus_result_t result;
+
+ globus_mutex_lock(&data_h->mutex);
+ {
+ switch(data_h->state)
+ {
+ case GWTFTP_DATA_STATE_ACCEPTING:
+ result = globus_xio_server_register_close(
+ data_h->server,
+ gwtftp_l_data_server_error_close_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ close_cb = gwtftp_l_data_passive_close_cb;
+ }
+ data_h->state = GWTFTP_DATA_STATE_CLOSING;
+
+ break;
+
+ case GWTFTP_DATA_STATE_PASSIVE_OPENING:
+ case GWTFTP_DATA_STATE_SEVER_CLOSING:
+ result = globus_xio_register_close(
+ data_h->passive_xio,
+ NULL,
+ gwtftp_l_data_passive_close_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ close_cb = gwtftp_l_data_passive_close_cb;
+ }
+ data_h->state = GWTFTP_DATA_STATE_CLOSING;
+ break;
+
+ case GWTFTP_DATA_STATE_OPEN:
+ case GWTFTP_DATA_STATE_ACTIVE_OPENING:
+
+ result = globus_xio_register_close(
+ data_h->active_xio,
+ NULL,
+ gwtftp_l_data_active_close_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ close_cb = gwtftp_l_data_active_close_cb;
+ }
+ data_h->state = GWTFTP_DATA_STATE_CLOSING;
+ break;
+
+ case GWTFTP_DATA_STATE_CLOSING:
+ break;
+ }
+ }
+ globus_mutex_unlock(&data_h->mutex);
+
+ if(close_cb)
+ {
+ close_cb(NULL, result, data_h);
+ }
+}
+
+void
+gwtftp_i_data_close_oneshot_cb(
+ void * user_arg)
+{
+ gwtftp_i_data_t * data_h;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+
+ globus_mutex_lock(&data_h->mutex);
+ {
+ gwtftp_l_data_close(data_h);
+ }
+ globus_mutex_unlock(&data_h->mutex);
+}
+
+void
+gwtftp_i_data_close(
+ gwtftp_i_data_t * data_h)
+{
+ globus_callback_register_oneshot(
+ NULL,
+ NULL,
+ gwtftp_i_data_close_oneshot_cb,
+ data_h);
+}
+
+
+/* data logic */
+static
+void
+gwtftp_l_data_write_cb(
+ globus_xio_handle_t handle,
+ globus_result_t result,
+ globus_byte_t * buffer,
+ globus_size_t len,
+ globus_size_t nbytes,
+ globus_xio_data_descriptor_t data_desc,
+ void * user_arg)
+{
+ globus_xio_handle_t xio_h;
+ gwtftp_i_data_t * data_h;
+ globus_byte_t * buf;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+ globus_mutex_lock(&data_h->mutex);
+ {
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error;
+ }
+ /* determine the handle */
+ if(data_h->active_xio == handle)
+ {
+ xio_h = data_h->passive_xio;
+ buf = data_h->passive_buffer;
+ }
+ else if(data_h->passive_xio == handle)
+ {
+ xio_h = data_h->active_xio;
+ buf = data_h->active_buffer;
+ }
+
+ result = globus_xio_register_read(
+ xio_h,
+ buf,
+ data_h->buffer_size,
+ data_h->buffer_size,
+ NULL,
+ gwtftp_l_data_read_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_post;
+ }
+ }
+ globus_mutex_unlock(&data_h->mutex);
+ return;
+error_post:
+error:
+ data_h->error_result = result;
+ gwtftp_l_data_close(data_h);
+ globus_mutex_unlock(&data_h->mutex);
+}
+
+static
+void
+gwtftp_l_data_read_cb(
+ globus_xio_handle_t handle,
+ globus_result_t result,
+ globus_byte_t * buffer,
+ globus_size_t len,
+ globus_size_t nbytes,
+ globus_xio_data_descriptor_t data_desc,
+ void * user_arg)
+{
+ globus_xio_handle_t xio_h;
+ gwtftp_i_data_t * data_h;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+
+ globus_mutex_lock(&data_h->mutex);
+ {
+ if(result != GLOBUS_SUCCESS && nbytes <= 0)
+ {
+ /* error on read is fine, could be just eof */
+ goto error;
+ }
+
+ /* determine the handle */
+ if(data_h->active_xio == handle)
+ {
+ xio_h = data_h->passive_xio;
+ }
+ else
+ {
+ xio_h = data_h->active_xio;
+ }
+
+ result = globus_xio_register_write(
+ xio_h,
+ buffer,
+ nbytes,
+ nbytes,
+ NULL,
+ gwtftp_l_data_write_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_post;
+ }
+ }
+ globus_mutex_unlock(&data_h->mutex);
+ return;
+error_post:
+error:
+ data_h->error_result = result;
+ gwtftp_l_data_close(data_h);
+ globus_mutex_unlock(&data_h->mutex);
+}
+
+/* establishment logic */
+static
+void
+gwtftp_l_data_active_open_cb(
+ globus_xio_handle_t handle,
+ globus_result_t result,
+ void * user_arg)
+{
+ gwtftp_i_data_t * data_h;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+
+ globus_mutex_lock(&data_h->mutex);
+ {
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error;
+ }
+ data_h->state = GWTFTP_DATA_STATE_OPEN;
+
+ /* start the works */
+ result = globus_xio_register_read(
+ data_h->active_xio,
+ data_h->active_buffer,
+ data_h->buffer_size,
+ data_h->buffer_size,
+ NULL,
+ gwtftp_l_data_read_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error;
+ }
+
+ result = globus_xio_register_read(
+ data_h->passive_xio,
+ data_h->passive_buffer,
+ data_h->buffer_size,
+ data_h->buffer_size,
+ NULL,
+ gwtftp_l_data_read_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error;
+ }
+ }
+ globus_mutex_unlock(&data_h->mutex);
+ return;
+error:
+ data_h->error_result = result;
+ gwtftp_l_data_close(data_h);
+ globus_mutex_unlock(&data_h->mutex);
+}
+
+static
+void
+gwtftp_l_data_passive_open_cb(
+ globus_xio_handle_t handle,
+ globus_result_t result,
+ void * user_arg)
+{
+ gwtftp_i_data_t * data_h;
+ globus_xio_attr_t xio_attr;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+
+ globus_mutex_lock(&data_h->mutex);
+ {
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_param;
+ }
+
+ result = globus_xio_handle_create(
+ &data_h->active_xio, data_h->active_stack);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_create;
+ }
+
+ globus_xio_attr_init(&xio_attr);
+ /* ignore return. allow gsi driver to not b e on stack */
+ globus_xio_attr_cntl(xio_attr, gwtftp_l_gsi_driver,
+ GLOBUS_XIO_GSI_SET_AUTHORIZATION_MODE,
+ GLOBUS_XIO_GSI_SELF_AUTHORIZATION);
+ globus_xio_attr_cntl(xio_attr, gwtftp_l_gsi_driver,
+ GLOBUS_XIO_GSI_SET_DELEGATION_MODE,
+ GLOBUS_XIO_GSI_DELEGATION_MODE_NONE);
+ globus_xio_attr_cntl(xio_attr, gwtftp_l_gsi_driver,
+ GLOBUS_XIO_GSI_SET_PROTECTION_LEVEL,
+ GLOBUS_XIO_GSI_PROTECTION_LEVEL_NONE);
+ result = globus_xio_register_open(
+ data_h->active_xio,
+ data_h->active_cs,
+ xio_attr,
+ gwtftp_l_data_active_open_cb,
+ data_h);
+ globus_xio_attr_destroy(xio_attr);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_open;
+ }
+ data_h->state = GWTFTP_DATA_STATE_ACTIVE_OPENING;
+ }
+ globus_mutex_unlock(&data_h->mutex);
+
+ return;
+error_open:
+ globus_xio_register_close(data_h->active_xio, NULL, NULL, NULL);
+error_create:
+error_param:
+ data_h->error_result = result;
+ gwtftp_l_data_close(data_h);
+ globus_mutex_unlock(&data_h->mutex);
+}
+
+static
+void
+gwtftp_l_data_server_close_cb(
+ globus_xio_server_t server,
+ void * user_arg)
+{
+ gwtftp_i_data_t * data_h;
+ globus_result_t result;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+
+ globus_mutex_lock(&data_h->mutex);
+ {
+ data_h->state = GWTFTP_DATA_STATE_PASSIVE_OPENING;
+ result = globus_xio_register_open(
+ data_h->passive_xio,
+ NULL,
+ NULL,
+ gwtftp_l_data_passive_open_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_open;
+ }
+ }
+ globus_mutex_unlock(&data_h->mutex);
+
+ return;
+error_open:
+ data_h->error_result = result;
+ gwtftp_l_data_close(data_h);
+ globus_mutex_unlock(&data_h->mutex);
+}
+
+static
+void
+gwtftp_l_data_accept_cb(
+ globus_xio_server_t server,
+ globus_xio_handle_t handle,
+ globus_result_t result,
+ void * user_arg)
+{
+ gwtftp_i_data_t * data_h;
+
+ data_h = (gwtftp_i_data_t *) user_arg;
+
+ globus_mutex_lock(&data_h->mutex);
+ {
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error;
+ }
+ else
+ {
+ data_h->state = GWTFTP_DATA_STATE_SEVER_CLOSING;
+ data_h->passive_xio = handle;
+ result = globus_xio_server_register_close(
+ data_h->server,
+ gwtftp_l_data_server_close_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error;
+ }
+ }
+ }
+ globus_mutex_unlock(&data_h->mutex);
+
+ return;
+error:
+ data_h->error_result = result;
+ gwtftp_l_data_close(data_h);
+ globus_mutex_unlock(&data_h->mutex);
+}
+
+globus_result_t
+gwtftp_i_data_new(
+ gwtftp_i_data_t ** out_handle,
+ globus_xio_stack_t active_stack,
+ globus_xio_stack_t passive_stack,
+ char * active_cs,
+ char ** out_passive_cs,
+ globus_xio_callback_t close_cb,
+ void * user_arg)
+{
+ gwtftp_i_data_t * data_h;
+ globus_result_t result;
+ char * cs;
+
+ data_h = (gwtftp_i_data_t *)globus_calloc(1, sizeof(gwtftp_i_data_t));
+ if(data_h == NULL)
+ {
+ goto error_mem;
+ }
+ data_h->close_cb = close_cb;
+ data_h->user_arg = user_arg;
+ data_h->state = GWTFTP_DATA_STATE_ACCEPTING;
+ data_h->buffer_size = GWTFTP_BUFFER_SIZE;
+ data_h->active_buffer = globus_malloc(data_h->buffer_size);
+ data_h->passive_buffer = globus_malloc(data_h->buffer_size);
+ data_h->active_stack = active_stack;
+ data_h->passive_stack = passive_stack;
+
+ result = globus_xio_server_create(
+ &data_h->server, NULL, data_h->passive_stack);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_create;
+ }
+
+ result = globus_xio_server_cntl(
+ data_h->server,
+ gwtftp_l_tcp_driver,
+ GLOBUS_XIO_TCP_GET_LOCAL_NUMERIC_CONTACT,
+ &cs);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_cntl;
+ }
+
+ result = globus_xio_server_register_accept(
+ data_h->server,
+ gwtftp_l_data_accept_cb,
+ data_h);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error_accept;
+ }
+ data_h->active_cs = active_cs;
+ *out_passive_cs = cs;
+ *out_handle = data_h;
+
+ return GLOBUS_SUCCESS;
+
+error_accept:
+ globus_xio_server_register_close(data_h->server, NULL, NULL);
+ globus_free(cs);
+error_cntl:
+error_create:
+ globus_free(data_h);
+error_mem:
+
+ return result;
+}
More information about the gridftp-commit
mailing list