sysdeps.h revision 8cf0d59f61ae0b8554ecf3fe051850508b761b79
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2007 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/* this file contains system-dependent definitions used by ADB
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * they're related to threads, sockets and file descriptors
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef _ADB_SYSDEPS_H
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define _ADB_SYSDEPS_H
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef __CYGWIN__
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#  undef _WIN32
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef _WIN32
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <windows.h>
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <winsock2.h>
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <ws2tcpip.h>
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <process.h>
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h>
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <io.h>
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h>
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h>
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <ctype.h>
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OS_PATH_SEPARATOR '\\'
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OS_PATH_SEPARATOR_STR "\\"
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef CRITICAL_SECTION          adb_mutex_t;
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  ADB_MUTEX_DEFINE(x)     adb_mutex_t   x
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* declare all mutexes */
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  ADB_MUTEX(x)   extern adb_mutex_t  x;
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "mutex_list.h"
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern void  adb_sysdeps_init(void);
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void adb_mutex_lock( adb_mutex_t*  lock )
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    EnterCriticalSection( lock );
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_mutex_unlock( adb_mutex_t*  lock )
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    LeaveCriticalSection( lock );
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct { unsigned  tid; }  adb_thread_t;
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  void*  (*adb_thread_func_t)(void*  arg);
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  void (*win_thread_func_t)(void*  arg);
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_thread_create( adb_thread_t  *thread, adb_thread_func_t  func, void*  arg)
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
70f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    thread->tid = _beginthread( (win_thread_func_t)func, 0, arg );
71f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    if (thread->tid == (unsigned)-1L) {
72f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner        return -1;
73f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    }
74f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return 0;
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  close_on_exec(int  fd)
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
79f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    /* nothing really */
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern void  disable_tcp_nagle(int  fd);
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  lstat    stat   /* no symlinks on Win32 */
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  S_ISLNK(m)   0   /* no symlinks on Win32 */
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int    adb_unlink(const char*  path)
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  rc = unlink(path);
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (rc == -1 && errno == EACCES) {
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* unlink returns EACCES when the file is read-only, so we first */
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* try to make it writable, then unlink again...                  */
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        rc = chmod(path, _S_IREAD|_S_IWRITE );
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (rc == 0)
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            rc = unlink(path);
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return rc;
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef  unlink
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define unlink  ___xxx_unlink
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_mkdir(const char*  path, int mode)
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return _mkdir(path);
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   mkdir
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  mkdir  ___xxx_mkdir
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_open(const char*  path, int  options);
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_creat(const char*  path, int  mode);
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_read(int  fd, void* buf, int len);
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_write(int  fd, const void*  buf, int  len);
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_lseek(int  fd, int  pos, int  where);
1168cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwoodextern int  adb_shutdown(int  fd);
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_close(int  fd);
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_close(int fd)
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return close(fd);
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   close
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  close   ____xxx_close
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  unix_read(int  fd, void*  buf, size_t  len)
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return read(fd, buf, len);
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   read
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  read  ___xxx_read
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  unix_write(int  fd, const void*  buf, size_t  len)
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return write(fd, buf, len);
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   write
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  write  ___xxx_write
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_open_mode(const char* path, int options, int mode)
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
142f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return adb_open(path, options);
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_open(const char*  path, int options,...)
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ((options & O_CREAT) == 0)
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return  open(path, options);
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int      mode;
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_list  args;
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_start( args, options );
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        mode = va_arg( args, int );
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_end( args );
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return open(path, options, mode);
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  open    ___xxx_unix_open
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* normally provided by <cutils/misc.h> */
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern void*  load_file(const char*  pathname, unsigned*  psize);
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* normally provided by <cutils/sockets.h> */
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_loopback_client(int port, int type);
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_network_client(const char *host, int port, int type);
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_loopback_server(int port, int type);
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_inaddr_any_server(int port, int type);
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
173414ff7d98ac8d7610a26206335954ad15f43f3acDavid 'Digit' Turner/* normally provided by "fdevent.h" */
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define FDE_READ              0x0001
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define FDE_WRITE             0x0002
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define FDE_ERROR             0x0004
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define FDE_DONT_CLOSE        0x0080
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct fdevent fdevent;
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef void (*fd_func)(int fd, unsigned events, void *userdata);
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfdevent *fdevent_create(int fd, fd_func func, void *arg);
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_destroy(fdevent *fde);
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_install(fdevent *fde, int fd, fd_func func, void *arg);
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_remove(fdevent *item);
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_set(fdevent *fde, unsigned events);
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_add(fdevent *fde, unsigned events);
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_del(fdevent *fde, unsigned events);
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_loop();
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct fdevent {
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fdevent *next;
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fdevent *prev;
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int fd;
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    unsigned short state;
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    unsigned short events;
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fd_func func;
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void *arg;
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_sleep_ms( int  mseconds )
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
207f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    Sleep( mseconds );
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_socket_accept(int  serverfd, struct sockaddr*  addr, socklen_t  *addrlen);
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   accept
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  accept  ___xxx_accept
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_socket_setbufsize( int   fd, int  bufsize )
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int opt = bufsize;
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (const char*)&opt, sizeof(opt));
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_socketpair( int  sv[2] );
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  char*  adb_dirstart( const char*  path )
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char*  p  = strchr(path, '/');
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char*  p2 = strchr(path, '\\');
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ( !p )
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        p = p2;
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else if ( p2 && p2 > p )
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        p = p2;
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return p;
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  char*  adb_dirstop( const char*  path )
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char*  p  = strrchr(path, '/');
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char*  p2 = strrchr(path, '\\');
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ( !p )
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        p = p2;
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else if ( p2 && p2 > p )
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        p = p2;
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return p;
247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_is_absolute_host_path( const char*  path )
250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return isalpha(path[0]) && path[1] == ':' && path[2] == '\\';
252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else /* !_WIN32 a.k.a. Unix */
255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
256414ff7d98ac8d7610a26206335954ad15f43f3acDavid 'Digit' Turner#include "fdevent.h"
257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/sockets.h>
258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/properties.h>
259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/misc.h>
260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <signal.h>
261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/wait.h>
262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h>
263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h>
264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pthread.h>
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h>
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h>
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdarg.h>
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <netinet/in.h>
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <netinet/tcp.h>
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OS_PATH_SEPARATOR '/'
274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OS_PATH_SEPARATOR_STR "/"
275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  pthread_mutex_t          adb_mutex_t;
277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  ADB_MUTEX_INITIALIZER    PTHREAD_MUTEX_INITIALIZER
278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_init           pthread_mutex_init
279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_lock           pthread_mutex_lock
280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_unlock         pthread_mutex_unlock
281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_destroy        pthread_mutex_destroy
282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  ADB_MUTEX_DEFINE(m)      static adb_mutex_t   m = PTHREAD_MUTEX_INITIALIZER
284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_t               pthread_cond_t
286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_init            pthread_cond_init
287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_wait            pthread_cond_wait
288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_broadcast       pthread_cond_broadcast
289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_signal          pthread_cond_signal
290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_destroy         pthread_cond_destroy
291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  close_on_exec(int  fd)
293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
294f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    fcntl( fd, F_SETFD, FD_CLOEXEC );
295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_open(const char*  path, int options,...)
298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ((options & O_CREAT) == 0)
300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return  open(path, options);
302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else
304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int      mode;
306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_list  args;
307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_start( args, options );
308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        mode = va_arg( args, int );
309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_end( args );
310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return open(path, options, mode);
311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_open_mode( const char*  pathname, int  options, int  mode )
315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
316f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return open( pathname, options, mode );
317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_open( const char*  pathname, int  options )
321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  fd = open( pathname, options );
323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (fd < 0)
324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return -1;
325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec( fd );
326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return fd;
327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   open
329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  open    ___xxx_open
330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
3318cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwoodstatic __inline__ int  adb_shutdown(int fd)
3328cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood{
3338cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood    return shutdown(fd, SHUT_RDWR);
3348cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood}
3358cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood#undef   shutdown
3368cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood#define  shutdown   ____xxx_shutdown
3378cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood
338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_close(int fd)
339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return close(fd);
341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   close
343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  close   ____xxx_close
344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_read(int  fd, void*  buf, size_t  len)
347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return read(fd, buf, len);
349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   read
352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  read  ___xxx_read
353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_write(int  fd, const void*  buf, size_t  len)
355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return write(fd, buf, len);
357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   write
359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  write  ___xxx_write
360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int   adb_lseek(int  fd, int  pos, int  where)
362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return lseek(fd, pos, where);
364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   lseek
366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  lseek   ___xxx_lseek
367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int    adb_unlink(const char*  path)
369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return  unlink(path);
371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef  unlink
373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define unlink  ___xxx_unlink
374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_creat(const char*  path, int  mode)
376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  fd = creat(path, mode);
378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
379f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    if ( fd < 0 )
380f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner        return -1;
381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec(fd);
383f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return fd;
384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   creat
386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  creat  ___xxx_creat
387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_socket_accept(int  serverfd, struct sockaddr*  addr, socklen_t  *addrlen)
389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return  accept( serverfd, addr, addrlen );
391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   accept
394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  accept  ___xxx_accept
395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  unix_read   adb_read
397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  unix_write  adb_write
398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  unix_close  adb_close
399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  pthread_t                 adb_thread_t;
401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef void*  (*adb_thread_func_t)( void*  arg );
403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_thread_create( adb_thread_t  *pthread, adb_thread_func_t  start, void*  arg )
405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pthread_attr_t   attr;
407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pthread_attr_init (&attr);
409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return pthread_create( pthread, &attr, start, arg );
412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_socket_setbufsize( int   fd, int  bufsize )
415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int opt = bufsize;
417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  disable_tcp_nagle(int fd)
421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  on = 1;
423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, (void*)&on, sizeof(on) );
424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_socketpair( int  d, int  type, int  protocol, int sv[2] )
428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return socketpair( d, type, protocol, sv );
430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_socketpair( int  sv[2] )
433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  rc;
435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    rc = unix_socketpair( AF_UNIX, SOCK_STREAM, 0, sv );
437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (rc < 0)
438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return -1;
439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec( sv[0] );
441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec( sv[1] );
442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   socketpair
446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  socketpair   ___xxx_socketpair
447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_sleep_ms( int  mseconds )
449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
450f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    usleep( mseconds*1000 );
451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_mkdir(const char*  path, int mode)
454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
455f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return mkdir(path, mode);
456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   mkdir
458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  mkdir  ___xxx_mkdir
459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_sysdeps_init(void)
461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ char*  adb_dirstart(const char*  path)
465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return strchr(path, '/');
467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ char*  adb_dirstop(const char*  path)
470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return strrchr(path, '/');
472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_is_absolute_host_path( const char*  path )
475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return path[0] == '/';
477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* !_WIN32 */
480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* _ADB_SYSDEPS_H */
482