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