1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2006 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 __CUTILS_SOCKETS_H 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define __CUTILS_SOCKETS_H 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 232b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao#include <stdbool.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WINSOCK 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <winsock2.h> 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef int socklen_t; 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#elif HAVE_SYS_SOCKET_H 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/socket.h> 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_ENV_PREFIX "ANDROID_SOCKET_" 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_DIR "/dev/socket" 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef __cplusplus 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern "C" { 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * android_get_control_socket - simple helper function to get the file 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * descriptor of our init-managed Unix domain socket. `name' is the name of the 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * socket, as given in init.rc. Returns -1 on error. 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This is inline and not in libcutils proper because we want to use this in 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * third-party daemons with minimal modification. 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline int android_get_control_socket(const char *name) 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char key[64] = ANDROID_SOCKET_ENV_PREFIX; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *val; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* build our environment variable, counting cycles like a wolf ... */ 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if HAVE_STRLCPY 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strlcpy(key + sizeof(ANDROID_SOCKET_ENV_PREFIX) - 1, 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name, 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sizeof(key) - sizeof(ANDROID_SOCKET_ENV_PREFIX)); 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else /* for the host, which may lack the almightly strncpy ... */ 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncpy(key + sizeof(ANDROID_SOCKET_ENV_PREFIX) - 1, 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name, 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sizeof(key) - sizeof(ANDROID_SOCKET_ENV_PREFIX)); 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project key[sizeof(key)-1] = '\0'; 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = getenv(key); 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!val) 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project errno = 0; 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = strtol(val, NULL, 10); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (errno) 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return fd; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See also android.os.LocalSocketAddress.Namespace 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// Linux "abstract" (non-filesystem) namespace 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_NAMESPACE_ABSTRACT 0 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// Android "reserved" (/dev/socket) namespace 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_NAMESPACE_RESERVED 1 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// Normal filesystem namespace 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_NAMESPACE_FILESYSTEM 2 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_loopback_client(int port, int type); 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_network_client(const char *host, int port, int type); 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_loopback_server(int port, int type); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_local_server(const char *name, int namespaceId, int type); 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_local_server_bind(int s, const char *name, int namespaceId); 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_local_client_connect(int fd, 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name, int namespaceId, int type); 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_local_client(const char *name, int namespaceId, int type); 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_inaddr_any_server(int port, int type); 962b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao 972b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao/* 982b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao * socket_peer_is_trusted - Takes a socket which is presumed to be a 992b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao * connected local socket (e.g. AF_LOCAL) and returns whether the peer 1002b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao * (the userid that owns the process on the other end of that socket) 1012b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao * is one of the two trusted userids, root or shell. 1022b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao * 1032b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao * Note: This only works as advertised on the Android OS and always 1042b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao * just returns true when called on other operating systems. 1052b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao */ 1062b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhaoextern bool socket_peer_is_trusted(int fd); 1072b8f76cdbb254ac1170087a40dbf30b7627f3516jeffhao 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef __cplusplus 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* __CUTILS_SOCKETS_H */ 113