Grid Community Toolkit  6.2.1550507116
globus_i_gridftp_server_control.h
1 /*
2  * Copyright 1999-2006 University of Chicago
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #if !defined(GLOBUS_I_GRIDFTP_SERVER_CONTROL_H)
18 #define GLOBUS_I_GRIDFTP_SERVER_CONTROL_H 1
19 
20 #include "globus_gridftp_server_control.h"
21 #include "globus_xio.h"
22 #include "globus_xio_system.h"
23 #include "globus_xio_tcp_driver.h"
24 #include "globus_xio_pipe_driver.h"
25 #include "globus_xio_telnet.h"
26 #include "globus_xio_gssapi_ftp.h"
27 
28 #define GLOBUS_GRIDFTP_VERSION_CTL 1
29 
30 GlobusDebugDeclare(GLOBUS_GRIDFTP_SERVER_CONTROL);
31 
32 #define GlobusGSDebugPrintf(level, message) \
33  GlobusDebugPrintf(GLOBUS_GRIDFTP_SERVER_CONTROL, level, message)
34 
35 #define GlobusGridFTPServerDebugEnter() \
36  GlobusGSDebugPrintf( \
37  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE, \
38  ("[%s] Entering\n", _gridftp_server_name))
39 
40 #define GlobusGridFTPServerDebugExit() \
41  GlobusGSDebugPrintf( \
42  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE, \
43  ("[%s] Exiting\n", _gridftp_server_name))
44 
45 #define GlobusGridFTPServerDebugExitWithError() \
46  GlobusGSDebugPrintf( \
47  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_TRACE, \
48  ("[%s] Exiting with error\n", _gridftp_server_name))
49 
50 #define GlobusGridFTPServerDebugInternalEnter() \
51  GlobusGSDebugPrintf( \
52  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE, \
53  ("[%s] I Entering\n", _gridftp_server_name))
54 
55 #define GlobusGridFTPServerDebugInternalExit() \
56  GlobusGSDebugPrintf( \
57  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE, \
58  ("[%s] I Exiting\n", _gridftp_server_name))
59 
60 #define GlobusGridFTPServerDebugInternalExitWithError() \
61  GlobusGSDebugPrintf( \
62  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_INTERNAL_TRACE, \
63  ("[%s] I Exiting with error\n", _gridftp_server_name))
64 
65 #define GlobusGridFTPServerDebugVerboseEnter() \
66  GlobusGSDebugPrintf( \
67  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE, \
68  ("[%s] V Entering\n", _gridftp_server_name))
69 
70 #define GlobusGridFTPServerDebugVerboseExit() \
71  GlobusGSDebugPrintf( \
72  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE, \
73  ("[%s] V Exiting\n", _gridftp_server_name))
74 
75 #define GlobusGridFTPServerDebugVerboseExitWithError() \
76  GlobusGSDebugPrintf( \
77  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_VERBOSE, \
78  ("[%s] V Exiting with error\n", _gridftp_server_name))
79 
80 #define GlobusGridFTPServerDebugCommand(cmd) \
81  GlobusGSDebugPrintf( \
82  GLOBUS_GRIDFTP_SERVER_CONTROL_DEBUG_COMMANDS, \
83  ("### [%s] Received command: %s\n", _gridftp_server_name, cmd))
84 
85 struct globus_i_gs_attr_s;
86 
87 typedef enum globus_i_gsc_debug_levels_e
88 {
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;
97 
98 typedef enum globus_i_gsc_error_type_e
99 {
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;
108 
109 typedef enum globus_i_gsc_mlsx_fact_e
110 {
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;
126 
127 typedef enum
128 {
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;
134 
135 typedef void
136 (*globus_i_gsc_auth_cb_t)(
137  struct globus_i_gsc_op_s * op,
138  globus_gridftp_server_control_response_t response_type,
139  char * response_msg,
140  void * user_arg);
141 
142 typedef void
143 (*globus_i_gsc_resource_cb_t)(
144  struct globus_i_gsc_op_s * op,
145  globus_gridftp_server_control_response_t response_type,
146  char * response_msg,
147  char * path,
148  char * abs_path,
150  int stat_count,
151  uid_t uid,
152  void * user_arg);
153 
154 typedef void
155 (*globus_i_gsc_passive_cb_t)(
156  struct globus_i_gsc_op_s * op,
157  globus_gridftp_server_control_response_t response_type,
158  char * response_msg,
159  const char ** cs,
160  int addr_count,
161  void * user_arg);
162 
163 typedef void
164 (*globus_i_gsc_port_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 void
171 (*globus_i_gsc_transfer_cb_t)(
172  struct globus_i_gsc_op_s * op,
173  globus_gridftp_server_control_response_t response_type,
174  char * response_msg,
175  void * user_arg);
176 
177 typedef struct globus_i_gsc_data_s
178 {
179  globus_l_gsc_data_obj_state_t state;
180  struct globus_i_gsc_server_handle_s * server_handle;
181  int stripe_count;
182  void * user_handle;
183  globus_gridftp_server_control_data_dir_t dir;
184  globus_bool_t first_use;
185 } globus_i_gsc_data_t;
186 
187 typedef enum globus_i_gsc_op_type_e
188 {
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;
201 
202 typedef struct globus_i_gsc_event_data_s
203 {
204  globus_l_gsc_data_obj_state_t state;
205  globus_callback_handle_t periodic_handle;
206  int stripe_count;
207  globus_bool_t perf_running;
208 
209  globus_callback_handle_t restart_handle;
210  globus_bool_t restart_running;
211 
212  int event_mask;
213  globus_gridftp_server_control_event_cb_t user_cb;
214  void * user_arg;
215 
216  globus_off_t * stripe_total;
217 } globus_i_gsc_event_data_t;
218 
219 typedef struct globus_i_gsc_handle_opts_s
220 {
221  char mlsx_fact_str[16];
222  int parallelism;
223  globus_size_t send_buf;
224  globus_size_t receive_buf;
225  globus_bool_t refresh;
226  globus_size_t packet_size;
227  globus_bool_t delayed_passive;
228  globus_bool_t passive_only;
229  int perf_frequency;
230  int retr_perf_frequency;
231  int restart_frequency;
232  globus_gsc_layout_t layout;
233  globus_size_t block_size;
234  int mlsr_traversal_options;
235 } globus_i_gsc_handle_opts_t;
236 
237 typedef struct globus_i_gsc_module_func_s
238 {
239  char * key;
240  globus_gridftp_server_control_transfer_cb_t func;
241  void * user_arg;
242 } globus_i_gsc_module_func_t;
243 
244 typedef struct globus_i_gsc_user_funcs_s
245 {
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;
253  void * auth_arg;
254  globus_gridftp_server_control_passive_connect_cb_t passive_cb;
255  void * passive_arg;
256  globus_gridftp_server_control_active_connect_cb_t active_cb;
257  void * active_arg;
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;
261  void * list_arg;
262  globus_gridftp_server_control_resource_cb_t resource_cb;
263  void * resource_arg;
264  globus_gridftp_server_control_cb_t done_cb;
265  void * done_arg;
266  globus_gridftp_server_control_log_cb_t log_func;
267  int log_mask;
268  void * log_arg;
269 } globus_i_gsc_user_funcs_t;
270 
271 typedef struct globus_i_gsc_op_s
272 {
273  globus_i_gsc_op_type_t type;
274 
275  int ref;
276  struct globus_i_gsc_server_handle_s * server_handle;
277 
278  globus_gridftp_server_control_response_t response_type;
279  char * response_msg;
280 
281  globus_list_t * cmd_list;
282  globus_bool_t done;
283 
284  /* stuff for auth */
285  globus_bool_t authenticated;
286  char * username;
287  char * password;
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;
291 
293  int stat_count;
294  globus_mutex_t stat_lock;
295 
296  /* stuff for resource */
297  int uid;
298  int gid_count;
299  int * gid_array;
300  char * path;
301  char * absolute_path;
302  char * glob_match_str;
303  globus_gridftp_server_control_resource_mask_t mask;
304 
305  /* stuff for port/pasv */
306  char ** cs;
307  int max_cs;
308  int net_prt;
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;
312 
313  char * command;
314 
315  /* stuff for transfer */
316  char * mod_name;
317  char * mod_parms;
318  globus_gridftp_server_control_transfer_cb_t user_data_cb;
319  globus_bool_t transfer_started;
320 
321  globus_range_list_t range_list;
322  globus_range_list_t perf_range_list;
323  globus_i_gsc_event_data_t event;
324 
325  globus_bool_t aborted;
326  void * abort_user_arg;
327  void * user_arg;
328 
329  globus_i_gsc_data_t * data_destroy_obj;
330 } globus_i_gsc_op_t;
331 
332 typedef struct globus_i_gsc_attr_s
333 {
334  int version_ctl;
335  char * modes;
336  char * types;
337  char * base_dir;
338  char * post_auth_banner;
339  char * pre_auth_banner;
340  globus_gridftp_server_control_security_type_t security;
341  globus_bool_t epsv_ip;
342 
343  int idle_timeout;
344  int preauth_timeout;
345 
346  globus_i_gsc_user_funcs_t funcs;
347 } globus_i_gsc_attr_t;
348 
349 
350 extern globus_hashtable_t globus_i_gs_default_attr_command_hash;
351 
352 /*
353  * internal functions for adding commands.
354  */
355 
356 /*
357  * 959 Structures
358  */
359 typedef enum globus_l_gsc_state_e
360 {
361  GLOBUS_L_GSC_STATE_NONE,
362  GLOBUS_L_GSC_STATE_OPENING,
363  GLOBUS_L_GSC_STATE_OPEN,
364  GLOBUS_L_GSC_STATE_PROCESSING,
365  GLOBUS_L_GSC_STATE_ABORTING,
366  GLOBUS_L_GSC_STATE_ABORTING_STOPPING,
367  GLOBUS_L_GSC_STATE_STOPPING,
368  GLOBUS_L_GSC_STATE_STOPPED
369 } globus_l_gsc_state_t;
370 
371 
372 typedef struct globus_i_gsc_cmd_wrapper_s
373 {
374  globus_i_gsc_op_t * op;
375  char * strarg;
376  char * mod_name;
377  char * mod_parms;
378  char * path;
379 
380  globus_bool_t transfer_flag;
381  int dc_parsing_alg;
382  int max;
383  globus_gridftp_server_control_network_protocol_t prt;
384 
385  globus_i_gsc_op_type_t type;
386  int cmd_ndx;
387 
388  char ** cs;
389  int cs_count;
390  int reply_code;
391 
392  struct globus_i_gsc_cmd_wrapper_s * transfer_info;
393 } globus_i_gsc_cmd_wrapper_t;
394 
395 /* the server handle */
396 typedef struct globus_i_gsc_server_handle_s
397 {
398  int version_ctl;
399 
400  globus_mutex_t mutex;
401 
402  /*
403  * authentication information
404  */
405  int ref;
406  globus_bool_t timeout;
407 
408  char * username;
409  char * pw;
410  char * subject;
411  char dcau;
412  char * dcau_subject;
413  char prot;
414  globus_bool_t authenticated;
415 
416  char * post_auth_banner;
417  char * pre_auth_banner;
418 
419  gss_ctx_id_t context;
420  gss_cred_id_t cred;
421  gss_cred_id_t del_cred;
422  globus_gridftp_server_control_security_type_t security_type;
423 
424  /*
425  * state information
426  */
427  char * cwd;
428  char * default_cwd;
429  char type;
430  char mode;
431  char * modes;
432  char * types;
433  int stripe_count;
434  char * lang;
435 
436  globus_off_t allocated_bytes;
437 
438  /* force failure on this command */
439  char * fault_cmd;
440 
441  /* opts state */
442  globus_i_gsc_handle_opts_t opts;
443 
444  /*
445  * user function pointers
446  */
447  globus_range_list_t range_list;
448 
449  globus_i_gsc_user_funcs_t funcs;
450 
451  globus_i_gsc_data_t * data_object;
452 
453  globus_result_t cached_res;
454  globus_list_t * feature_list;
455 
456  /*
457  * read.c members
458  */
459  globus_list_t * all_cmd_list;
460  globus_bool_t reply_outstanding;
461  globus_xio_handle_t xio_handle;
462  globus_l_gsc_state_t state;
463  globus_fifo_t read_q;
464  globus_fifo_t reply_q;
465  int abort_cnt;
466  globus_hashtable_t cmd_table;
467  globus_hashtable_t site_cmd_table;
468  globus_hashtable_t data_object_table;
469  struct globus_i_gsc_op_s * outstanding_op;
470 
471  globus_bool_t terminating;
472 
473  int idle_timeout;
474  int preauth_timeout;
475 
476  globus_i_gsc_cmd_wrapper_t * pasv_info;
477  globus_bool_t epsv_ip;
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 
510 globus_i_gsc_intermediate_reply(
511  globus_i_gsc_op_t * op,
512  char * reply_msg);
513 
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 
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 
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 
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 
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 
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 
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 
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 * base_path,
609  const char * absolute_path,
610  globus_bool_t mlst);
611 
612 char *
613 globus_i_gsc_mlsx_line(
615  int stat_count,
616  const char * mlsx_fact_string,
617  uid_t uid,
618  const char * base_path,
619  const char * absolute_path,
620  globus_bool_t indent);
621 
622 void
623 globus_i_guc_command_data_destroy(
624  globus_i_gsc_server_handle_t * server_handle);
625 
626 void
627 globus_i_gsc_log(
628  globus_i_gsc_server_handle_t * server_handle,
629  const char * command,
630  int mask);
631 
633 globus_i_guc_data_object_destroy(
634  globus_i_gsc_server_handle_t * server_handle,
635  globus_i_gsc_data_t * data_object);
636 
638 globus_i_gsc_cmd_intermediate_reply(
639  globus_i_gsc_op_t * op,
640  char * reply_msg);
641 
642 void
643 globus_i_gsc_event_start_perf_restart(
644  globus_i_gsc_op_t * op);
645 
646 void
647 globus_gsc_959_terminate(
648  globus_i_gsc_op_t * op,
649  char * reply_msg);
650 
651 #endif
int globus_bool_t
Boolean type.
Definition: globus_types.h:93
int globus_callback_handle_t
Periodic callback handle.
Definition: globus_callback.h:102
struct globus_fifo_s * globus_fifo_t
Definition: globus_fifo.h:48
List data type.
Definition: globus_list.h:44
Header file for XIO TCP Driver.
Mutex.
Definition: globus_thread.h:107
Definition: globus_gridftp_server_control.h:209
XIO Telnet Driver.
size_t globus_size_t
Standard size of memory objectThe globus_size_t is the size of a memory object. It is identical to si...
Definition: globus_types.h:48
uint32_t globus_result_t
Definition: globus_types.h:99