globus_connect_gridftp_server 17.0~rc3
globus_i_gridftp_server_control.h
1
2#if !defined(GLOBUS_I_GRIDFTP_SERVER_CONTROL_H)
3#define GLOBUS_I_GRIDFTP_SERVER_CONTROL_H 1
4
5#include "globus_gridftp_server_control.h"
6#include "globus_xio.h"
7#include "globus_xio_system.h"
8#include "globus_xio_tcp_driver.h"
9#include "globus_xio_pipe_driver.h"
10#include "globus_xio_telnet.h"
11#include "globus_xio_gssapi_ftp.h"
12
13#define GLOBUS_GRIDFTP_VERSION_CTL 1
14
15GlobusDebugDeclare(GLOBUS_GRIDFTP_SERVER_CONTROL);
16
17#define GlobusGSDebugPrintf(level, message) \
18 GlobusDebugPrintf(GLOBUS_GRIDFTP_SERVER_CONTROL, level, message)
19
20#define GlobusGridFTPServerDebugEnter() \
21 GlobusGSDebugPrintf( \
22 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE, \
23 ("[%s] Entering\n", _gridftp_server_name))
24
25#define GlobusGridFTPServerDebugExit() \
26 GlobusGSDebugPrintf( \
27 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE, \
28 ("[%s] Exiting\n", _gridftp_server_name))
29
30#define GlobusGridFTPServerDebugExitWithError() \
31 GlobusGSDebugPrintf( \
32 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE, \
33 ("[%s] Exiting with error\n", _gridftp_server_name))
34
35#define GlobusGridFTPServerDebugInternalEnter() \
36 GlobusGSDebugPrintf( \
37 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE, \
38 ("[%s] I Entering\n", _gridftp_server_name))
39
40#define GlobusGridFTPServerDebugInternalExit() \
41 GlobusGSDebugPrintf( \
42 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE, \
43 ("[%s] I Exiting\n", _gridftp_server_name))
44
45#define GlobusGridFTPServerDebugInternalExitWithError() \
46 GlobusGSDebugPrintf( \
47 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE, \
48 ("[%s] I Exiting with error\n", _gridftp_server_name))
49
50#define GlobusGridFTPServerDebugVerboseEnter() \
51 GlobusGSDebugPrintf( \
52 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE, \
53 ("[%s] V Entering\n", _gridftp_server_name))
54
55#define GlobusGridFTPServerDebugVerboseExit() \
56 GlobusGSDebugPrintf( \
57 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE, \
58 ("[%s] V Exiting\n", _gridftp_server_name))
59
60#define GlobusGridFTPServerDebugVerboseExitWithError() \
61 GlobusGSDebugPrintf( \
62 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE, \
63 ("[%s] V Exiting with error\n", _gridftp_server_name))
64
65#define GlobusGridFTPServerDebugCommand(cmd) \
66 GlobusGSDebugPrintf( \
67 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_COMMANDS, \
68 ("### [%s] Received command: %s\n", _gridftp_server_name, cmd))
69
70struct globus_i_gs_attr_s;
71
72typedef enum globus_i_gsc_debug_levels_e
73{
74 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_ERROR = 1,
75 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_WARNING = 2,
76 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE = 4,
77 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE = 8,
78 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_COMMANDS = 16,
79 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE = 32,
80 GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_STATE = 64
81} globus_i_gsc_debug_levels_t;
82
83typedef enum globus_i_gsc_error_type_e
84{
85 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_PARAMETER,
86 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_STATE,
87 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_MEMORY,
88 GLOBUS_GRIDFTP_SERVER_CONTROL_NO_AUTH,
89 GLOBUS_GRIDFTP_SERVER_CONTROL_POST_AUTH,
90 GLOBUS_GRIDFTP_SERVER_CONTROL_NO_COMMAND,
91 GLOBUS_GRIDFTP_SERVER_CONTROL_MALFORMED_COMMAND
92} globus_i_gsc_error_type_t;
93
94typedef enum globus_i_gsc_mlsx_fact_e
95{
96 GLOBUS_GSC_MLSX_FACT_TYPE = 'T',
97 GLOBUS_GSC_MLSX_FACT_MODIFY = 'M',
98 GLOBUS_GSC_MLSX_FACT_CHARSET = 'C',
99 GLOBUS_GSC_MLSX_FACT_SIZE = 'S',
100 GLOBUS_GSC_MLSX_FACT_PERM = 'P',
101 GLOBUS_GSC_MLSX_FACT_UNIXMODE = 'U',
102 GLOBUS_GSC_MLSX_FACT_UNIXOWNER = 'O',
103 GLOBUS_GSC_MLSX_FACT_UNIXGROUP = 'G',
104 GLOBUS_GSC_MLSX_FACT_UNIQUE = 'Q',
105 GLOBUS_GSC_MLSX_FACT_UNIXSLINK = 'L',
106 GLOBUS_GSX_MLSX_FACT_UNIXUID = 'I',
107 GLOBUS_GSX_MLSX_FACT_UNIXGID = 'D',
108 GLOBUS_GSC_MLSX_FACT_XCOUNT = 'N',
109 GLOBUS_GSC_MLSX_FACT_XABSPATH = 'A',
110 GLOBUS_GSC_MLSX_FACT_DYNAMIC = 'Y'
111} globus_i_gsc_mlsx_fact_t;
112
113/* Extra facts registered with globus_i_gsc_add_mlst_facts() have no fixed
114 * letter: the k-th registered name is selected as letter
115 * GLOBUS_GSC_MLSX_EXT_FACT_FIRST + k. The letters only mean something
116 * together with the server handle's registered names (ext_fact_names). */
117#define GLOBUS_GSC_MLSX_EXT_FACT_FIRST 'a'
118#define GLOBUS_GSC_MLSX_EXT_FACT_MAX 16
119
120typedef enum
121{
122 GLOBUS_L_GSC_DATA_OBJ_READY = 1,
123 GLOBUS_L_GSC_DATA_OBJ_DESTROY_WAIT,
124 GLOBUS_L_GSC_DATA_OBJ_DESTROYING,
125 GLOBUS_L_GSC_DATA_OBJ_INUSE
126} globus_l_gsc_data_obj_state_t;
127
128typedef void
129(*globus_i_gsc_auth_cb_t)(
130 struct globus_i_gsc_op_s * op,
131 globus_gridftp_server_control_response_t response_type,
132 char * response_msg,
133 void * user_arg);
134
135typedef void
136(*globus_i_gsc_resource_cb_t)(
137 struct globus_i_gsc_op_s * op,
138 globus_gridftp_server_control_response_t response_type,
139 char * response_msg,
140 char * path,
141 char * abs_path,
143 int stat_count,
144 uid_t uid,
145 void * user_arg);
146
147typedef void
148(*globus_i_gsc_passive_cb_t)(
149 struct globus_i_gsc_op_s * op,
150 globus_gridftp_server_control_response_t response_type,
151 char * response_msg,
152 const char ** cs,
153 int addr_count,
154 void * user_arg);
155
156typedef void
157(*globus_i_gsc_port_cb_t)(
158 struct globus_i_gsc_op_s * op,
159 globus_gridftp_server_control_response_t response_type,
160 char * response_msg,
161 void * user_arg);
162
163typedef void
164(*globus_i_gsc_transfer_cb_t)(
165 struct globus_i_gsc_op_s * op,
166 globus_gridftp_server_control_response_t response_type,
167 char * response_msg,
168 void * user_arg);
169
170typedef struct globus_i_gsc_data_s
171{
172 globus_l_gsc_data_obj_state_t state;
173 struct globus_i_gsc_server_handle_s * server_handle;
174 int stripe_count;
175 void * user_handle;
176 globus_gridftp_server_control_data_dir_t dir;
177 globus_bool_t first_use;
178} globus_i_gsc_data_t;
179
180typedef enum globus_i_gsc_op_type_e
181{
182 GLOBUS_L_GSC_OP_TYPE_AUTH,
183 GLOBUS_L_GSC_OP_TYPE_RESOURCE,
184 GLOBUS_L_GSC_OP_TYPE_CREATE_PASV,
185 GLOBUS_L_GSC_OP_TYPE_CREATE_PORT,
186 GLOBUS_L_GSC_OP_TYPE_SEND,
187 GLOBUS_L_GSC_OP_TYPE_RECV,
188 GLOBUS_L_GSC_OP_TYPE_DESTROY,
189 GLOBUS_L_GSC_OP_TYPE_LIST,
190 GLOBUS_L_GSC_OP_TYPE_NLST,
191 GLOBUS_L_GSC_OP_TYPE_MLSD,
192 GLOBUS_L_GSC_OP_TYPE_MLSR
193} globus_i_gsc_op_type_t;
194
195typedef struct globus_i_gsc_event_data_s
196{
197 globus_l_gsc_data_obj_state_t state;
198 globus_callback_handle_t periodic_handle;
199 int stripe_count;
200 globus_bool_t perf_running;
201
202 globus_callback_handle_t restart_handle;
203 globus_bool_t restart_running;
204
205 int event_mask;
206 globus_gridftp_server_control_event_cb_t user_cb;
207 void * user_arg;
208
209 globus_off_t * stripe_total;
210} globus_i_gsc_event_data_t;
211
212typedef struct globus_i_gsc_handle_opts_s
213{
214 /* One letter per fact selected with OPTS MLST, plus the terminating
215 * NUL. OPTS sets each fact at most once, so this must hold every
216 * globus_i_gsc_mlsx_fact_t letter, GLOBUS_GSC_MLSX_EXT_FACT_MAX extra
217 * facts and one more (15 + 16 + 1). */
218 char mlsx_fact_str[32];
219 int parallelism;
220 globus_size_t send_buf;
221 globus_size_t receive_buf;
222 globus_bool_t refresh;
223 globus_size_t packet_size;
224 globus_bool_t delayed_passive;
225 globus_bool_t passive_only;
226 int perf_frequency;
227 int retr_perf_frequency;
228 int restart_frequency;
229 globus_gsc_layout_t layout;
230 globus_size_t block_size;
231 int mlsr_traversal_options;
232} globus_i_gsc_handle_opts_t;
233
234typedef struct globus_i_gsc_module_func_s
235{
236 char * key;
237 globus_gridftp_server_control_transfer_cb_t func;
238 void * user_arg;
239} globus_i_gsc_module_func_t;
240
241typedef struct globus_i_gsc_user_funcs_s
242{
243 globus_hashtable_t send_cb_table;
244 globus_hashtable_t recv_cb_table;
245 globus_gridftp_server_control_transfer_cb_t default_send_cb;
246 void * default_send_arg;
247 globus_gridftp_server_control_transfer_cb_t default_recv_cb;
248 void * default_recv_arg;
249 globus_gridftp_server_control_auth_cb_t auth_cb;
250 void * auth_arg;
251 globus_gridftp_server_control_passive_connect_cb_t passive_cb;
252 void * passive_arg;
253 globus_gridftp_server_control_active_connect_cb_t active_cb;
254 void * active_arg;
255 globus_gridftp_server_control_data_destroy_cb_t data_destroy_cb;
256 void * data_destroy_arg;
257 globus_gridftp_server_control_list_cb_t list_cb;
258 void * list_arg;
259 globus_gridftp_server_control_resource_cb_t resource_cb;
260 void * resource_arg;
261 globus_gridftp_server_control_cb_t done_cb;
262 void * done_arg;
263 globus_gridftp_server_control_log_cb_t log_func;
264 int log_mask;
265 void * log_arg;
266} globus_i_gsc_user_funcs_t;
267
268typedef struct globus_i_gsc_op_s
269{
270 globus_i_gsc_op_type_t type;
271
272 int ref;
273 struct globus_i_gsc_server_handle_s * server_handle;
274
275 globus_gridftp_server_control_response_t response_type;
276 char * response_msg;
277
278 globus_list_t * cmd_list;
279 globus_bool_t done;
280
281 /* stuff for auth */
282 globus_bool_t authenticated;
283 char * username;
284 char * password;
285 globus_i_gsc_auth_cb_t auth_cb;
286 globus_i_gsc_resource_cb_t stat_cb;
287 globus_i_gsc_transfer_cb_t list_cb;
288
290 int stat_count;
291 /* NULL, or stat_count extra-fact strings (entries may be NULL) */
292 char ** stat_facts;
293 globus_mutex_t stat_lock;
294
295 /* stuff for resource */
296 int uid;
297 int gid_count;
298 int * gid_array;
299 char * path;
300 char * absolute_path;
301 char * glob_match_str;
302 globus_gridftp_server_control_resource_mask_t mask;
303
304 /* stuff for port/pasv */
305 char ** cs;
306 int max_cs;
307 int net_prt;
308 globus_i_gsc_passive_cb_t passive_cb;
309 globus_i_gsc_port_cb_t port_cb;
310 globus_i_gsc_transfer_cb_t transfer_cb;
311
312 char * command;
313
314 /* stuff for transfer */
315 char * mod_name;
316 char * mod_parms;
317 globus_gridftp_server_control_transfer_cb_t user_data_cb;
318 globus_bool_t transfer_started;
319
320 globus_range_list_t range_list;
321 globus_range_list_t perf_range_list;
322 globus_i_gsc_event_data_t event;
323
324 globus_bool_t aborted;
325 void * abort_user_arg;
326 void * user_arg;
327
328 globus_i_gsc_data_t * data_destroy_obj;
329} globus_i_gsc_op_t;
330
331typedef struct globus_i_gsc_attr_s
332{
333 int version_ctl;
334 char * modes;
335 char * types;
336 char * base_dir;
337 char * post_auth_banner;
338 char * pre_auth_banner;
339 globus_gridftp_server_control_security_type_t security;
340
341 int idle_timeout;
342 int preauth_timeout;
343
344 globus_i_gsc_user_funcs_t funcs;
345} globus_i_gsc_attr_t;
346
347
348extern globus_hashtable_t globus_i_gs_default_attr_command_hash;
349
350/*
351 * internal functions for adding commands.
352 */
353
354/*
355 * 959 Structures
356 */
357typedef enum globus_l_gsc_state_e
358{
359 GLOBUS_L_GSC_STATE_NONE,
360 GLOBUS_L_GSC_STATE_OPENING,
361 GLOBUS_L_GSC_STATE_OPEN,
362 GLOBUS_L_GSC_STATE_PROCESSING,
363 GLOBUS_L_GSC_STATE_ABORTING,
364 GLOBUS_L_GSC_STATE_ABORTING_STOPPING,
365 GLOBUS_L_GSC_STATE_STOPPING,
366 GLOBUS_L_GSC_STATE_STOPPED
367} globus_l_gsc_state_t;
368
369
370typedef struct globus_i_gsc_cmd_wrapper_s
371{
372 globus_i_gsc_op_t * op;
373 char * strarg;
374 char * mod_name;
375 char * mod_parms;
376 char * path;
377
378 globus_bool_t transfer_flag;
379 int dc_parsing_alg;
380 int max;
381 globus_gridftp_server_control_network_protocol_t prt;
382
383 globus_i_gsc_op_type_t type;
384 int cmd_ndx;
385
386 char ** cs;
387 int cs_count;
388 int reply_code;
389
390 struct globus_i_gsc_cmd_wrapper_s * transfer_info;
391} globus_i_gsc_cmd_wrapper_t;
392
393/* the server handle */
394typedef struct globus_i_gsc_server_handle_s
395{
396 int version_ctl;
397
398 globus_mutex_t mutex;
399
400 /*
401 * authentication information
402 */
403 int ref;
404 globus_bool_t timeout;
405
406 char * username;
407 char * pw;
408 char * subject;
409 char dcau;
410 char * dcau_subject;
411 char prot;
412 globus_bool_t authenticated;
413
414 char * post_auth_banner;
415 char * pre_auth_banner;
416
417 gss_ctx_id_t context;
418 gss_cred_id_t cred;
419 gss_cred_id_t del_cred;
420 globus_gridftp_server_control_security_type_t security_type;
421
422 /*
423 * state information
424 */
425 char * cwd;
426 char * default_cwd;
427 char type;
428 char mode;
429 char * modes;
430 char * types;
431 int stripe_count;
432 char * lang;
433
434 globus_off_t allocated_bytes;
435
436 /* force failure on this command */
437 char * fault_cmd;
438
439 /* opts state */
440 globus_i_gsc_handle_opts_t opts;
441
442 /*
443 * user function pointers
444 */
445 globus_range_list_t range_list;
446
447 globus_i_gsc_user_funcs_t funcs;
448
449 globus_i_gsc_data_t * data_object;
450
451 globus_result_t cached_res;
452 globus_list_t * feature_list;
453 /* NULL, or the extra fact names from
454 * globus_i_gsc_add_mlst_facts(), NULL-terminated */
455 char ** ext_fact_names;
456
457 /*
458 * read.c members
459 */
460 globus_list_t * all_cmd_list;
461 globus_bool_t reply_outstanding;
462 globus_xio_handle_t xio_handle;
463 globus_l_gsc_state_t state;
464 globus_fifo_t read_q;
465 globus_fifo_t reply_q;
466 int abort_cnt;
467 globus_hashtable_t cmd_table;
468 globus_hashtable_t site_cmd_table;
469 globus_hashtable_t data_object_table;
470 struct globus_i_gsc_op_s * outstanding_op;
471
472 globus_bool_t terminating;
473
474 int idle_timeout;
475 int preauth_timeout;
476
477 globus_i_gsc_cmd_wrapper_t * pasv_info;
478
479 globus_bool_t q_backup;
480 int max_q_len;
481} globus_i_gsc_server_handle_t;
482
483
484void
485globus_i_gsc_reverse_restart(
486 globus_range_list_t in_range,
487 globus_range_list_t out_range);
488
489void
490globus_i_gsc_op_destroy(
491 globus_i_gsc_op_t * op);
492
493void
494globus_i_gsc_event_start(
495 globus_i_gsc_op_t * op,
496 int event_mask,
497 globus_gridftp_server_control_event_cb_t event_cb,
498 void * user_arg);
499
500void
501globus_i_gsc_event_end(
502 globus_i_gsc_op_t * op);
503
504char *
505globus_i_gsc_get_help(
506 globus_i_gsc_server_handle_t * server_handle,
507 const char * command_name);
508
509globus_result_t
510globus_i_gsc_intermediate_reply(
511 globus_i_gsc_op_t * op,
512 char * reply_msg);
513
514globus_result_t
515globus_i_gsc_authenticate(
516 globus_i_gsc_op_t * op,
517 const char * user,
518 const char * pass,
519 globus_i_gsc_auth_cb_t cb,
520 void * user_arg);
521
522globus_result_t
523globus_i_gsc_list(
524 globus_i_gsc_op_t * op,
525 const char * path,
526 globus_gridftp_server_control_resource_mask_t mask,
527 globus_i_gsc_op_type_t type,
528 globus_i_gsc_transfer_cb_t list_cb,
529 void * user_arg);
530
531globus_result_t
532globus_i_gsc_resource_query(
533 globus_i_gsc_op_t * op,
534 const char * path,
535 globus_gridftp_server_control_resource_mask_t mask,
536 globus_i_gsc_resource_cb_t cb,
537 void * user_arg);
538
539globus_result_t
540globus_i_gsc_passive(
541 globus_i_gsc_op_t * op,
542 int max,
543 int net_prt,
544 const char * pathname,
545 globus_i_gsc_passive_cb_t cb,
546 void * user_arg);
547
548globus_result_t
549globus_i_gsc_port(
550 globus_i_gsc_op_t * op,
551 const char ** contact_strings,
552 int stripe_count,
553 int net_prt,
554 globus_i_gsc_port_cb_t cb,
555 void * user_arg);
556
557globus_result_t
558globus_i_gsc_send(
559 globus_i_gsc_op_t * op,
560 const char * path,
561 const char * mod_name,
562 const char * mod_parms,
563 globus_i_gsc_transfer_cb_t data_cb,
564 void * user_arg);
565
566globus_result_t
567globus_i_gsc_recv(
568 globus_i_gsc_op_t * op,
569 const char * path,
570 const char * mod_name,
571 const char * mod_parms,
572 globus_i_gsc_transfer_cb_t data_cb,
573 void * user_arg);
574
575void
576globus_i_gsc_add_commands(
577 globus_i_gsc_server_handle_t * server_handle);
578
579globus_result_t
580globus_i_gsc_command_panic(
581 globus_i_gsc_op_t * op);
582
583char *
584globus_i_gsc_concat_path(
585 globus_i_gsc_server_handle_t * i_server,
586 const char * in_path);
587
588char *
589globus_i_gsc_list_single_line(
591
592char *
593globus_i_gsc_list_line(
595 int stat_count,
596 const char * glob_match_str);
597
598char *
599globus_i_gsc_nlst_line(
601 int stat_count);
602
603char *
604globus_i_gsc_mlsx_line_single(
605 const char * mlsx_fact_str,
606 int uid,
608 const char * ext_facts,
609 char ** ext_fact_names,
610 const char * base_path,
611 const char * absolute_path,
612 globus_bool_t mlst);
613
614char *
615globus_i_gsc_mlsx_line(
617 int stat_count,
618 char ** ext_facts,
619 char ** ext_fact_names,
620 const char * mlsx_fact_string,
621 uid_t uid,
622 const char * base_path,
623 const char * absolute_path,
624 globus_bool_t indent);
625
626char *
627globus_i_gsc_ext_facts_selected(
628 const char * fact_str,
629 char ** ext_fact_names);
630
631void
632globus_i_guc_command_data_destroy(
633 globus_i_gsc_server_handle_t * server_handle);
634
635void
636globus_i_gsc_log(
637 globus_i_gsc_server_handle_t * server_handle,
638 const char * command,
639 int mask);
640
641globus_bool_t
642globus_i_guc_data_object_destroy(
643 globus_i_gsc_server_handle_t * server_handle,
644 globus_i_gsc_data_t * data_object);
645
646globus_result_t
647globus_i_gsc_cmd_intermediate_reply(
648 globus_i_gsc_op_t * op,
649 char * reply_msg);
650
651void
652globus_i_gsc_event_start_perf_restart(
653 globus_i_gsc_op_t * op);
654
655void
656globus_gsc_959_terminate(
657 globus_i_gsc_op_t * op,
658 char * reply_msg);
659
660#endif
Definition: globus_gridftp_server_control.h:204