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