sockets.h revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1/* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef __CUTILS_SOCKETS_H 18#define __CUTILS_SOCKETS_H 19 20#include <errno.h> 21#include <stdlib.h> 22#include <string.h> 23 24#ifdef HAVE_WINSOCK 25#include <winsock2.h> 26typedef int socklen_t; 27#elif HAVE_SYS_SOCKET_H 28#include <sys/socket.h> 29#endif 30 31#define ANDROID_SOCKET_ENV_PREFIX "ANDROID_SOCKET_" 32#define ANDROID_SOCKET_DIR "/dev/socket" 33 34#ifdef __cplusplus 35extern "C" { 36#endif 37 38/* 39 * android_get_control_socket - simple helper function to get the file 40 * descriptor of our init-managed Unix domain socket. `name' is the name of the 41 * socket, as given in init.rc. Returns -1 on error. 42 * 43 * This is inline and not in libcutils proper because we want to use this in 44 * third-party daemons with minimal modification. 45 */ 46static inline int android_get_control_socket(const char *name) 47{ 48 char key[64] = ANDROID_SOCKET_ENV_PREFIX; 49 const char *val; 50 int fd; 51 52 /* build our environment variable, counting cycles like a wolf ... */ 53#if HAVE_STRLCPY 54 strlcpy(key + sizeof(ANDROID_SOCKET_ENV_PREFIX) - 1, 55 name, 56 sizeof(key) - sizeof(ANDROID_SOCKET_ENV_PREFIX)); 57#else /* for the host, which may lack the almightly strncpy ... */ 58 strncpy(key + sizeof(ANDROID_SOCKET_ENV_PREFIX) - 1, 59 name, 60 sizeof(key) - sizeof(ANDROID_SOCKET_ENV_PREFIX)); 61 key[sizeof(key)-1] = '\0'; 62#endif 63 64 val = getenv(key); 65 if (!val) 66 return -1; 67 68 errno = 0; 69 fd = strtol(val, NULL, 10); 70 if (errno) 71 return -1; 72 73 return fd; 74} 75 76/* 77 * See also android.os.LocalSocketAddress.Namespace 78 */ 79// Linux "abstract" (non-filesystem) namespace 80#define ANDROID_SOCKET_NAMESPACE_ABSTRACT 0 81// Android "reserved" (/dev/socket) namespace 82#define ANDROID_SOCKET_NAMESPACE_RESERVED 1 83// Normal filesystem namespace 84#define ANDROID_SOCKET_NAMESPACE_FILESYSTEM 2 85 86extern int socket_loopback_client(int port, int type); 87extern int socket_network_client(const char *host, int port, int type); 88extern int socket_loopback_server(int port, int type); 89extern int socket_local_server(const char *name, int namespaceId, int type); 90extern int socket_local_server_bind(int s, const char *name, int namespaceId); 91extern int socket_local_client_connect(int fd, 92 const char *name, int namespaceId, int type); 93extern int socket_local_client(const char *name, int namespaceId, int type); 94extern int socket_inaddr_any_server(int port, int type); 95 96#ifdef __cplusplus 97} 98#endif 99 100#endif /* __CUTILS_SOCKETS_H */ 101