Globus Toolkit  6.0.1493989444
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_i_gsc_mlsx_fact_t;
125 
126 typedef enum
127 {
128  GLOBUS_L_GSC_DATA_OBJ_READY = 1,
129  GLOBUS_L_GSC_DATA_OBJ_DESTROY_WAIT,
130  GLOBUS_L_GSC_DATA_OBJ_DESTROYING,
131  GLOBUS_L_GSC_DATA_OBJ_INUSE
132 } globus_l_gsc_data_obj_state_t;
133 
134 typedef void
135 (*globus_i_gsc_auth_cb_t)(
136  struct globus_i_gsc_op_s * op,
137  globus_gridftp_server_control_response_t response_type,
138  char * response_msg,
139  void * user_arg);
140 
141 typedef void
142 (*globus_i_gsc_resource_cb_t)(
143  struct globus_i_gsc_op_s * op,
144  globus_gridftp_server_control_response_t response_type,
145  char * response_msg,
146  char * path,
148  int stat_count,
149  uid_t uid,
150  void * user_arg);
151 
152 typedef void
153 (*globus_i_gsc_passive_cb_t)(
154  struct globus_i_gsc_op_s * op,
155  globus_gridftp_server_control_response_t response_type,
156  char * response_msg,
157  const char ** cs,
158  int addr_count,
159  void * user_arg);
160 
161 typedef void
162 (*globus_i_gsc_port_cb_t)(
163  struct globus_i_gsc_op_s * op,
164  globus_gridftp_server_control_response_t response_type,
165  char * response_msg,
166  void * user_arg);
167 
168 typedef void
169 (*globus_i_gsc_transfer_cb_t)(
170  struct globus_i_gsc_op_s * op,
171  globus_gridftp_server_control_response_t response_type,
172  char * response_msg,
173  void * user_arg);
174 
175 typedef struct globus_i_gsc_data_s
176 {
177  globus_l_gsc_data_obj_state_t state;
178  struct globus_i_gsc_server_handle_s * server_handle;
179  int stripe_count;
180  void * user_handle;
181  globus_gridftp_server_control_data_dir_t dir;
182  globus_bool_t first_use;
183 } globus_i_gsc_data_t;
184 
185 typedef enum globus_i_gsc_op_type_e
186 {
187  GLOBUS_L_GSC_OP_TYPE_AUTH,
188  GLOBUS_L_GSC_OP_TYPE_RESOURCE,
189  GLOBUS_L_GSC_OP_TYPE_CREATE_PASV,
190  GLOBUS_L_GSC_OP_TYPE_CREATE_PORT,
191  GLOBUS_L_GSC_OP_TYPE_SEND,
192  GLOBUS_L_GSC_OP_TYPE_RECV,
193  GLOBUS_L_GSC_OP_TYPE_DESTROY,
194  GLOBUS_L_GSC_OP_TYPE_LIST,
195  GLOBUS_L_GSC_OP_TYPE_NLST,
196  GLOBUS_L_GSC_OP_TYPE_MLSD,
197  GLOBUS_L_GSC_OP_TYPE_MLSR
198 } globus_i_gsc_op_type_t;
199 
200 typedef struct globus_i_gsc_event_data_s
201 {
202  globus_l_gsc_data_obj_state_t state;
203  globus_callback_handle_t periodic_handle;
204  int stripe_count;
205  globus_bool_t perf_running;
206 
207  globus_callback_handle_t restart_handle;
208  globus_bool_t restart_running;
209 
210  int event_mask;
211  globus_gridftp_server_control_event_cb_t user_cb;
212  void * user_arg;
213 
214  globus_off_t * stripe_total;
215 } globus_i_gsc_event_data_t;
216 
217 typedef struct globus_i_gsc_handle_opts_s
218 {
219  char mlsx_fact_str[16];
220  int parallelism;
221  globus_size_t send_buf;
222  globus_size_t receive_buf;
223  globus_bool_t refresh;
224  globus_size_t packet_size;
225  globus_bool_t delayed_passive;
226  globus_bool_t passive_only;
227  int perf_frequency;
228  int retr_perf_frequency;
229  int restart_frequency;
230  globus_gsc_layout_t layout;
231  globus_size_t block_size;
232  int mlsr_traversal_options;
233 } globus_i_gsc_handle_opts_t;
234 
235 typedef struct globus_i_gsc_module_func_s
236 {
237  char * key;
238  globus_gridftp_server_control_transfer_cb_t func;
239  void * user_arg;
240 } globus_i_gsc_module_func_t;
241 
242 typedef struct globus_i_gsc_user_funcs_s
243 {
244  globus_hashtable_t send_cb_table;
245  globus_hashtable_t recv_cb_table;
246  globus_gridftp_server_control_transfer_cb_t default_send_cb;
247  void * default_send_arg;
248  globus_gridftp_server_control_transfer_cb_t default_recv_cb;
249  void * default_recv_arg;
250  globus_gridftp_server_control_auth_cb_t auth_cb;
251  void * auth_arg;
252  globus_gridftp_server_control_passive_connect_cb_t passive_cb;
253  void * passive_arg;
254  globus_gridftp_server_control_active_connect_cb_t active_cb;
255  void * active_arg;
256  globus_gridftp_server_control_data_destroy_cb_t data_destroy_cb;
257  void * data_destroy_arg;
258  globus_gridftp_server_control_list_cb_t list_cb;
259  void * list_arg;
260  globus_gridftp_server_control_resource_cb_t resource_cb;
261  void * resource_arg;
262  globus_gridftp_server_control_cb_t done_cb;
263  void * done_arg;
264  globus_gridftp_server_control_log_cb_t log_func;
265  int log_mask;
266  void * log_arg;
267 } globus_i_gsc_user_funcs_t;
268 
269 typedef struct globus_i_gsc_op_s
270 {
271  globus_i_gsc_op_type_t type;
272 
273  int ref;
274  struct globus_i_gsc_server_handle_s * server_handle;
275 
276  globus_gridftp_server_control_response_t response_type;
277  char * response_msg;
278 
279  globus_list_t * cmd_list;
280  globus_bool_t done;
281 
282  /* stuff for auth */
283  globus_bool_t authenticated;
284  char * username;
285  char * password;
286  globus_i_gsc_auth_cb_t auth_cb;
287  globus_i_gsc_resource_cb_t stat_cb;
288  globus_i_gsc_transfer_cb_t list_cb;
289 
291  int stat_count;
292  globus_mutex_t stat_lock;
293 
294  /* stuff for resource */
295  int uid;
296  int gid_count;
297  int * gid_array;
298  char * path;
299  char * glob_match_str;
300  globus_gridftp_server_control_resource_mask_t mask;
301 
302  /* stuff for port/pasv */
303  char ** cs;
304  int max_cs;
305  int net_prt;
306  globus_i_gsc_passive_cb_t passive_cb;
307  globus_i_gsc_port_cb_t port_cb;
308  globus_i_gsc_transfer_cb_t transfer_cb;
309 
310  char * command;
311 
312  /* stuff for transfer */
313  char * mod_name;
314  char * mod_parms;
315  globus_gridftp_server_control_transfer_cb_t user_data_cb;
316  globus_bool_t transfer_started;
317 
318  globus_range_list_t range_list;
319  globus_range_list_t perf_range_list;
320  globus_i_gsc_event_data_t event;
321 
322  globus_bool_t aborted;
323  void * abort_user_arg;
324  void * user_arg;
325 
326  globus_i_gsc_data_t * data_destroy_obj;
327 } globus_i_gsc_op_t;
328 
329 typedef struct globus_i_gsc_attr_s
330 {
331  int version_ctl;
332  char * modes;
333  char * types;
334  char * base_dir;
335  char * post_auth_banner;
336  char * pre_auth_banner;
337  globus_gridftp_server_control_security_type_t security;
338 
339  int idle_timeout;
340  int preauth_timeout;
341 
342  globus_i_gsc_user_funcs_t funcs;
343 } globus_i_gsc_attr_t;
344 
345 
346 extern globus_hashtable_t globus_i_gs_default_attr_command_hash;
347 
348 /*
349  * internal functions for adding commands.
350  */
351 
352 /*
353  * 959 Structures
354  */
355 typedef enum globus_l_gsc_state_e
356 {
357  GLOBUS_L_GSC_STATE_NONE,
358  GLOBUS_L_GSC_STATE_OPENING,
359  GLOBUS_L_GSC_STATE_OPEN,
360  GLOBUS_L_GSC_STATE_PROCESSING,
361  GLOBUS_L_GSC_STATE_ABORTING,
362  GLOBUS_L_GSC_STATE_ABORTING_STOPPING,
363  GLOBUS_L_GSC_STATE_STOPPING,
364  GLOBUS_L_GSC_STATE_STOPPED
365 } globus_l_gsc_state_t;
366 
367 
368 typedef struct globus_i_gsc_cmd_wrapper_s
369 {
370  globus_i_gsc_op_t * op;
371  char * strarg;
372  char * mod_name;
373  char * mod_parms;
374  char * path;
375 
376  globus_bool_t transfer_flag;
377  int dc_parsing_alg;
378  int max;
379  globus_gridftp_server_control_network_protocol_t prt;
380 
381  globus_i_gsc_op_type_t type;
382  int cmd_ndx;
383 
384  char ** cs;
385  int cs_count;
386  int reply_code;
387 
388  struct globus_i_gsc_cmd_wrapper_s * transfer_info;
389 } globus_i_gsc_cmd_wrapper_t;
390 
391 /* the server handle */
392 typedef struct globus_i_gsc_server_handle_s
393 {
394  int version_ctl;
395 
396  globus_mutex_t mutex;
397 
398  /*
399  * authentication information
400  */
401  int ref;
402  globus_bool_t timeout;
403 
404  char * username;
405  char * pw;
406  char * subject;
407  char dcau;
408  char * dcau_subject;
409  char prot;
410  globus_bool_t authenticated;
411 
412  char * post_auth_banner;
413  char * pre_auth_banner;
414 
415  gss_ctx_id_t context;
416  gss_cred_id_t cred;
417  gss_cred_id_t del_cred;
418  globus_gridftp_server_control_security_type_t security_type;
419 
420  /*
421  * state information
422  */
423  char * cwd;
424  char * default_cwd;
425  char type;
426  char mode;
427  char * modes;
428  char * types;
429  int stripe_count;
430  char * lang;
431 
432  globus_off_t allocated_bytes;
433 
434  /* force failure on this command */
435  char * fault_cmd;
436 
437  /* opts state */
438  globus_i_gsc_handle_opts_t opts;
439 
440  /*
441  * user function pointers
442  */
443  globus_range_list_t range_list;
444 
445  globus_i_gsc_user_funcs_t funcs;
446 
447  globus_i_gsc_data_t * data_object;
448 
449  globus_result_t cached_res;
450  globus_list_t * feature_list;
451 
452  /*
453  * read.c members
454  */
455  globus_list_t * all_cmd_list;
456  globus_bool_t reply_outstanding;
457  globus_xio_handle_t xio_handle;
458  globus_l_gsc_state_t state;
459  globus_fifo_t read_q;
460  globus_fifo_t reply_q;
461  int abort_cnt;
462  globus_hashtable_t cmd_table;
463  globus_hashtable_t site_cmd_table;
464  globus_hashtable_t data_object_table;
465  struct globus_i_gsc_op_s * outstanding_op;
466 
467  globus_bool_t terminating;
468 
469  int idle_timeout;
470  int preauth_timeout;
471 
472  globus_i_gsc_cmd_wrapper_t * pasv_info;
473 
474  globus_bool_t q_backup;
475  int max_q_len;
476 } globus_i_gsc_server_handle_t;
477 
478 
479 void
480 globus_i_gsc_reverse_restart(
481  globus_range_list_t in_range,
482  globus_range_list_t out_range);
483 
484 void
485 globus_i_gsc_op_destroy(
486  globus_i_gsc_op_t * op);
487 
488 void
489 globus_i_gsc_event_start(
490  globus_i_gsc_op_t * op,
491  int event_mask,
492  globus_gridftp_server_control_event_cb_t event_cb,
493  void * user_arg);
494 
495 void
496 globus_i_gsc_event_end(
497  globus_i_gsc_op_t * op);
498 
499 char *
500 globus_i_gsc_get_help(
501  globus_i_gsc_server_handle_t * server_handle,
502  const char * command_name);
503 
505 globus_i_gsc_intermediate_reply(
506  globus_i_gsc_op_t * op,
507  char * reply_msg);
508 
510 globus_i_gsc_authenticate(
511  globus_i_gsc_op_t * op,
512  const char * user,
513  const char * pass,
514  globus_i_gsc_auth_cb_t cb,
515  void * user_arg);
516 
518 globus_i_gsc_list(
519  globus_i_gsc_op_t * op,
520  const char * path,
521  globus_gridftp_server_control_resource_mask_t mask,
522  globus_i_gsc_op_type_t type,
523  globus_i_gsc_transfer_cb_t list_cb,
524  void * user_arg);
525 
527 globus_i_gsc_resource_query(
528  globus_i_gsc_op_t * op,
529  const char * path,
530  globus_gridftp_server_control_resource_mask_t mask,
531  globus_i_gsc_resource_cb_t cb,
532  void * user_arg);
533 
535 globus_i_gsc_passive(
536  globus_i_gsc_op_t * op,
537  int max,
538  int net_prt,
539  const char * pathname,
540  globus_i_gsc_passive_cb_t cb,
541  void * user_arg);
542 
544 globus_i_gsc_port(
545  globus_i_gsc_op_t * op,
546  const char ** contact_strings,
547  int stripe_count,
548  int net_prt,
549  globus_i_gsc_port_cb_t cb,
550  void * user_arg);
551 
553 globus_i_gsc_send(
554  globus_i_gsc_op_t * op,
555  const char * path,
556  const char * mod_name,
557  const char * mod_parms,
558  globus_i_gsc_transfer_cb_t data_cb,
559  void * user_arg);
560 
562 globus_i_gsc_recv(
563  globus_i_gsc_op_t * op,
564  const char * path,
565  const char * mod_name,
566  const char * mod_parms,
567  globus_i_gsc_transfer_cb_t data_cb,
568  void * user_arg);
569 
570 void
571 globus_i_gsc_add_commands(
572  globus_i_gsc_server_handle_t * server_handle);
573 
575 globus_i_gsc_command_panic(
576  globus_i_gsc_op_t * op);
577 
578 char *
579 globus_i_gsc_concat_path(
580  globus_i_gsc_server_handle_t * i_server,
581  const char * in_path);
582 
583 char *
584 globus_i_gsc_list_single_line(
586 
587 char *
588 globus_i_gsc_list_line(
590  int stat_count,
591  const char * glob_match_str);
592 
593 char *
594 globus_i_gsc_nlst_line(
596  int stat_count);
597 
598 char *
599 globus_i_gsc_mlsx_line_single(
600  const char * mlsx_fact_str,
601  int uid,
603  const char * base_path,
604  globus_bool_t mlst);
605 
606 char *
607 globus_i_gsc_mlsx_line(
609  int stat_count,
610  const char * mlsx_fact_string,
611  uid_t uid,
612  const char * base_path,
613  globus_bool_t indent);
614 
615 void
616 globus_i_guc_command_data_destroy(
617  globus_i_gsc_server_handle_t * server_handle);
618 
619 void
620 globus_i_gsc_log(
621  globus_i_gsc_server_handle_t * server_handle,
622  const char * command,
623  int mask);
624 
626 globus_i_guc_data_object_destroy(
627  globus_i_gsc_server_handle_t * server_handle,
628  globus_i_gsc_data_t * data_object);
629 
631 globus_i_gsc_cmd_intermediate_reply(
632  globus_i_gsc_op_t * op,
633  char * reply_msg);
634 
635 void
636 globus_i_gsc_event_start_perf_restart(
637  globus_i_gsc_op_t * op);
638 
639 void
640 globus_gsc_959_terminate(
641  globus_i_gsc_op_t * op,
642  char * reply_msg);
643 
644 #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:43
Header file for XIO TCP Driver.
Mutex.
Definition: globus_thread.h:107
Definition: globus_gridftp_server_control.h:204
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