17 #if !defined(GLOBUS_I_GRIDFTP_SERVER_CONTROL_H)
18 #define GLOBUS_I_GRIDFTP_SERVER_CONTROL_H 1
20 #include "globus_gridftp_server_control.h"
21 #include "globus_xio.h"
22 #include "globus_xio_system.h"
24 #include "globus_xio_pipe_driver.h"
26 #include "globus_xio_gssapi_ftp.h"
28 #define GLOBUS_GRIDFTP_VERSION_CTL 1
30 GlobusDebugDeclare(GLOBUS_GRIDFTP_SERVER_CONTROL);
32 #define GlobusGSDebugPrintf(level, message) \
33 GlobusDebugPrintf(GLOBUS_GRIDFTP_SERVER_CONTROL, level, message)
35 #define GlobusGridFTPServerDebugEnter() \
36 GlobusGSDebugPrintf( \
37 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE, \
38 ("[%s] Entering\n", _gridftp_server_name))
40 #define GlobusGridFTPServerDebugExit() \
41 GlobusGSDebugPrintf( \
42 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE, \
43 ("[%s] Exiting\n", _gridftp_server_name))
45 #define GlobusGridFTPServerDebugExitWithError() \
46 GlobusGSDebugPrintf( \
47 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE, \
48 ("[%s] Exiting with error\n", _gridftp_server_name))
50 #define GlobusGridFTPServerDebugInternalEnter() \
51 GlobusGSDebugPrintf( \
52 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE, \
53 ("[%s] I Entering\n", _gridftp_server_name))
55 #define GlobusGridFTPServerDebugInternalExit() \
56 GlobusGSDebugPrintf( \
57 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE, \
58 ("[%s] I Exiting\n", _gridftp_server_name))
60 #define GlobusGridFTPServerDebugInternalExitWithError() \
61 GlobusGSDebugPrintf( \
62 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE, \
63 ("[%s] I Exiting with error\n", _gridftp_server_name))
65 #define GlobusGridFTPServerDebugVerboseEnter() \
66 GlobusGSDebugPrintf( \
67 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE, \
68 ("[%s] V Entering\n", _gridftp_server_name))
70 #define GlobusGridFTPServerDebugVerboseExit() \
71 GlobusGSDebugPrintf( \
72 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE, \
73 ("[%s] V Exiting\n", _gridftp_server_name))
75 #define GlobusGridFTPServerDebugVerboseExitWithError() \
76 GlobusGSDebugPrintf( \
77 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE, \
78 ("[%s] V Exiting with error\n", _gridftp_server_name))
80 #define GlobusGridFTPServerDebugCommand(cmd) \
81 GlobusGSDebugPrintf( \
82 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_COMMANDS, \
83 ("### [%s] Received command: %s\n", _gridftp_server_name, cmd))
85 struct globus_i_gs_attr_s;
87 typedef enum globus_i_gsc_debug_levels_e
89 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_ERROR = 1,
90 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_WARNING = 2,
91 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE = 4,
92 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE = 8,
93 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_COMMANDS = 16,
94 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE = 32,
95 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_STATE = 64
96 } globus_i_gsc_debug_levels_t;
98 typedef enum globus_i_gsc_error_type_e
100 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_PARAMETER,
101 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_STATE,
102 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_MEMORY,
103 GLOBUS_GRIDFTP_SERVER_CONTROL_NO_AUTH,
104 GLOBUS_GRIDFTP_SERVER_CONTROL_POST_AUTH,
105 GLOBUS_GRIDFTP_SERVER_CONTROL_NO_COMMAND,
106 GLOBUS_GRIDFTP_SERVER_CONTROL_MALFORMED_COMMAND
107 } globus_i_gsc_error_type_t;
109 typedef enum globus_i_gsc_mlsx_fact_e
111 GLOBUS_GSC_MLSX_FACT_TYPE =
'T',
112 GLOBUS_GSC_MLSX_FACT_MODIFY =
'M',
113 GLOBUS_GSC_MLSX_FACT_CHARSET =
'C',
114 GLOBUS_GSC_MLSX_FACT_SIZE =
'S',
115 GLOBUS_GSC_MLSX_FACT_PERM =
'P',
116 GLOBUS_GSC_MLSX_FACT_UNIXMODE =
'U',
117 GLOBUS_GSC_MLSX_FACT_UNIXOWNER =
'O',
118 GLOBUS_GSC_MLSX_FACT_UNIXGROUP =
'G',
119 GLOBUS_GSC_MLSX_FACT_UNIQUE =
'Q',
120 GLOBUS_GSC_MLSX_FACT_UNIXSLINK =
'L',
121 GLOBUS_GSX_MLSX_FACT_UNIXUID =
'I',
122 GLOBUS_GSX_MLSX_FACT_UNIXGID =
'D',
123 GLOBUS_GSC_MLSX_FACT_XCOUNT =
'N',
124 GLOBUS_GSC_MLSX_FACT_XABSPATH =
'A'
125 } globus_i_gsc_mlsx_fact_t;
129 GLOBUS_L_GSC_DATA_OBJ_READY = 1,
130 GLOBUS_L_GSC_DATA_OBJ_DESTROY_WAIT,
131 GLOBUS_L_GSC_DATA_OBJ_DESTROYING,
132 GLOBUS_L_GSC_DATA_OBJ_INUSE
133 } globus_l_gsc_data_obj_state_t;
136 (*globus_i_gsc_auth_cb_t)(
137 struct globus_i_gsc_op_s * op,
138 globus_gridftp_server_control_response_t response_type,
143 (*globus_i_gsc_resource_cb_t)(
144 struct globus_i_gsc_op_s * op,
145 globus_gridftp_server_control_response_t response_type,
155 (*globus_i_gsc_passive_cb_t)(
156 struct globus_i_gsc_op_s * op,
157 globus_gridftp_server_control_response_t response_type,
164 (*globus_i_gsc_port_cb_t)(
165 struct globus_i_gsc_op_s * op,
166 globus_gridftp_server_control_response_t response_type,
171 (*globus_i_gsc_transfer_cb_t)(
172 struct globus_i_gsc_op_s * op,
173 globus_gridftp_server_control_response_t response_type,
177 typedef struct globus_i_gsc_data_s
179 globus_l_gsc_data_obj_state_t state;
180 struct globus_i_gsc_server_handle_s * server_handle;
183 globus_gridftp_server_control_data_dir_t dir;
185 } globus_i_gsc_data_t;
187 typedef enum globus_i_gsc_op_type_e
189 GLOBUS_L_GSC_OP_TYPE_AUTH,
190 GLOBUS_L_GSC_OP_TYPE_RESOURCE,
191 GLOBUS_L_GSC_OP_TYPE_CREATE_PASV,
192 GLOBUS_L_GSC_OP_TYPE_CREATE_PORT,
193 GLOBUS_L_GSC_OP_TYPE_SEND,
194 GLOBUS_L_GSC_OP_TYPE_RECV,
195 GLOBUS_L_GSC_OP_TYPE_DESTROY,
196 GLOBUS_L_GSC_OP_TYPE_LIST,
197 GLOBUS_L_GSC_OP_TYPE_NLST,
198 GLOBUS_L_GSC_OP_TYPE_MLSD,
199 GLOBUS_L_GSC_OP_TYPE_MLSR
200 } globus_i_gsc_op_type_t;
202 typedef struct globus_i_gsc_event_data_s
204 globus_l_gsc_data_obj_state_t state;
213 globus_gridftp_server_control_event_cb_t user_cb;
216 globus_off_t * stripe_total;
217 } globus_i_gsc_event_data_t;
219 typedef struct globus_i_gsc_handle_opts_s
221 char mlsx_fact_str[16];
230 int retr_perf_frequency;
231 int restart_frequency;
232 globus_gsc_layout_t layout;
234 int mlsr_traversal_options;
235 } globus_i_gsc_handle_opts_t;
237 typedef struct globus_i_gsc_module_func_s
240 globus_gridftp_server_control_transfer_cb_t func;
242 } globus_i_gsc_module_func_t;
244 typedef struct globus_i_gsc_user_funcs_s
246 globus_hashtable_t send_cb_table;
247 globus_hashtable_t recv_cb_table;
248 globus_gridftp_server_control_transfer_cb_t default_send_cb;
249 void * default_send_arg;
250 globus_gridftp_server_control_transfer_cb_t default_recv_cb;
251 void * default_recv_arg;
252 globus_gridftp_server_control_auth_cb_t auth_cb;
254 globus_gridftp_server_control_passive_connect_cb_t passive_cb;
256 globus_gridftp_server_control_active_connect_cb_t active_cb;
258 globus_gridftp_server_control_data_destroy_cb_t data_destroy_cb;
259 void * data_destroy_arg;
260 globus_gridftp_server_control_list_cb_t list_cb;
262 globus_gridftp_server_control_resource_cb_t resource_cb;
264 globus_gridftp_server_control_cb_t done_cb;
266 globus_gridftp_server_control_log_cb_t log_func;
269 } globus_i_gsc_user_funcs_t;
271 typedef struct globus_i_gsc_op_s
273 globus_i_gsc_op_type_t type;
276 struct globus_i_gsc_server_handle_s * server_handle;
278 globus_gridftp_server_control_response_t response_type;
288 globus_i_gsc_auth_cb_t auth_cb;
289 globus_i_gsc_resource_cb_t stat_cb;
290 globus_i_gsc_transfer_cb_t list_cb;
301 char * absolute_path;
302 char * glob_match_str;
303 globus_gridftp_server_control_resource_mask_t mask;
309 globus_i_gsc_passive_cb_t passive_cb;
310 globus_i_gsc_port_cb_t port_cb;
311 globus_i_gsc_transfer_cb_t transfer_cb;
318 globus_gridftp_server_control_transfer_cb_t user_data_cb;
321 globus_range_list_t range_list;
322 globus_range_list_t perf_range_list;
323 globus_i_gsc_event_data_t event;
326 void * abort_user_arg;
329 globus_i_gsc_data_t * data_destroy_obj;
332 typedef struct globus_i_gsc_attr_s
338 char * post_auth_banner;
339 char * pre_auth_banner;
340 globus_gridftp_server_control_security_type_t security;
345 globus_i_gsc_user_funcs_t funcs;
346 } globus_i_gsc_attr_t;
349 extern globus_hashtable_t globus_i_gs_default_attr_command_hash;
358 typedef enum globus_l_gsc_state_e
360 GLOBUS_L_GSC_STATE_NONE,
361 GLOBUS_L_GSC_STATE_OPENING,
362 GLOBUS_L_GSC_STATE_OPEN,
363 GLOBUS_L_GSC_STATE_PROCESSING,
364 GLOBUS_L_GSC_STATE_ABORTING,
365 GLOBUS_L_GSC_STATE_ABORTING_STOPPING,
366 GLOBUS_L_GSC_STATE_STOPPING,
367 GLOBUS_L_GSC_STATE_STOPPED
368 } globus_l_gsc_state_t;
371 typedef struct globus_i_gsc_cmd_wrapper_s
373 globus_i_gsc_op_t * op;
382 globus_gridftp_server_control_network_protocol_t prt;
384 globus_i_gsc_op_type_t type;
391 struct globus_i_gsc_cmd_wrapper_s * transfer_info;
392 } globus_i_gsc_cmd_wrapper_t;
395 typedef struct globus_i_gsc_server_handle_s
415 char * post_auth_banner;
416 char * pre_auth_banner;
418 gss_ctx_id_t context;
420 gss_cred_id_t del_cred;
421 globus_gridftp_server_control_security_type_t security_type;
435 globus_off_t allocated_bytes;
441 globus_i_gsc_handle_opts_t opts;
446 globus_range_list_t range_list;
448 globus_i_gsc_user_funcs_t funcs;
450 globus_i_gsc_data_t * data_object;
460 globus_xio_handle_t xio_handle;
461 globus_l_gsc_state_t state;
465 globus_hashtable_t cmd_table;
466 globus_hashtable_t site_cmd_table;
467 globus_hashtable_t data_object_table;
468 struct globus_i_gsc_op_s * outstanding_op;
475 globus_i_gsc_cmd_wrapper_t * pasv_info;
479 } globus_i_gsc_server_handle_t;
483 globus_i_gsc_reverse_restart(
484 globus_range_list_t in_range,
485 globus_range_list_t out_range);
488 globus_i_gsc_op_destroy(
489 globus_i_gsc_op_t * op);
492 globus_i_gsc_event_start(
493 globus_i_gsc_op_t * op,
495 globus_gridftp_server_control_event_cb_t event_cb,
499 globus_i_gsc_event_end(
500 globus_i_gsc_op_t * op);
503 globus_i_gsc_get_help(
504 globus_i_gsc_server_handle_t * server_handle,
505 const char * command_name);
508 globus_i_gsc_intermediate_reply(
509 globus_i_gsc_op_t * op,
513 globus_i_gsc_authenticate(
514 globus_i_gsc_op_t * op,
517 globus_i_gsc_auth_cb_t cb,
522 globus_i_gsc_op_t * op,
524 globus_gridftp_server_control_resource_mask_t mask,
525 globus_i_gsc_op_type_t type,
526 globus_i_gsc_transfer_cb_t list_cb,
530 globus_i_gsc_resource_query(
531 globus_i_gsc_op_t * op,
533 globus_gridftp_server_control_resource_mask_t mask,
534 globus_i_gsc_resource_cb_t cb,
538 globus_i_gsc_passive(
539 globus_i_gsc_op_t * op,
542 const char * pathname,
543 globus_i_gsc_passive_cb_t cb,
548 globus_i_gsc_op_t * op,
549 const char ** contact_strings,
552 globus_i_gsc_port_cb_t cb,
557 globus_i_gsc_op_t * op,
559 const char * mod_name,
560 const char * mod_parms,
561 globus_i_gsc_transfer_cb_t data_cb,
566 globus_i_gsc_op_t * op,
568 const char * mod_name,
569 const char * mod_parms,
570 globus_i_gsc_transfer_cb_t data_cb,
574 globus_i_gsc_add_commands(
575 globus_i_gsc_server_handle_t * server_handle);
578 globus_i_gsc_command_panic(
579 globus_i_gsc_op_t * op);
582 globus_i_gsc_concat_path(
583 globus_i_gsc_server_handle_t * i_server,
584 const char * in_path);
587 globus_i_gsc_list_single_line(
591 globus_i_gsc_list_line(
594 const char * glob_match_str);
597 globus_i_gsc_nlst_line(
602 globus_i_gsc_mlsx_line_single(
603 const char * mlsx_fact_str,
606 const char * base_path,
607 const char * absolute_path,
611 globus_i_gsc_mlsx_line(
614 const char * mlsx_fact_string,
616 const char * base_path,
617 const char * absolute_path,
621 globus_i_guc_command_data_destroy(
622 globus_i_gsc_server_handle_t * server_handle);
626 globus_i_gsc_server_handle_t * server_handle,
627 const char * command,
631 globus_i_guc_data_object_destroy(
632 globus_i_gsc_server_handle_t * server_handle,
633 globus_i_gsc_data_t * data_object);
636 globus_i_gsc_cmd_intermediate_reply(
637 globus_i_gsc_op_t * op,
641 globus_i_gsc_event_start_perf_restart(
642 globus_i_gsc_op_t * op);
645 globus_gsc_959_terminate(
646 globus_i_gsc_op_t * op,