/usr/include/proftpd/ctrls.h is in proftpd-dev 1.3.5~rc3-2.1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 | /*
* ProFTPD - FTP server daemon
* Copyright (c) 2001-2013 The ProFTPD Project team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
*
* As a special exemption, Public Flood Software/MacGyver aka Habeeb J. Dihu
* and other respective copyright holders give permission to link this program
* with OpenSSL, and distribute the resulting executable, without including
* the source code for OpenSSL in the source distribution.
*/
/* Controls API definitions
* $Id: ctrls.h,v 1.9 2013/02/04 06:46:22 castaglia Exp $
*/
#ifndef PR_CTRLS_H
#define PR_CTRLS_H
#include <sys/un.h>
#include "conf.h"
/* Controls API build-time necessities
*/
/* mode for control socket */
#define PR_CTRLS_MODE 0777
/* mode for client sockets */
#define PR_CTRLS_CL_MODE S_IRWXU
/* Controls API objects
*/
/* Controls client object */
typedef struct cl_obj {
struct cl_obj *cl_next, *cl_prev;
/* Pool for this object's use */
pool *cl_pool;
/* Client socket file descriptor */
int cl_fd;
/* Credentials of the connecting client */
uid_t cl_uid;
const char *cl_user;
gid_t cl_gid;
const char *cl_group;
pid_t cl_pid;
/* For internal use only */
volatile unsigned long cl_flags;
/* Pointers to all controls matching client request */
array_header *cl_ctrls;
} pr_ctrls_cl_t;
/* Controls client flag values
*/
#define PR_CTRLS_CL_HAVEREQ 0x001
#define PR_CTRLS_CL_HAVERESP 0x002
#define PR_CTRLS_CL_NOACCESS 0x004
#define PR_CTRLS_CL_NOACTION 0x010
#define PR_CTRLS_CL_BLOCKED 0x020
/* Controls handler object */
typedef struct ctrls_obj {
struct ctrls_obj *ctrls_next, *ctrls_prev;
/* Object ID */
unsigned int ctrls_id;
/* Registering module */
const module *ctrls_module;
/* Requesting client */
pr_ctrls_cl_t *ctrls_cl;
/* Control "action" */
const char *ctrls_action;
/* Control trigger time. If 0, triggers immediately */
time_t ctrls_when;
/* Simple description/help text */
const char *ctrls_desc;
/* Temporary pool */
pool *ctrls_tmp_pool;
/* Control handler callback */
int (*ctrls_cb)(struct ctrls_obj *, int, char **);
/* Control handler callback arguments */
array_header *ctrls_cb_args;
/* Control handler callback return value. Used to determine when to clear
* this object from the requested list
*/
int ctrls_cb_retval;
/* Control handler callback responses */
array_header *ctrls_cb_resps;
/* For possibly passing data among control handlers */
void *ctrls_data;
/* For internal use */
volatile unsigned long ctrls_flags;
} pr_ctrls_t;
#define PR_CTRLS_REQUESTED 0x00001
#define PR_CTRLS_HANDLED 0x00002
#define PR_CTRLS_PENDING 0x00004
#define PR_CTRLS_ACT_SOLITARY 0x00010
#define PR_CTRLS_ACT_DISABLED 0x00020
#define CTRLS_GET_ACTION_ALL 7
#define CTRLS_GET_ACTION_ENABLED 8
#define CTRLS_GET_DESC 9
/* Controls API prototypes
*/
/* Register a control handler for the given action with the Controls layer,
* to be available to requesting clients. Returns the ID of the registered
* handler, or -1 if there was an error.
*/
int pr_ctrls_register(const module *mod, const char *action,
const char *desc, int (*ctrls_cb)(pr_ctrls_t *, int, char **));
/* Unregisters any control handlers that match the given module/action pair.
* If the module argument is null, then the specified action for all modules
* is unregistered. If the action argument is null, then all actions for the
* specified module are unregistered.
*
* Returns 0 on success, -1 on failure.
*/
int pr_ctrls_unregister(module *mod, const char *action);
/* Add the given ctrls_arg string to the pr_ctrls_t object's argument
* array. Returns 0 on success, -1 on failure.
*/
int pr_ctrls_add_arg(pr_ctrls_t *ctrl, char *ctrls_arg, size_t ctrls_arglen);
/* Add the given string to the pr_ctrls_t object's response array. Returns
* 0 on success, -1 on failure. Control handlers can use this function to
* add a text response to be returned to the requesting client.
*/
int pr_ctrls_add_response(pr_ctrls_t *ctrl, char *fmt, ...)
#ifdef __GNUC__
__attribute__ ((format (printf, 2, 3)));
#else
;
#endif
/* Meant for use in opening a client control socket, by ftpdctl and core
* routines. Connects to the control socket, and returns the socket descriptor
* opened, or -1 if there was an error.
*/
int pr_ctrls_connect(const char *socket_file);
int pr_ctrls_copy_args(pr_ctrls_t *src_ctrl, pr_ctrls_t *dest_ctrl);
int pr_ctrls_copy_resps(pr_ctrls_t *src_ctrl, pr_ctrls_t *dest_ctrl);
/* Flush any responses added to the pr_ctrls_t out the client. This should
* only be used when the control handler will not return (as when it is
* going to end the process then and there). Returns -1 with errno set to
* EINVAL if the given pointer is NULL, EPERM if unable to flush the responses
* out to the client. Returns 0 on success.
*/
int pr_ctrls_flush_response(pr_ctrls_t *ctrl);
/* Parses the given string into the argc, argv pointers, creating inputs
* suitable for passing to pr_ctrls_send_msg(). The argv array of strings
* is allocated from the given pool. Provided as a utility function.
* Returns -1 on error, 0 if successful.
*/
int pr_ctrls_parse_msg(pool *msg_pool, char *msg, unsigned int *msgargc,
char ***msgargv);
/* Reads a client control request from the given client. Returns -1 with errno
* set to EOF if there is nothing to read from the client socket, or errno set
* to the appropriate error for other problems. Returns 0 on success.
*/
int pr_ctrls_recv_request(pr_ctrls_cl_t *cl);
/* respargv can be NULL, as when the client does not care to know the
* response messages, just that a response was successfully received.
* Returns respargc, or -1 if there was an error.
*/
int pr_ctrls_recv_response(pool *resp_pool, int ctrls_sockfd, int *status,
char ***respargv);
/* Useful for core routines that themselves want to send a control message
*/
int pr_ctrls_send_msg(int sockfd, int msgstatus, unsigned int msgargc,
char **msgargv);
/* Determine whether the given socket mode is for a Unix domain socket.
* Returns zero if true, -1 otherwise.
*/
int pr_ctrls_issock_unix(mode_t sock_mode);
/* Accept a Controls connection. Returns the fd of the connected client
* if successful, -1 (with errno set appropriately) otherwise.
*
* The optional uid, gid, and pid pointers, if provided, will be filled in
* with the uid, gid, and pid of the connecting client process. These can
* be used e.g. for access control checks. The max_age parameter specifies
* the maximum age, in seconds, for the connecting client; this is used
* for some types of credentials checking.
*/
int pr_ctrls_accept(int sockfd, uid_t *uid, gid_t *gid, pid_t *pid,
unsigned int max_age);
int pr_get_registered_actions(pr_ctrls_t *ctrl, int flags);
int pr_set_registered_actions(module *mod, const char *action,
unsigned char skip_disabled, unsigned int flags);
/* Blocks ctrls from being run. */
void pr_block_ctrls(void);
/* Unblocks ctrls from being run. */
void pr_unblock_ctrls(void);
/* XXX */
int pr_check_actions(void);
/* Iterate through the list of pr_ctrls_ts and invoke the callbacks of any
* that match the given module and action arguments. Returns 0 if successful,
* -1 if error (eg controls are blocked).
*/
int pr_run_ctrls(module *mod, const char *action);
/* XXX */
int pr_reset_ctrls(void);
/* For internal use only. */
void init_ctrls(void);
#endif /* PR_CTRLS_H */
|