[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