1/* 2 Unix SMB/CIFS implementation. 3 4 common events code for fd events 5 6 Copyright (C) Stefan Metzmacher 2009 7 8 ** NOTE! The following LGPL license applies to the tevent 9 ** library. This does NOT imply that all of Samba is released 10 ** under the LGPL 11 12 This library is free software; you can redistribute it and/or 13 modify it under the terms of the GNU Lesser General Public 14 License as published by the Free Software Foundation; either 15 version 3 of the License, or (at your option) any later version. 16 17 This library is distributed in the hope that it will be useful, 18 but WITHOUT ANY WARRANTY; without even the implied warranty of 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 Lesser General Public License for more details. 21 22 You should have received a copy of the GNU Lesser General Public 23 License along with this library; if not, see <http://www.gnu.org/licenses/>. 24*/ 25 26#include "replace.h" 27#include "tevent.h" 28#include "tevent_internal.h" 29#include "tevent_util.h" 30 31int tevent_common_fd_destructor(struct tevent_fd *fde) 32{ 33 if (fde->event_ctx) { 34 DLIST_REMOVE(fde->event_ctx->fd_events, fde); 35 } 36 37 if (fde->close_fn) { 38 fde->close_fn(fde->event_ctx, fde, fde->fd, fde->private_data); 39 fde->fd = -1; 40 } 41 42 return 0; 43} 44 45struct tevent_fd *tevent_common_add_fd(struct tevent_context *ev, TALLOC_CTX *mem_ctx, 46 int fd, uint16_t flags, 47 tevent_fd_handler_t handler, 48 void *private_data, 49 const char *handler_name, 50 const char *location) 51{ 52 struct tevent_fd *fde; 53 54 fde = talloc(mem_ctx?mem_ctx:ev, struct tevent_fd); 55 if (!fde) return NULL; 56 57 fde->event_ctx = ev; 58 fde->fd = fd; 59 fde->flags = flags; 60 fde->handler = handler; 61 fde->close_fn = NULL; 62 fde->private_data = private_data; 63 fde->handler_name = handler_name; 64 fde->location = location; 65 fde->additional_flags = 0; 66 fde->additional_data = NULL; 67 68 DLIST_ADD(ev->fd_events, fde); 69 70 talloc_set_destructor(fde, tevent_common_fd_destructor); 71 72 return fde; 73} 74uint16_t tevent_common_fd_get_flags(struct tevent_fd *fde) 75{ 76 return fde->flags; 77} 78 79void tevent_common_fd_set_flags(struct tevent_fd *fde, uint16_t flags) 80{ 81 if (fde->flags == flags) return; 82 fde->flags = flags; 83} 84 85void tevent_common_fd_set_close_fn(struct tevent_fd *fde, 86 tevent_fd_close_fn_t close_fn) 87{ 88 fde->close_fn = close_fn; 89} 90