13fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian/*
23fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian * Copyright (C) 2007 The Android Open Source Project
33fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian *
43fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
53fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian * you may not use this file except in compliance with the License.
63fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian * You may obtain a copy of the License at
73fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian *
83fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
93fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian *
103fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian * Unless required by applicable law or agreed to in writing, software
113fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
123fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian * See the License for the specific language governing permissions and
143fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian * limitations under the License.
153fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian */
163fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian
173fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian#define LOG_TAG "NativeHandle"
183fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian
193fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian#include <stdint.h>
203fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian#include <errno.h>
213fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian#include <string.h>
223fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian#include <stdlib.h>
233fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian#include <unistd.h>
243fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian
253fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian#include <cutils/log.h>
263fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian#include <cutils/native_handle.h>
273fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian
283fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopiannative_handle_t* native_handle_create(int numFds, int numInts)
293fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian{
303fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    native_handle_t* h = malloc(
313fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian            sizeof(native_handle_t) + sizeof(int)*(numFds+numInts));
323fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian
333fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    h->version = sizeof(native_handle_t);
343fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    h->numFds = numFds;
353fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    h->numInts = numInts;
363fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    return h;
373fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian}
383fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian
393fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopianint native_handle_delete(native_handle_t* h)
403fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian{
413fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    if (h) {
423fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian        if (h->version != sizeof(native_handle_t))
433fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian            return -EINVAL;
443fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian        free(h);
453fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    }
463fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    return 0;
473fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian}
483fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian
493fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopianint native_handle_close(const native_handle_t* h)
503fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian{
513fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    if (h->version != sizeof(native_handle_t))
523fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian        return -EINVAL;
533fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian
543fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    const int numFds = h->numFds;
553fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    int i;
563fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    for (i=0 ; i<numFds ; i++) {
573fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian        close(h->data[i]);
583fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    }
593fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian    return 0;
603fc51ba17d33c38d327d875d973e787b4dd076b6Mathias Agopian}
61