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 
15 GlobusDebugDeclare(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 
70 struct globus_i_gs_attr_s;
71 
72 typedef 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 
83 typedef 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 
94 typedef 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 
120 typedef 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 
128 typedef 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 
135 typedef 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 
147 typedef 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 
156 typedef 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 
163 typedef 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 
170 typedef 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 
180 typedef 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 
195 typedef 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 
212 typedef 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 
234 typedef 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 
241 typedef 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 
268 typedef 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 
331 typedef 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 
348 extern 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  */
357 typedef 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 
370 typedef 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 */
394 typedef 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 
484 void
485 globus_i_gsc_reverse_restart(
486  globus_range_list_t in_range,
487  globus_range_list_t out_range);
488 
489 void
490 globus_i_gsc_op_destroy(
491  globus_i_gsc_op_t * op);
492 
493 void
494 globus_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 
500 void
501 globus_i_gsc_event_end(
502  globus_i_gsc_op_t * op);
503 
504 char *
505 globus_i_gsc_get_help(
506  globus_i_gsc_server_handle_t * server_handle,
507  const char * command_name);
508 
509 globus_result_t
510 globus_i_gsc_intermediate_reply(
511  globus_i_gsc_op_t * op,
512  char * reply_msg);
513 
514 globus_result_t
515 globus_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 
522 globus_result_t
523 globus_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 
531 globus_result_t
532 globus_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 
539 globus_result_t
540 globus_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 
548 globus_result_t
549 globus_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 
557 globus_result_t
558 globus_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 
566 globus_result_t
567 globus_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 
575 void
576 globus_i_gsc_add_commands(
577  globus_i_gsc_server_handle_t * server_handle);
578 
579 globus_result_t
580 globus_i_gsc_command_panic(
581  globus_i_gsc_op_t * op);
582 
583 char *
584 globus_i_gsc_concat_path(
585  globus_i_gsc_server_handle_t * i_server,
586  const char * in_path);
587 
588 char *
589 globus_i_gsc_list_single_line(
591 
592 char *
593 globus_i_gsc_list_line(
595  int stat_count,
596  const char * glob_match_str);
597 
598 char *
599 globus_i_gsc_nlst_line(
601  int stat_count);
602 
603 char *
604 globus_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 
614 char *
615 globus_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 
626 char *
627 globus_i_gsc_ext_facts_selected(
628  const char * fact_str,
629  char ** ext_fact_names);
630 
631 void
632 globus_i_guc_command_data_destroy(
633  globus_i_gsc_server_handle_t * server_handle);
634 
635 void
636 globus_i_gsc_log(
637  globus_i_gsc_server_handle_t * server_handle,
638  const char * command,
639  int mask);
640 
641 globus_bool_t
642 globus_i_guc_data_object_destroy(
643  globus_i_gsc_server_handle_t * server_handle,
644  globus_i_gsc_data_t * data_object);
645 
646 globus_result_t
647 globus_i_gsc_cmd_intermediate_reply(
648  globus_i_gsc_op_t * op,
649  char * reply_msg);
650 
651 void
652 globus_i_gsc_event_start_perf_restart(
653  globus_i_gsc_op_t * op);
654 
655 void
656 globus_gsc_959_terminate(
657  globus_i_gsc_op_t * op,
658  char * reply_msg);
659 
660 #endif
Definition: globus_gridftp_server_control.h:204