sysdeps.h revision d5fcafaf41f8ec90986c813f75ec78402096af2d
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 "\\"
41d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#define ENV_PATH_SEPARATOR_STR ";"
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef CRITICAL_SECTION          adb_mutex_t;
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  ADB_MUTEX_DEFINE(x)     adb_mutex_t   x
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* declare all mutexes */
48408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall/* For win32, adb_sysdeps_init() will do the mutex runtime initialization. */
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  ADB_MUTEX(x)   extern adb_mutex_t  x;
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "mutex_list.h"
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern void  adb_sysdeps_init(void);
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void adb_mutex_lock( adb_mutex_t*  lock )
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    EnterCriticalSection( lock );
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_mutex_unlock( adb_mutex_t*  lock )
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    LeaveCriticalSection( lock );
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct { unsigned  tid; }  adb_thread_t;
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  void*  (*adb_thread_func_t)(void*  arg);
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  void (*win_thread_func_t)(void*  arg);
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_thread_create( adb_thread_t  *thread, adb_thread_func_t  func, void*  arg)
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
72f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    thread->tid = _beginthread( (win_thread_func_t)func, 0, arg );
73f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    if (thread->tid == (unsigned)-1L) {
74f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner        return -1;
75f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    }
76f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return 0;
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  close_on_exec(int  fd)
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
81f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    /* nothing really */
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern void  disable_tcp_nagle(int  fd);
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  lstat    stat   /* no symlinks on Win32 */
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  S_ISLNK(m)   0   /* no symlinks on Win32 */
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int    adb_unlink(const char*  path)
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  rc = unlink(path);
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (rc == -1 && errno == EACCES) {
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* unlink returns EACCES when the file is read-only, so we first */
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* try to make it writable, then unlink again...                  */
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        rc = chmod(path, _S_IREAD|_S_IWRITE );
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (rc == 0)
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            rc = unlink(path);
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return rc;
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef  unlink
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define unlink  ___xxx_unlink
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_mkdir(const char*  path, int mode)
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
1080e7c4274c687446dbe30a814278d7a6b99da8c4eJP Abgrall	return _mkdir(path);
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   mkdir
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  mkdir  ___xxx_mkdir
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_open(const char*  path, int  options);
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_creat(const char*  path, int  mode);
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_read(int  fd, void* buf, int len);
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_write(int  fd, const void*  buf, int  len);
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_lseek(int  fd, int  pos, int  where);
1188cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwoodextern int  adb_shutdown(int  fd);
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_close(int  fd);
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_close(int fd)
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return close(fd);
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   close
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  close   ____xxx_close
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  unix_read(int  fd, void*  buf, size_t  len)
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return read(fd, buf, len);
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   read
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  read  ___xxx_read
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  unix_write(int  fd, const void*  buf, size_t  len)
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return write(fd, buf, len);
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   write
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  write  ___xxx_write
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_open_mode(const char* path, int options, int mode)
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
144f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return adb_open(path, options);
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_open(const char*  path, int options,...)
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ((options & O_CREAT) == 0)
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return  open(path, options);
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int      mode;
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_list  args;
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_start( args, options );
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        mode = va_arg( args, int );
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_end( args );
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return open(path, options, mode);
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  open    ___xxx_unix_open
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* normally provided by <cutils/misc.h> */
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern void*  load_file(const char*  pathname, unsigned*  psize);
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* normally provided by <cutils/sockets.h> */
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_loopback_client(int port, int type);
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_network_client(const char *host, int port, int type);
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_loopback_server(int port, int type);
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int socket_inaddr_any_server(int port, int type);
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
175414ff7d98ac8d7610a26206335954ad15f43f3acDavid 'Digit' Turner/* normally provided by "fdevent.h" */
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define FDE_READ              0x0001
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define FDE_WRITE             0x0002
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define FDE_ERROR             0x0004
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define FDE_DONT_CLOSE        0x0080
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct fdevent fdevent;
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef void (*fd_func)(int fd, unsigned events, void *userdata);
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfdevent *fdevent_create(int fd, fd_func func, void *arg);
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_destroy(fdevent *fde);
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_install(fdevent *fde, int fd, fd_func func, void *arg);
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_remove(fdevent *item);
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_set(fdevent *fde, unsigned events);
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_add(fdevent *fde, unsigned events);
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_del(fdevent *fde, unsigned events);
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid     fdevent_loop();
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct fdevent {
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fdevent *next;
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fdevent *prev;
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int fd;
200408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall    int force_eof;
201408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    unsigned short state;
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    unsigned short events;
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fd_func func;
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void *arg;
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_sleep_ms( int  mseconds )
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
211f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    Sleep( mseconds );
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_socket_accept(int  serverfd, struct sockaddr*  addr, socklen_t  *addrlen);
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   accept
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  accept  ___xxx_accept
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_socket_setbufsize( int   fd, int  bufsize )
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int opt = bufsize;
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (const char*)&opt, sizeof(opt));
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int  adb_socketpair( int  sv[2] );
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  char*  adb_dirstart( const char*  path )
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char*  p  = strchr(path, '/');
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char*  p2 = strchr(path, '\\');
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ( !p )
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        p = p2;
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else if ( p2 && p2 > p )
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        p = p2;
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return p;
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  char*  adb_dirstop( const char*  path )
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char*  p  = strrchr(path, '/');
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char*  p2 = strrchr(path, '\\');
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ( !p )
246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        p = p2;
247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else if ( p2 && p2 > p )
248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        p = p2;
249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return p;
251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_is_absolute_host_path( const char*  path )
254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return isalpha(path[0]) && path[1] == ':' && path[2] == '\\';
256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
2581b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Andersonextern char*  adb_strtok_r(char *str, const char *delim, char **saveptr);
2591b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson
260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else /* !_WIN32 a.k.a. Unix */
261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
262414ff7d98ac8d7610a26206335954ad15f43f3acDavid 'Digit' Turner#include "fdevent.h"
263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/sockets.h>
264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/properties.h>
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/misc.h>
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <signal.h>
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/wait.h>
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h>
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h>
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pthread.h>
272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h>
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h>
274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdarg.h>
275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <netinet/in.h>
276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <netinet/tcp.h>
277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OS_PATH_SEPARATOR '/'
280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OS_PATH_SEPARATOR_STR "/"
281d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#define ENV_PATH_SEPARATOR_STR ":"
282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  pthread_mutex_t          adb_mutex_t;
284408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall
285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  ADB_MUTEX_INITIALIZER    PTHREAD_MUTEX_INITIALIZER
286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_init           pthread_mutex_init
287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_lock           pthread_mutex_lock
288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_unlock         pthread_mutex_unlock
289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_destroy        pthread_mutex_destroy
290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
291408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#define  ADB_MUTEX_DEFINE(m)      adb_mutex_t   m = PTHREAD_MUTEX_INITIALIZER
292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_t               pthread_cond_t
294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_init            pthread_cond_init
295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_wait            pthread_cond_wait
296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_broadcast       pthread_cond_broadcast
297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_signal          pthread_cond_signal
298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_destroy         pthread_cond_destroy
299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
300408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall/* declare all mutexes */
301408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#define  ADB_MUTEX(x)   extern adb_mutex_t  x;
302408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#include "mutex_list.h"
303408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall
304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  close_on_exec(int  fd)
305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
306f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    fcntl( fd, F_SETFD, FD_CLOEXEC );
307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_open(const char*  path, int options,...)
310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ((options & O_CREAT) == 0)
312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return  open(path, options);
314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else
316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int      mode;
318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_list  args;
319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_start( args, options );
320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        mode = va_arg( args, int );
321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_end( args );
322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return open(path, options, mode);
323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_open_mode( const char*  pathname, int  options, int  mode )
327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
328f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return open( pathname, options, mode );
329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_open( const char*  pathname, int  options )
333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  fd = open( pathname, options );
335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (fd < 0)
336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return -1;
337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec( fd );
338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return fd;
339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   open
341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  open    ___xxx_open
342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
3438cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwoodstatic __inline__ int  adb_shutdown(int fd)
3448cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood{
3458cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood    return shutdown(fd, SHUT_RDWR);
3468cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood}
3478cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood#undef   shutdown
3488cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood#define  shutdown   ____xxx_shutdown
3498cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood
350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_close(int fd)
351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return close(fd);
353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   close
355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  close   ____xxx_close
356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_read(int  fd, void*  buf, size_t  len)
359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return read(fd, buf, len);
361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   read
364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  read  ___xxx_read
365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_write(int  fd, const void*  buf, size_t  len)
367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return write(fd, buf, len);
369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   write
371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  write  ___xxx_write
372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int   adb_lseek(int  fd, int  pos, int  where)
374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return lseek(fd, pos, where);
376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   lseek
378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  lseek   ___xxx_lseek
379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int    adb_unlink(const char*  path)
381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return  unlink(path);
383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef  unlink
385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define unlink  ___xxx_unlink
386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_creat(const char*  path, int  mode)
388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  fd = creat(path, mode);
390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
391f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    if ( fd < 0 )
392f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner        return -1;
393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec(fd);
395f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return fd;
396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   creat
398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  creat  ___xxx_creat
399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_socket_accept(int  serverfd, struct sockaddr*  addr, socklen_t  *addrlen)
401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
40295ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby    int fd;
40395ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby
40495ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby    fd = accept(serverfd, addr, addrlen);
40595ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby    if (fd >= 0)
40695ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby        close_on_exec(fd);
40795ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby
40895ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby    return fd;
409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   accept
412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  accept  ___xxx_accept
413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  unix_read   adb_read
415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  unix_write  adb_write
416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  unix_close  adb_close
417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  pthread_t                 adb_thread_t;
419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef void*  (*adb_thread_func_t)( void*  arg );
421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_thread_create( adb_thread_t  *pthread, adb_thread_func_t  start, void*  arg )
423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pthread_attr_t   attr;
425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pthread_attr_init (&attr);
427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return pthread_create( pthread, &attr, start, arg );
430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_socket_setbufsize( int   fd, int  bufsize )
433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int opt = bufsize;
435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  disable_tcp_nagle(int fd)
439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  on = 1;
441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, (void*)&on, sizeof(on) );
442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_socketpair( int  d, int  type, int  protocol, int sv[2] )
446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return socketpair( d, type, protocol, sv );
448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_socketpair( int  sv[2] )
451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  rc;
453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    rc = unix_socketpair( AF_UNIX, SOCK_STREAM, 0, sv );
455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (rc < 0)
456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return -1;
457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec( sv[0] );
459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec( sv[1] );
460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   socketpair
464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  socketpair   ___xxx_socketpair
465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_sleep_ms( int  mseconds )
467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
468f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    usleep( mseconds*1000 );
469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_mkdir(const char*  path, int mode)
472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
473f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return mkdir(path, mode);
474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   mkdir
476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  mkdir  ___xxx_mkdir
477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_sysdeps_init(void)
479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ char*  adb_dirstart(const char*  path)
483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return strchr(path, '/');
485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ char*  adb_dirstop(const char*  path)
488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return strrchr(path, '/');
490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_is_absolute_host_path( const char*  path )
493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return path[0] == '/';
495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
4971b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Andersonstatic __inline__ char*  adb_strtok_r(char *str, const char *delim, char **saveptr)
4981b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson{
4991b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson    return strtok_r(str, delim, saveptr);
5001b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson}
5011b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson#undef   strtok_r
5021b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson#define  strtok_r  ___xxx_strtok_r
5031b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson
504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* !_WIN32 */
505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* _ADB_SYSDEPS_H */
507