globus_connect_gridftp_server 17.0~rc3
Loading...
Searching...
No Matches
globus_gridftp_server_control.h
1
2#if !defined GLOBUS_GRIDFTP_SERVER_CONTROL_H
3#define GLOBUS_GRIDFTP_SERVER_CONTROL_H
4
5#include "globus_xio.h"
6#include "globus_common.h"
7#include "globus_gss_assist.h"
8#include "globus_xio_system.h"
9
10#ifndef TARGET_ARCH_WIN32
11#include <grp.h>
12
13#else
14typedef int gid_t;
15
16struct passwd
17{
18 char *pw_name;
19 char *pw_passwd;
20 int pw_uid;
21 int pw_gid;
22 char *pw_comment;
23 char *pw_gecos;
24 char *pw_dir;
25 char *pw_shell;
26};
27
28struct group
29{
30 char *gr_name;
31 char *gr_passwd;
32 gid_t gr_gid;
33 char **gr_mem;
34};
35
36#endif /* WIN32 */
37
38typedef struct globus_i_gsc_server_handle_s * globus_gridftp_server_control_t;
39typedef struct globus_i_gsc_attr_s * globus_gridftp_server_control_attr_t;
40typedef struct globus_i_gsc_op_s * globus_gridftp_server_control_op_t;
41typedef struct globus_i_gsc_op_s * globus_gsc_959_op_t;
42typedef time_t globus_time_t;
43
44/***********************************************************************
45 * error types
46 * -----------
47 **********************************************************************/
48typedef enum globus_gsc_error_type_e
49{
50 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_PANIC,
51 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_SYSTEM_RESOURCE,
52 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_AUTHENTICATION,
53 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_READ_ERROR,
54 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_SYNTAX
55} globus_gridftp_server_control_error_type_t;
56
57typedef enum globus_gsc_response_e
58{
59 /* user command errors */
60 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_SUCCESS,
61 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_ACTION_FAILED,
62 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_PATH_INVALID,
63 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_INVALID_FILE_TYPE,
64 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_ACCESS_DENINED,
65 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_DATA_CONN_TERMINATED,
66 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_DATA_CONN_FAILED,
67 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_DATA_CONN_AUTH,
68 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_PANIC,
69 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_PARTIAL_SUCCESS,
70 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_MIN_FTP_ERROR = 400,
71 GLOBUS_GRIDFTP_SERVER_CONTROL_RESPONSE_MAX_FTP_ERROR = 599
72} globus_gridftp_server_control_response_t;
73
74#ifdef __GNUC__
75#define GlobusGridFTPServerName(func) static const char * _gridftp_server_name __attribute__((__unused__)) = #func
76#else
77#define GlobusGridFTPServerName(func) static const char * _gridftp_server_name = #func
78#endif
79
80#define _FSCSL(s) globus_common_i18n_get_string( \
81 GLOBUS_GRIDFTP_SERVER_CONTROL_MODULE, \
82 s)
83
84#define _FSMSL(s) globus_common_i18n_get_string_by_key( \
85 NULL, \
86 GLOBUS_GRIDFTP_SERVER_CONTROL_MODULE->module_name, \
87 s)
88
89
90#define GlobusGridFTPServerErrorParameter(param_name) \
91 globus_error_put( \
92 globus_error_construct_error( \
93 GLOBUS_GRIDFTP_SERVER_CONTROL_MODULE, \
94 GLOBUS_NULL, \
95 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_PARAMETER, \
96 __FILE__, \
97 _gridftp_server_name, \
98 __LINE__, \
99 "Bad parameter, %s", \
100 (param_name)))
101
102#define GlobusGridFTPServerControlErrorSyntax() \
103 globus_error_put( \
104 globus_error_construct_error( \
105 GLOBUS_GRIDFTP_SERVER_CONTROL_MODULE, \
106 GLOBUS_NULL, \
107 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_SYNTAX, \
108 __FILE__, \
109 _gridftp_server_name, \
110 __LINE__, \
111 "Syntax error"))
112
113#define GlobusGridFTPServerControlErrorPanic() \
114 globus_error_put( \
115 globus_error_construct_error( \
116 GLOBUS_GRIDFTP_SERVER_CONTROL_MODULE, \
117 GLOBUS_NULL, \
118 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_PANIC, \
119 __FILE__, \
120 _gridftp_server_name, \
121 __LINE__, \
122 "Panic error"))
123
124#define GlobusGridFTPServerControlErrorSystem() \
125 globus_error_put( \
126 globus_error_construct_error( \
127 GLOBUS_GRIDFTP_SERVER_CONTROL_MODULE, \
128 GLOBUS_NULL, \
129 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_SYSTEM_RESOURCE, \
130 __FILE__, \
131 _gridftp_server_name, \
132 __LINE__, \
133 "System resource error"))
134
135// For compatibility with old mispelled macro - deprecated
136#define GlobusGridFTPServerControlErrorSytem() \
137 GlobusGridFTPServerControlErrorSystem()
138
139#define GlobusGridFTPServerControlErrorAuthentication() \
140 globus_error_put( \
141 globus_error_construct_error( \
142 GLOBUS_GRIDFTP_SERVER_CONTROL_MODULE, \
143 GLOBUS_NULL, \
144 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_AUTHENTICATION, \
145 __FILE__, \
146 _gridftp_server_name, \
147 __LINE__, \
148 "Authentication error"))
149
150#define GlobusGridFTPServerControlErrorRead(_base) \
151 globus_error_put( \
152 globus_error_construct_error( \
153 GLOBUS_GRIDFTP_SERVER_CONTROL_MODULE, \
154 GLOBUS_NULL, \
155 GLOBUS_GRIDFTP_SERVER_CONTROL_ERROR_READ_ERROR, \
156 __FILE__, \
157 _gridftp_server_name, \
158 __LINE__, \
159 "Error reading the control channel."))
160
161
162#define GLOBUS_GRIDFTP_SERVER_LIBRARY_DYNAMIC_FILE_MASK 010000000
163/*
164 * globus_gridftp_server_control_security_type_t
165 * ---------------------------------------------
166 * The allowed security modes. Can be a mask of more than 1 selection.
167 */
168typedef enum globus_gsc_security_type_e
169{
170 GLOBUS_GRIDFTP_SERVER_LIBRARY_NONE = 0x01,
171 GLOBUS_GRIDFTP_SERVER_LIBRARY_GSSAPI = 0x02,
172 GLOBUS_GRIDFTP_SERVER_LIBRARY_TLS = 0x04
173} globus_gridftp_server_control_security_type_t;
174
175typedef enum globus_gsc_layout_e
176{
177 GLOBUS_GSC_LAYOUT_TYPE_NONE = 0,
178 GLOBUS_GSC_LAYOUT_TYPE_PARTITIONED,
179 GLOBUS_GSC_LAYOUT_TYPE_BLOCKED
180} globus_gsc_layout_t;
181
182typedef enum globus_gridftp_server_control_stat_error_e
183{
184 GLOBUS_GRIDFTP_SERVER_CONTROL_STAT_SUCCESS = 0,
185 GLOBUS_GRIDFTP_SERVER_CONTROL_STAT_OPENFAILED,
186 GLOBUS_GRIDFTP_SERVER_CONTROL_STAT_INVALIDLINK,
187} globus_gridftp_server_control_stat_error_t;
188
189typedef enum globus_gfs_traversal_options_e {
190 GLOBUS_GFS_TRAVERSAL_CONTINUE = 1,
191 GLOBUS_GFS_TRAVERSAL_FOLLOW_SYMLINKS = 2
192} globus_gfs_traversal_options_t;
193
194
204{
205 int mode;
206 int nlink;
207 char * name;
208 char * symlink_target;
209 uid_t uid;
210 gid_t gid;
211 globus_off_t size;
212 globus_time_t atime;
213 globus_time_t ctime;
214 globus_time_t mtime;
215 int dev;
216 int ino;
217 int link_mode;
218 globus_gridftp_server_control_stat_error_t error;
219} globus_gridftp_server_control_stat_t;
220
228typedef enum globus_gridftp_server_control_network_protocol_e
229{
230 GLOBUS_GRIDFTP_SERVER_CONTROL_PROTOCOL_IPV4 = 1,
231 GLOBUS_GRIDFTP_SERVER_CONTROL_PROTOCOL_IPV6
232} globus_gridftp_server_control_network_protocol_t;
233
244typedef enum globus_i_gsc_data_dir_e
245{
246 GLOBUS_GRIDFTP_SERVER_CONTROL_DATA_DIR_RECV = 0x01,
247 GLOBUS_GRIDFTP_SERVER_CONTROL_DATA_DIR_SEND = 0x02,
248 GLOBUS_GRIDFTP_SERVER_CONTROL_DATA_DIR_BI = 0x03
249} globus_gridftp_server_control_data_dir_t;
250
258typedef enum globus_gridftp_server_control_event_type_e
259{
260 GLOBUS_GRIDFTP_SERVER_CONTROL_EVENT_PERF = 0x01,
261 GLOBUS_GRIDFTP_SERVER_CONTROL_EVENT_RESTART = 0x02,
262 GLOBUS_GRIDFTP_SERVER_CONTROL_EVENT_ABORT = 0x04,
263 GLOBUS_GRIDFTP_SERVER_CONTROL_EVENT_TRANSFER_COMPLETE = 0x08
264} globus_gridftp_server_control_event_type_t;
265
275typedef void
276(*globus_gridftp_server_control_auth_cb_t)(
277 globus_gridftp_server_control_op_t op,
278 globus_gridftp_server_control_security_type_t secure_type,
279 gss_ctx_id_t context,
280 const char * subject,
281 const char * user_name,
282 const char * pw,
283 void * user_arg);
284
291globus_result_t
292globus_gridftp_server_control_finished_auth(
293 globus_gridftp_server_control_op_t op,
294 const char * username,
295 globus_gridftp_server_control_response_t response_code,
296 const char * msg);
297
306typedef enum globus_gridftp_server_control_resource_mask_e
307{
308 GLOBUS_GRIDFTP_SERVER_CONTROL_RESOURCE_DIRECTORY_LIST = 1,
309 GLOBUS_GRIDFTP_SERVER_CONTROL_RESOURCE_FILE_ONLY = 2,
310 GLOBUS_GRIDFTP_SERVER_CONTROL_RESOURCE_USER_DEFINED = 3
311} globus_gridftp_server_control_resource_mask_t;
312
318typedef void
319(*globus_gridftp_server_control_cb_t)(
320 globus_gridftp_server_control_t server,
321 globus_result_t res,
322 void * user_arg);
323
334typedef void
335(*globus_gridftp_server_control_resource_cb_t)(
336 globus_gridftp_server_control_op_t op,
337 const char * path,
338 globus_gridftp_server_control_resource_mask_t mask,
339 void * user_arg);
340
341/*
342 * this function is called to tell the user that a data transfer
343 * has been requested by the client.
344 */
345typedef void
346(*globus_gridftp_server_control_transfer_cb_t)(
347 globus_gridftp_server_control_op_t op,
348 void * data_handle,
349 const char * local_target,
350 const char * mod_name,
351 const char * mod_parms,
352 globus_range_list_t range_list,
353 void * user_arg);
354
355typedef void
356(*globus_gridftp_server_control_list_cb_t)(
357 globus_gridftp_server_control_op_t op,
358 void * data_handle,
359 const char * path,
360 const char * fact_str,
361 int depth,
362 int traversal_options,
363 void * user_arg);
364
365globus_result_t
366globus_gridftp_server_control_list_buffer_alloc(
367 const char * fact_str,
368 uid_t uid,
369 const char * base_path,
370 globus_gridftp_server_control_stat_t * stat_info_array,
371 int stat_count,
372 globus_byte_t ** out_buf,
373 globus_size_t * out_size);
374
375void
376globus_gridftp_server_control_list_buffer_free(
377 globus_byte_t * buffer);
378
387enum
388{
389 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_SECURITY = 0x0001,
390 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_TRANSFER = 0x0004,
391 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_TRANSFER_STATE = 0x0008,
392 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_FILE_COMMANDS = 0x0010,
393 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_ERROR = 0x0020,
394 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_SITE = 0x0040,
395 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_LIST = 0x0080,
396 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_OTHER = 0x0100,
397 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_REPLY = 0x0400,
398 GLOBUS_GRIDFTP_SERVER_CONTROL_LOG_ALL = 0xFFFF
399};
400
401typedef void
402(*globus_gridftp_server_control_log_cb_t)(
403 globus_gridftp_server_control_t server_handle,
404 const char * full_command,
405 int cls,
406 void * user_arg);
407
420typedef void
421(*globus_gridftp_server_control_passive_connect_cb_t)(
422 globus_gridftp_server_control_op_t op,
423 globus_gridftp_server_control_network_protocol_t net_prt,
424 int max,
425 const char * pathname,
426 void * user_arg);
427
440typedef void
441(*globus_gridftp_server_control_active_connect_cb_t)(
442 globus_gridftp_server_control_op_t op,
443 globus_gridftp_server_control_network_protocol_t net_prt,
444 const char ** cs,
445 int cs_count,
446 void * user_arg);
447
456typedef void
457(*globus_gridftp_server_control_data_destroy_cb_t)(
458 void * user_data_handle,
459 void * user_arg);
460
461typedef void
462(*globus_gridftp_server_control_event_cb_t)(
463 globus_gridftp_server_control_op_t op,
464 int event_type,
465 void * user_arg);
466
467globus_result_t
468globus_gridftp_server_control_events_enable(
469 globus_gridftp_server_control_op_t op,
470 int event_mask,
471 globus_gridftp_server_control_event_cb_t event_cb,
472 void * user_arg);
473
474/*
475globus_result_t
476globus_gridftp_server_control_events_disable(
477 globus_gridftp_server_control_op_t op);
478*/
479
487globus_result_t
488globus_gridftp_server_control_finished_resource(
489 globus_gridftp_server_control_op_t op,
490 globus_gridftp_server_control_stat_t * stat_info_array,
491 int stat_count,
492 int uid,
493 int gid_count,
494 int * gid_array,
495 globus_gridftp_server_control_response_t response_code,
496 const char * msg);
497
498/**************************************************************************
499 * attr functions.
500 *
501 * self explaintory for now
502 *************************************************************************/
503globus_result_t
504globus_gridftp_server_control_attr_init(
505 globus_gridftp_server_control_attr_t * in_attr);
506
507globus_result_t
508globus_gridftp_server_control_attr_destroy(
509 globus_gridftp_server_control_attr_t in_attr);
510
511globus_result_t
512globus_gridftp_server_control_attr_copy(
513 globus_gridftp_server_control_attr_t * dst,
514 globus_gridftp_server_control_attr_t src);
515
516globus_result_t
517globus_gridftp_server_control_attr_set_resource(
518 globus_gridftp_server_control_attr_t in_attr,
519 globus_gridftp_server_control_resource_cb_t resource_cb,
520 void * user_arg);
521
522globus_result_t
523globus_gridftp_server_control_attr_set_auth(
524 globus_gridftp_server_control_attr_t in_attr,
525 globus_gridftp_server_control_auth_cb_t auth_cb,
526 void * user_arg);
527
528globus_result_t
529globus_gridftp_server_control_attr_set_list(
530 globus_gridftp_server_control_attr_t in_attr,
531 globus_gridftp_server_control_list_cb_t list_cb,
532 void * user_arg);
533
534globus_result_t
535globus_gridftp_server_control_attr_set_banner(
536 globus_gridftp_server_control_attr_t in_attr,
537 char * banner);
538
539globus_result_t
540globus_gridftp_server_control_attr_set_message(
541 globus_gridftp_server_control_attr_t in_attr,
542 char * message);
543
544globus_result_t
545globus_gridftp_server_control_attr_set_security(
546 globus_gridftp_server_control_attr_t in_attr,
547 globus_gridftp_server_control_security_type_t sec);
548
549globus_result_t
550globus_gridftp_server_control_attr_set_idle_time(
551 globus_gridftp_server_control_attr_t in_attr,
552 int idle_timeout,
553 int preauth_timeout);
554
555/*
556 * if module name is NULL then it is the default handler
557 */
558globus_result_t
559globus_gridftp_server_control_attr_add_recv(
560 globus_gridftp_server_control_attr_t in_attr,
561 const char * module_name,
562 globus_gridftp_server_control_transfer_cb_t recv_func,
563 void * user_arg);
564
565globus_result_t
566globus_gridftp_server_control_attr_add_send(
567 globus_gridftp_server_control_attr_t in_attr,
568 const char * module_name,
569 globus_gridftp_server_control_transfer_cb_t send_func,
570 void * user_arg);
571
572globus_result_t
573globus_gridftp_server_control_attr_data_functions(
574 globus_gridftp_server_control_attr_t server_attr,
575 globus_gridftp_server_control_active_connect_cb_t active_cb,
576 void * active_arg,
577 globus_gridftp_server_control_passive_connect_cb_t passive_cb,
578 void * passive_arg,
579 globus_gridftp_server_control_data_destroy_cb_t destroy_cb,
580 void * destroy_arg);
581
582globus_result_t
583globus_gridftp_server_control_attr_set_log(
584 globus_gridftp_server_control_attr_t server_attr,
585 globus_gridftp_server_control_log_cb_t log_func,
586 int log_mask,
587 void * user_arg);
588
596globus_result_t
597globus_gridftp_server_control_init(
598 globus_gridftp_server_control_t * server);
599
606globus_result_t
607globus_gridftp_server_control_destroy(
608 globus_gridftp_server_control_t server);
609
621globus_result_t
622globus_gridftp_server_control_start(
623 globus_gridftp_server_control_t server,
624 globus_gridftp_server_control_attr_t attr,
625 globus_xio_system_socket_t system_handle,
626 globus_gridftp_server_control_cb_t done_cb,
627 void * user_arg);
628
637globus_result_t
638globus_gridftp_server_control_stop(
639 globus_gridftp_server_control_t server);
640
641/*
642 * setters and getters
643 */
644globus_result_t
645globus_gridftp_server_control_get_allocated(
646 globus_gridftp_server_control_op_t op,
647 globus_off_t * out_allo);
648
649globus_result_t
650globus_gridftp_server_control_get_layout(
651 globus_gridftp_server_control_op_t op,
652 globus_gsc_layout_t * layout_type,
653 globus_size_t * block_size);
654
655globus_result_t
656globus_gridftp_server_control_get_buffer_size(
657 globus_gridftp_server_control_op_t op,
658 globus_size_t * out_recv_bs,
659 globus_size_t * out_send_bs);
660
661globus_result_t
662globus_gridftp_server_control_get_parallelism(
663 globus_gridftp_server_control_op_t op,
664 int * out_parallelism);
665
666globus_result_t
667globus_gridftp_server_control_get_mode(
668 globus_gridftp_server_control_op_t op,
669 char * out_mode);
670
671globus_result_t
672globus_gridftp_server_control_get_type(
673 globus_gridftp_server_control_op_t op,
674 char * out_type);
675
676globus_result_t
677globus_gridftp_server_control_get_cwd(
678 globus_gridftp_server_control_t server,
679 char ** cwd_string);
680
681globus_result_t
682globus_gridftp_server_control_set_cwd(
683 globus_gridftp_server_control_t server,
684 const char * cwd_string);
685
686globus_result_t
687globus_gridftp_server_control_get_data_auth(
688 globus_gridftp_server_control_op_t op,
689 char ** subject,
690 char * dcau,
691 char * prot,
692 gss_cred_id_t * del_cred);
693
694globus_bool_t
695globus_gridftp_server_control_authenticated(
696 globus_gridftp_server_control_t server);
697
698/***************************************************************************
699 * data object
700 *
701 * The server uses the following interface functions for communication
702 * with the user data connection needs. The user is responisible for
703 * bringing up the data connection. This library will manage when a new
704 * data connection must be created, but it relies on the user to actually
705 * make the connection.
706 **************************************************************************/
707
719globus_result_t
720globus_gridftp_server_control_finished_active_connect(
721 globus_gridftp_server_control_op_t op,
722 void * user_data_handle,
723 globus_gridftp_server_control_data_dir_t data_dir,
724 globus_gridftp_server_control_response_t response_code,
725 const char * msg);
726
738globus_result_t
739globus_gridftp_server_control_finished_passive_connect(
740 globus_gridftp_server_control_op_t op,
741 void * user_data_handle,
742 globus_gridftp_server_control_data_dir_t data_dir,
743 const char ** cs,
744 int cs_count,
745 globus_gridftp_server_control_response_t response_code,
746 const char * msg);
747
757globus_result_t
758globus_gridftp_server_control_disconnected(
759 globus_gridftp_server_control_t server,
760 void * user_data_handle);
761
773globus_result_t
774globus_gridftp_server_control_begin_transfer(
775 globus_gridftp_server_control_op_t op);
776
784globus_result_t
785globus_gridftp_server_control_finished_transfer(
786 globus_gridftp_server_control_op_t op,
787 globus_gridftp_server_control_response_t response_code,
788 const char * msg);
789
790globus_result_t
791globus_gridftp_server_control_set_paths(
792 globus_gridftp_server_control_op_t op,
793 const char * absolute_path,
794 const char * resolved_path);
795
796globus_result_t
797globus_gridftp_server_control_add_feature(
798 globus_gridftp_server_control_t server,
799 const char * feature);
800
801
802/* use with care, not *external* external */
803typedef enum globus_gsc_959_command_desc_e
804{
805 GLOBUS_GSC_COMMAND_POST_AUTH = 0x01,
806 GLOBUS_GSC_COMMAND_PRE_AUTH = 0x02
807} globus_gsc_959_command_desc_t;
808
809char *
810globus_gsc_string_to_959(
811 int code,
812 const char * in_str,
813 const char * preline);
814
815typedef void
816(*globus_gsc_959_command_cb_t)(
817 globus_gsc_959_op_t op,
818 const char * full_command,
819 char ** cmd_array,
820 int argc,
821 void * user_arg);
822
823globus_result_t
824globus_gsc_959_command_add(
825 globus_gridftp_server_control_t server,
826 const char * command_name,
827 globus_gsc_959_command_cb_t command_cb,
828 globus_gsc_959_command_desc_t desc,
829 int min_argc,
830 int max_argc,
831 const char * help,
832 void * user_arg);
833
834globus_result_t
835globus_gsc_959_command_remove(
836 globus_gridftp_server_control_t server,
837 const char * command_name);
838
839void
840globus_gsc_959_finished_command(
841 globus_gsc_959_op_t op,
842 char * reply_msg);
843
844globus_result_t
845globus_gridftp_server_control_event_send_perf(
846 globus_gridftp_server_control_op_t op,
847 int stripe_ndx,
848 globus_off_t nbytes);
849
850globus_result_t
851globus_gridftp_server_control_event_send_restart(
852 globus_gridftp_server_control_op_t op,
853 globus_range_list_t restart);
854
855
856void
857globus_gridftp_server_control_421_end(
858 globus_gridftp_server_control_t server,
859 char * reply_msg);
860
861extern globus_module_descriptor_t globus_i_gsc_module;
862
863#define GLOBUS_GRIDFTP_SERVER_CONTROL_MODULE (&globus_i_gsc_module)
864
865#endif
Definition globus_gridftp_server_control.h:204