sockets.h revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
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>
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WINSOCK
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <winsock2.h>
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef int  socklen_t;
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#elif HAVE_SYS_SOCKET_H
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/socket.h>
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_ENV_PREFIX	"ANDROID_SOCKET_"
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_DIR		"/dev/socket"
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef __cplusplus
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern "C" {
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * android_get_control_socket - simple helper function to get the file
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * descriptor of our init-managed Unix domain socket. `name' is the name of the
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * socket, as given in init.rc. Returns -1 on error.
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This is inline and not in libcutils proper because we want to use this in
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * third-party daemons with minimal modification.
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline int android_get_control_socket(const char *name)
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char key[64] = ANDROID_SOCKET_ENV_PREFIX;
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	const char *val;
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int fd;
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	/* build our environment variable, counting cycles like a wolf ... */
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if HAVE_STRLCPY
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	strlcpy(key + sizeof(ANDROID_SOCKET_ENV_PREFIX) - 1,
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		name,
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		sizeof(key) - sizeof(ANDROID_SOCKET_ENV_PREFIX));
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else	/* for the host, which may lack the almightly strncpy ... */
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	strncpy(key + sizeof(ANDROID_SOCKET_ENV_PREFIX) - 1,
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		name,
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		sizeof(key) - sizeof(ANDROID_SOCKET_ENV_PREFIX));
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	key[sizeof(key)-1] = '\0';
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	val = getenv(key);
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (!val)
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		return -1;
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	errno = 0;
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	fd = strtol(val, NULL, 10);
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (errno)
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		return -1;
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return fd;
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See also android.os.LocalSocketAddress.Namespace
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// Linux "abstract" (non-filesystem) namespace
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_NAMESPACE_ABSTRACT 0
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// Android "reserved" (/dev/socket) namespace
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_NAMESPACE_RESERVED 1
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// Normal filesystem namespace
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_SOCKET_NAMESPACE_FILESYSTEM 2
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_loopback_client(int port, int type);
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_network_client(const char *host, int port, int type);
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_loopback_server(int port, int type);
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_local_server(const char *name, int namespaceId, int type);
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_local_server_bind(int s, const char *name, int namespaceId);
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_local_client_connect(int fd,
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const char *name, int namespaceId, int type);
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_local_client(const char *name, int namespaceId, int type);
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_inaddr_any_server(int port, int type);
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef __cplusplus
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* __CUTILS_SOCKETS_H */
101