1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef NATIVE_HANDLE_H_ 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define NATIVE_HANDLE_H_ 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 20b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu#include <stdalign.h> 21b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu 22fee77ec093f78c1bb0ce85aa16d7ee8e8fa06f8aMathias Agopian#ifdef __cplusplus 23fee77ec093f78c1bb0ce85aa16d7ee8e8fa06f8aMathias Agopianextern "C" { 24fee77ec093f78c1bb0ce85aa16d7ee8e8fa06f8aMathias Agopian#endif 258f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian 26b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu/* Declare a char array for use with native_handle_init */ 27b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu#define NATIVE_HANDLE_DECLARE_STORAGE(name, maxFds, maxInts) \ 28b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu alignas(native_handle_t) char name[ \ 29b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu sizeof(native_handle_t) + sizeof(int) * (maxFds + maxInts)] 30b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu 313ffd793a1d6a134a5fde9eabd936614d1b02dcebIliyan Malchevtypedef struct native_handle 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 338f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian int version; /* sizeof(native_handle_t) */ 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int numFds; /* number of file-descriptors at &data[0] */ 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int numInts; /* number of ints at &data[numFds] */ 361811d156e9c6b5486d25090ec3e911632dc6edffColin Cross#if defined(__clang__) 371811d156e9c6b5486d25090ec3e911632dc6edffColin Cross#pragma clang diagnostic push 381811d156e9c6b5486d25090ec3e911632dc6edffColin Cross#pragma clang diagnostic ignored "-Wzero-length-array" 391811d156e9c6b5486d25090ec3e911632dc6edffColin Cross#endif 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int data[0]; /* numFds + numInts ints */ 411811d156e9c6b5486d25090ec3e911632dc6edffColin Cross#if defined(__clang__) 421811d156e9c6b5486d25090ec3e911632dc6edffColin Cross#pragma clang diagnostic pop 431811d156e9c6b5486d25090ec3e911632dc6edffColin Cross#endif 448f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian} native_handle_t; 458f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian 468f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian/* 478f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * native_handle_close 488f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * 498f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * closes the file descriptors contained in this native_handle_t 508f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * 518f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * return 0 on success, or a negative error code on failure 528f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * 538f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian */ 548f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopianint native_handle_close(const native_handle_t* h); 558f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian 56b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu/* 57b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu * native_handle_init 58b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu * 59b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu * Initializes a native_handle_t from storage. storage must be declared with 60b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu * NATIVE_HANDLE_DECLARE_STORAGE. numFds and numInts must not respectively 61b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu * exceed maxFds and maxInts used to declare the storage. 62b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wu */ 63b843791b61ee3912515ce3f82f296823c17e10c9Chia-I Wunative_handle_t* native_handle_init(char* storage, int numFds, int numInts); 648f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian 658f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian/* 668f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * native_handle_create 678f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * 688f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * creates a native_handle_t and initializes it. must be destroyed with 698f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * native_handle_delete(). 708f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * 718f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian */ 728f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopiannative_handle_t* native_handle_create(int numFds, int numInts); 738f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian 748f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian/* 75fd3ea3d11805aef555eca08e2c2a0e1a40714726Chia-I Wu * native_handle_clone 76fd3ea3d11805aef555eca08e2c2a0e1a40714726Chia-I Wu * 77fd3ea3d11805aef555eca08e2c2a0e1a40714726Chia-I Wu * creates a native_handle_t and initializes it from another native_handle_t. 78fd3ea3d11805aef555eca08e2c2a0e1a40714726Chia-I Wu * Must be destroyed with native_handle_delete(). 79fd3ea3d11805aef555eca08e2c2a0e1a40714726Chia-I Wu * 80fd3ea3d11805aef555eca08e2c2a0e1a40714726Chia-I Wu */ 81fd3ea3d11805aef555eca08e2c2a0e1a40714726Chia-I Wunative_handle_t* native_handle_clone(const native_handle_t* handle); 82fd3ea3d11805aef555eca08e2c2a0e1a40714726Chia-I Wu 83fd3ea3d11805aef555eca08e2c2a0e1a40714726Chia-I Wu/* 848f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * native_handle_delete 858f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * 868f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * frees a native_handle_t allocated with native_handle_create(). 878f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * This ONLY frees the memory allocated for the native_handle_t, but doesn't 888f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * close the file descriptors; which can be achieved with native_handle_close(). 898f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * 908f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * return 0 on success, or a negative error code on failure 918f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian * 928f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian */ 938f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopianint native_handle_delete(native_handle_t* h); 948f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian 958f13782e7b4a705484d7f97f07513781b82be0dcMathias Agopian 96fee77ec093f78c1bb0ce85aa16d7ee8e8fa06f8aMathias Agopian#ifdef __cplusplus 97fee77ec093f78c1bb0ce85aa16d7ee8e8fa06f8aMathias Agopian} 98fee77ec093f78c1bb0ce85aa16d7ee8e8fa06f8aMathias Agopian#endif 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* NATIVE_HANDLE_H_ */ 101