105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Hook for making making file descriptor functions close(), ioctl() extensible.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2009-2012 Free Software Foundation, Inc.
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify it
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   under the terms of the GNU General Public License as published
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   by the Free Software Foundation; either version 3 of the License, or
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but WITHOUT ANY WARRANTY; without even the implied warranty of
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   General Public License for more details.
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef FD_HOOK_H
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define FD_HOOK_H
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern "C" {
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Currently, this entire code is only needed for the handling of sockets
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   on native Windows platforms.  */
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if WINDOWS_SOCKETS
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Type of function that closes FD.  */
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef int (*gl_close_fn) (int fd);
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Type of function that applies a control request to FD.  */
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef int (*gl_ioctl_fn) (int fd, int request, void *arg);
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* An element of the list of file descriptor hooks.
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   In CLOS (Common Lisp Object System) speak, it consists of an "around"
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   method for the close() function and an "around" method for the ioctl()
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   function.
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   The fields of this structure are considered private.  */
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstruct fd_hook
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Doubly linked list.  */
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  struct fd_hook *private_next;
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  struct fd_hook *private_prev;
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Function that treats the types of FD that it knows about and calls
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     execute_close_hooks (REMAINING_LIST, PRIMARY, FD) as a fallback.  */
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int (*private_close_fn) (const struct fd_hook *remaining_list,
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           gl_close_fn primary,
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           int fd);
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Function that treats the types of FD that it knows about and calls
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) as a
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     fallback.  */
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int (*private_ioctl_fn) (const struct fd_hook *remaining_list,
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           gl_ioctl_fn primary,
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           int fd, int request, void *arg);
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* This type of function closes FD, applying special knowledge for the FD
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   types it knows about, and calls
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   execute_close_hooks (REMAINING_LIST, PRIMARY, FD)
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   for the other FD types.
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   In CLOS speak, REMAINING_LIST is the remaining list of "around" methods,
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   and PRIMARY is the "primary" method for close().  */
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef int (*close_hook_fn) (const struct fd_hook *remaining_list,
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              gl_close_fn primary,
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              int fd);
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Execute the close hooks in REMAINING_LIST, with PRIMARY as "primary" method.
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Return 0 or -1, like close() would do.  */
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern int execute_close_hooks (const struct fd_hook *remaining_list,
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                gl_close_fn primary,
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                int fd);
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Execute all close hooks, with PRIMARY as "primary" method.
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Return 0 or -1, like close() would do.  */
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern int execute_all_close_hooks (gl_close_fn primary, int fd);
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* This type of function applies a control request to FD, applying special
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   knowledge for the FD types it knows about, and calls
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG)
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   for the other FD types.
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   In CLOS speak, REMAINING_LIST is the remaining list of "around" methods,
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   and PRIMARY is the "primary" method for ioctl().  */
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef int (*ioctl_hook_fn) (const struct fd_hook *remaining_list,
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              gl_ioctl_fn primary,
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              int fd, int request, void *arg);
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Execute the ioctl hooks in REMAINING_LIST, with PRIMARY as "primary" method.
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Return 0 or -1, like ioctl() would do.  */
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern int execute_ioctl_hooks (const struct fd_hook *remaining_list,
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                gl_ioctl_fn primary,
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                int fd, int request, void *arg);
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Execute all ioctl hooks, with PRIMARY as "primary" method.
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Return 0 or -1, like ioctl() would do.  */
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern int execute_all_ioctl_hooks (gl_ioctl_fn primary,
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                    int fd, int request, void *arg);
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Add a function pair to the list of file descriptor hooks.
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   CLOSE_HOOK and IOCTL_HOOK may be NULL, indicating no change.
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   The LINK variable points to a piece of memory which is guaranteed to be
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   accessible until the corresponding call to unregister_fd_hook.  */
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern void register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook,
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              struct fd_hook *link);
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Removes a hook from the list of file descriptor hooks.  */
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern void unregister_fd_hook (struct fd_hook *link);
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* FD_HOOK_H */
120