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/misc.h>
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <signal.h>
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/wait.h>
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h>
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h>
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pthread.h>
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h>
272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h>
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdarg.h>
274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <netinet/in.h>
275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <netinet/tcp.h>
276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
27773167412bc52ee370761e418366ddac504666567Kenny Root#include <unistd.h>
278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
279ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root/*
280ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
281ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
282ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root * not already defined, then define it here.
283ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root */
284ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root#ifndef TEMP_FAILURE_RETRY
285ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root/* Used to retry syscalls that can return EINTR. */
286ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root#define TEMP_FAILURE_RETRY(exp) ({         \
287ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root    typeof (exp) _rc;                      \
288ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root    do {                                   \
289ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root        _rc = (exp);                       \
290ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root    } while (_rc == -1 && errno == EINTR); \
291ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root    _rc; })
292ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root#endif
293ec90f1dc11488f0ab8a25a9159965b4ae3c4ca88Kenny Root
294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OS_PATH_SEPARATOR '/'
295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OS_PATH_SEPARATOR_STR "/"
296d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#define ENV_PATH_SEPARATOR_STR ":"
297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  pthread_mutex_t          adb_mutex_t;
299408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall
300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  ADB_MUTEX_INITIALIZER    PTHREAD_MUTEX_INITIALIZER
301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_init           pthread_mutex_init
302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_lock           pthread_mutex_lock
303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_unlock         pthread_mutex_unlock
304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_mutex_destroy        pthread_mutex_destroy
305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
306408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#define  ADB_MUTEX_DEFINE(m)      adb_mutex_t   m = PTHREAD_MUTEX_INITIALIZER
307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_t               pthread_cond_t
309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_init            pthread_cond_init
310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_wait            pthread_cond_wait
311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_broadcast       pthread_cond_broadcast
312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_signal          pthread_cond_signal
313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  adb_cond_destroy         pthread_cond_destroy
314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
315408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall/* declare all mutexes */
316408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#define  ADB_MUTEX(x)   extern adb_mutex_t  x;
317408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#include "mutex_list.h"
318408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall
319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  close_on_exec(int  fd)
320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
321f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    fcntl( fd, F_SETFD, FD_CLOEXEC );
322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_open(const char*  path, int options,...)
325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ((options & O_CREAT) == 0)
327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
32873167412bc52ee370761e418366ddac504666567Kenny Root        return  TEMP_FAILURE_RETRY( open(path, options) );
329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else
331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int      mode;
333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_list  args;
334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_start( args, options );
335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        mode = va_arg( args, int );
336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        va_end( args );
33773167412bc52ee370761e418366ddac504666567Kenny Root        return TEMP_FAILURE_RETRY( open( path, options, mode ) );
338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_open_mode( const char*  pathname, int  options, int  mode )
342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
34373167412bc52ee370761e418366ddac504666567Kenny Root    return TEMP_FAILURE_RETRY( open( pathname, options, mode ) );
344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_open( const char*  pathname, int  options )
348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
34973167412bc52ee370761e418366ddac504666567Kenny Root    int  fd = TEMP_FAILURE_RETRY( open( pathname, options ) );
350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (fd < 0)
351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return -1;
352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec( fd );
353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return fd;
354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   open
356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  open    ___xxx_open
357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
3588cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwoodstatic __inline__ int  adb_shutdown(int fd)
3598cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood{
3608cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood    return shutdown(fd, SHUT_RDWR);
3618cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood}
3628cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood#undef   shutdown
3638cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood#define  shutdown   ____xxx_shutdown
3648cf0d59f61ae0b8554ecf3fe051850508b761b79Mike Lockwood
365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_close(int fd)
366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return close(fd);
368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   close
370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  close   ____xxx_close
371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_read(int  fd, void*  buf, size_t  len)
374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
37573167412bc52ee370761e418366ddac504666567Kenny Root    return TEMP_FAILURE_RETRY( read( fd, buf, len ) );
376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   read
379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  read  ___xxx_read
380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_write(int  fd, const void*  buf, size_t  len)
382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
38373167412bc52ee370761e418366ddac504666567Kenny Root    return TEMP_FAILURE_RETRY( write( fd, buf, len ) );
384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   write
386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  write  ___xxx_write
387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int   adb_lseek(int  fd, int  pos, int  where)
389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return lseek(fd, pos, where);
391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   lseek
393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  lseek   ___xxx_lseek
394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int    adb_unlink(const char*  path)
396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return  unlink(path);
398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef  unlink
400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define unlink  ___xxx_unlink
401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_creat(const char*  path, int  mode)
403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
40473167412bc52ee370761e418366ddac504666567Kenny Root    int  fd = TEMP_FAILURE_RETRY( creat( path, mode ) );
405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
406f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    if ( fd < 0 )
407f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner        return -1;
408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec(fd);
410f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return fd;
411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   creat
413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  creat  ___xxx_creat
414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_socket_accept(int  serverfd, struct sockaddr*  addr, socklen_t  *addrlen)
416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
41795ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby    int fd;
41895ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby
41973167412bc52ee370761e418366ddac504666567Kenny Root    fd = TEMP_FAILURE_RETRY( accept( serverfd, addr, addrlen ) );
42095ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby    if (fd >= 0)
42195ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby        close_on_exec(fd);
42295ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby
42395ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby    return fd;
424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   accept
427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  accept  ___xxx_accept
428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  unix_read   adb_read
430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  unix_write  adb_write
431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  unix_close  adb_close
432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef  pthread_t                 adb_thread_t;
434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef void*  (*adb_thread_func_t)( void*  arg );
436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_thread_create( adb_thread_t  *pthread, adb_thread_func_t  start, void*  arg )
438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pthread_attr_t   attr;
440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pthread_attr_init (&attr);
442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return pthread_create( pthread, &attr, start, arg );
445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_socket_setbufsize( int   fd, int  bufsize )
448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int opt = bufsize;
450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  disable_tcp_nagle(int fd)
454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  on = 1;
456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, (void*)&on, sizeof(on) );
457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  unix_socketpair( int  d, int  type, int  protocol, int sv[2] )
461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return socketpair( d, type, protocol, sv );
463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_socketpair( int  sv[2] )
466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  rc;
468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    rc = unix_socketpair( AF_UNIX, SOCK_STREAM, 0, sv );
470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (rc < 0)
471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return -1;
472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec( sv[0] );
474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close_on_exec( sv[1] );
475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   socketpair
479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  socketpair   ___xxx_socketpair
480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_sleep_ms( int  mseconds )
482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
483f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    usleep( mseconds*1000 );
484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int  adb_mkdir(const char*  path, int mode)
487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
488f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner    return mkdir(path, mode);
489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef   mkdir
491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  mkdir  ___xxx_mkdir
492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void  adb_sysdeps_init(void)
494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ char*  adb_dirstart(const char*  path)
498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return strchr(path, '/');
500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ char*  adb_dirstop(const char*  path)
503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return strrchr(path, '/');
505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__  int  adb_is_absolute_host_path( const char*  path )
508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return path[0] == '/';
510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
5121b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Andersonstatic __inline__ char*  adb_strtok_r(char *str, const char *delim, char **saveptr)
5131b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson{
5141b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson    return strtok_r(str, delim, saveptr);
5151b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson}
5161b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson#undef   strtok_r
5171b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson#define  strtok_r  ___xxx_strtok_r
5181b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson
519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* !_WIN32 */
520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* _ADB_SYSDEPS_H */
522