1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #pragma once 30 31 #include <sys/cdefs.h> 32 #include <stdbool.h> 33 #include <stdint.h> 34 35 __BEGIN_DECLS 36 37 // Types of an android_fdtrack_event. 38 enum android_fdtrack_event_type { 39 // File descriptor creation: create is the active member of android_fdtrack_event::data. 40 ANDROID_FDTRACK_EVENT_TYPE_CREATE, 41 42 // File descriptor closed. 43 ANDROID_FDTRACK_EVENT_TYPE_CLOSE, 44 }; 45 46 #pragma clang diagnostic push 47 #pragma clang diagnostic ignored "-Wnullability-completeness" 48 struct android_fdtrack_event { 49 // File descriptor for which this event occurred. 50 int fd; 51 52 // Type of event: this is one of the enumerators of android_fdtrack_event_type. 53 uint8_t type; 54 55 // Data for the event. 56 union { 57 struct { 58 const char* function_name; 59 } create; 60 } data; 61 }; 62 #pragma clang diagnostic pop 63 64 // Callback invoked upon file descriptor creation/closure. 65 typedef void (*_Nullable android_fdtrack_hook_t)(struct android_fdtrack_event* _Nullable); 66 67 // Register a hook which is called to track fd lifecycle events. 68 // Set value to null to disable tracking. 69 bool android_fdtrack_compare_exchange_hook(android_fdtrack_hook_t* _Nonnull expected, 70 android_fdtrack_hook_t value) __INTRODUCED_IN(30); 71 72 // Enable/disable fdtrack *on the current thread*. 73 // This is primarily useful when performing operations which you don't want to track 74 // (e.g. when emitting already-recorded information). 75 bool android_fdtrack_get_enabled() __INTRODUCED_IN(30); 76 bool android_fdtrack_set_enabled(bool new_value) __INTRODUCED_IN(30); 77 78 // Globally enable/disable fdtrack. 79 // This is primaryily useful to reenable fdtrack after it's been automatically disabled post-fork. 80 void android_fdtrack_set_globally_enabled(bool new_value) __INTRODUCED_IN(31); 81 82 __END_DECLS 83