sysdeps.h revision 703ed152147d90a549a2fee7cda5771703e502a0
19270a20a801403c9f60d6a701b39eae70d380403Doug Zongker/* 29270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * Copyright (C) 2007 The Android Open Source Project 39270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * 49270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * Licensed under the Apache License, Version 2.0 (the "License"); 59270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * you may not use this file except in compliance with the License. 69270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * You may obtain a copy of the License at 79270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * 89270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * http://www.apache.org/licenses/LICENSE-2.0 99270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * 109270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * Unless required by applicable law or agreed to in writing, software 119270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * distributed under the License is distributed on an "AS IS" BASIS, 129270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * See the License for the specific language governing permissions and 149270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * limitations under the License. 159270a20a801403c9f60d6a701b39eae70d380403Doug Zongker */ 169270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 179270a20a801403c9f60d6a701b39eae70d380403Doug Zongker/* this file contains system-dependent definitions used by ADB 189270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * they're related to threads, sockets and file descriptors 199270a20a801403c9f60d6a701b39eae70d380403Doug Zongker */ 209270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#ifndef _ADB_SYSDEPS_H 219270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define _ADB_SYSDEPS_H 229270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 239270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#ifdef __CYGWIN__ 249270a20a801403c9f60d6a701b39eae70d380403Doug Zongker# undef _WIN32 259270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#endif 269270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 279270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#ifdef _WIN32 289270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 299270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <windows.h> 309270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <winsock2.h> 319270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <ws2tcpip.h> 329270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <process.h> 339270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <fcntl.h> 349270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <io.h> 359270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <sys/stat.h> 369270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <errno.h> 379270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <ctype.h> 389270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 399270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define OS_PATH_SEPARATOR '\\' 409270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define OS_PATH_SEPARATOR_STR "\\" 419270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 429270a20a801403c9f60d6a701b39eae70d380403Doug Zongkertypedef CRITICAL_SECTION adb_mutex_t; 439270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 449270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define ADB_MUTEX_DEFINE(x) adb_mutex_t x 459270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 469270a20a801403c9f60d6a701b39eae70d380403Doug Zongker/* declare all mutexes */ 479270a20a801403c9f60d6a701b39eae70d380403Doug Zongker/* For win32, adb_sysdeps_init() will do the mutex runtime initialization. */ 489270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define ADB_MUTEX(x) extern adb_mutex_t x; 499270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include "mutex_list.h" 509270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 519270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern void adb_sysdeps_init(void); 529270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 539270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ void adb_mutex_lock( adb_mutex_t* lock ) 549270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 559270a20a801403c9f60d6a701b39eae70d380403Doug Zongker EnterCriticalSection( lock ); 569270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 579270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 589270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ void adb_mutex_unlock( adb_mutex_t* lock ) 599270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 609270a20a801403c9f60d6a701b39eae70d380403Doug Zongker LeaveCriticalSection( lock ); 619270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 629270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 639270a20a801403c9f60d6a701b39eae70d380403Doug Zongkertypedef struct { unsigned tid; } adb_thread_t; 649270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 659270a20a801403c9f60d6a701b39eae70d380403Doug Zongkertypedef void* (*adb_thread_func_t)(void* arg); 669270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 679270a20a801403c9f60d6a701b39eae70d380403Doug Zongkertypedef void (*win_thread_func_t)(void* arg); 689270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 699270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_thread_create( adb_thread_t *thread, adb_thread_func_t func, void* arg) 709270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 719270a20a801403c9f60d6a701b39eae70d380403Doug Zongker thread->tid = _beginthread( (win_thread_func_t)func, 0, arg ); 729270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if (thread->tid == (unsigned)-1L) { 739270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return -1; 749270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 759270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return 0; 769270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 779270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 789270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ void close_on_exec(int fd) 799270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 809270a20a801403c9f60d6a701b39eae70d380403Doug Zongker /* nothing really */ 819270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 829270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 839270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern void disable_tcp_nagle(int fd); 849270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 859270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define lstat stat /* no symlinks on Win32 */ 869270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 879270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define S_ISLNK(m) 0 /* no symlinks on Win32 */ 889270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 899270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_unlink(const char* path) 909270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 919270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int rc = unlink(path); 929270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 939270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if (rc == -1 && errno == EACCES) { 949270a20a801403c9f60d6a701b39eae70d380403Doug Zongker /* unlink returns EACCES when the file is read-only, so we first */ 959270a20a801403c9f60d6a701b39eae70d380403Doug Zongker /* try to make it writable, then unlink again... */ 969270a20a801403c9f60d6a701b39eae70d380403Doug Zongker rc = chmod(path, _S_IREAD|_S_IWRITE ); 979270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if (rc == 0) 989270a20a801403c9f60d6a701b39eae70d380403Doug Zongker rc = unlink(path); 999270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 1009270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return rc; 1019270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 1029270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef unlink 1039270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define unlink ___xxx_unlink 1049270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1059270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_mkdir(const char* path, int mode) 1069270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 1079270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return _mkdir(path); 1089270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 1099270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef mkdir 1109270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define mkdir ___xxx_mkdir 1119270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1129270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int adb_open(const char* path, int options); 1139270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int adb_creat(const char* path, int mode); 1149270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int adb_read(int fd, void* buf, int len); 1159270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int adb_write(int fd, const void* buf, int len); 1169270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int adb_lseek(int fd, int pos, int where); 1179270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int adb_shutdown(int fd); 1189270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int adb_close(int fd); 1199270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1209270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int unix_close(int fd) 1219270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 1229270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return close(fd); 1239270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 1249270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef close 1259270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define close ____xxx_close 1269270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1279270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int unix_read(int fd, void* buf, size_t len) 1289270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 1299270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return read(fd, buf, len); 1309270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 1319270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef read 1329270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define read ___xxx_read 1339270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1349270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int unix_write(int fd, const void* buf, size_t len) 1359270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 1369270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return write(fd, buf, len); 1379270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 1389270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef write 1399270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define write ___xxx_write 1409270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1419270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_open_mode(const char* path, int options, int mode) 1429270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 1439270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return adb_open(path, options); 1449270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 1459270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1469270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int unix_open(const char* path, int options,...) 1479270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 1489270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if ((options & O_CREAT) == 0) 1499270a20a801403c9f60d6a701b39eae70d380403Doug Zongker { 1509270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return open(path, options); 1519270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 1529270a20a801403c9f60d6a701b39eae70d380403Doug Zongker else 1539270a20a801403c9f60d6a701b39eae70d380403Doug Zongker { 1549270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int mode; 1559270a20a801403c9f60d6a701b39eae70d380403Doug Zongker va_list args; 1569270a20a801403c9f60d6a701b39eae70d380403Doug Zongker va_start( args, options ); 1579270a20a801403c9f60d6a701b39eae70d380403Doug Zongker mode = va_arg( args, int ); 1589270a20a801403c9f60d6a701b39eae70d380403Doug Zongker va_end( args ); 1599270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return open(path, options, mode); 1609270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 1619270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 1629270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define open ___xxx_unix_open 1639270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1649270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1659270a20a801403c9f60d6a701b39eae70d380403Doug Zongker/* normally provided by <cutils/misc.h> */ 1669270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern void* load_file(const char* pathname, unsigned* psize); 1679270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1689270a20a801403c9f60d6a701b39eae70d380403Doug Zongker/* normally provided by <cutils/sockets.h> */ 1699270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int socket_loopback_client(int port, int type); 1709270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int socket_network_client(const char *host, int port, int type); 1719270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int socket_loopback_server(int port, int type); 1729270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int socket_inaddr_any_server(int port, int type); 1739270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1749270a20a801403c9f60d6a701b39eae70d380403Doug Zongker/* normally provided by "fdevent.h" */ 1759270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1769270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define FDE_READ 0x0001 1779270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define FDE_WRITE 0x0002 1789270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define FDE_ERROR 0x0004 1799270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define FDE_DONT_CLOSE 0x0080 1809270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1819270a20a801403c9f60d6a701b39eae70d380403Doug Zongkertypedef struct fdevent fdevent; 1829270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1839270a20a801403c9f60d6a701b39eae70d380403Doug Zongkertypedef void (*fd_func)(int fd, unsigned events, void *userdata); 1849270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1859270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerfdevent *fdevent_create(int fd, fd_func func, void *arg); 1869270a20a801403c9f60d6a701b39eae70d380403Doug Zongkervoid fdevent_destroy(fdevent *fde); 1879270a20a801403c9f60d6a701b39eae70d380403Doug Zongkervoid fdevent_install(fdevent *fde, int fd, fd_func func, void *arg); 1889270a20a801403c9f60d6a701b39eae70d380403Doug Zongkervoid fdevent_remove(fdevent *item); 1899270a20a801403c9f60d6a701b39eae70d380403Doug Zongkervoid fdevent_set(fdevent *fde, unsigned events); 1909270a20a801403c9f60d6a701b39eae70d380403Doug Zongkervoid fdevent_add(fdevent *fde, unsigned events); 1919270a20a801403c9f60d6a701b39eae70d380403Doug Zongkervoid fdevent_del(fdevent *fde, unsigned events); 1929270a20a801403c9f60d6a701b39eae70d380403Doug Zongkervoid fdevent_loop(); 1939270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1949270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstruct fdevent { 1959270a20a801403c9f60d6a701b39eae70d380403Doug Zongker fdevent *next; 1969270a20a801403c9f60d6a701b39eae70d380403Doug Zongker fdevent *prev; 1979270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1989270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int fd; 1999270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int force_eof; 2009270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2019270a20a801403c9f60d6a701b39eae70d380403Doug Zongker unsigned short state; 2029270a20a801403c9f60d6a701b39eae70d380403Doug Zongker unsigned short events; 2039270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2049270a20a801403c9f60d6a701b39eae70d380403Doug Zongker fd_func func; 2059270a20a801403c9f60d6a701b39eae70d380403Doug Zongker void *arg; 2069270a20a801403c9f60d6a701b39eae70d380403Doug Zongker}; 2079270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2089270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ void adb_sleep_ms( int mseconds ) 2099270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 2109270a20a801403c9f60d6a701b39eae70d380403Doug Zongker Sleep( mseconds ); 2119270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 2129270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2139270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int adb_socket_accept(int serverfd, struct sockaddr* addr, socklen_t *addrlen); 2149270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2159270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef accept 2169270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define accept ___xxx_accept 2179270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2189270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_socket_setbufsize( int fd, int bufsize ) 2199270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 2209270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int opt = bufsize; 2219270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (const char*)&opt, sizeof(opt)); 2229270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 2239270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2249270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerextern int adb_socketpair( int sv[2] ); 2259270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2269270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ char* adb_dirstart( const char* path ) 2279270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 2289270a20a801403c9f60d6a701b39eae70d380403Doug Zongker char* p = strchr(path, '/'); 2299270a20a801403c9f60d6a701b39eae70d380403Doug Zongker char* p2 = strchr(path, '\\'); 2309270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2319270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if ( !p ) 2329270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p = p2; 2339270a20a801403c9f60d6a701b39eae70d380403Doug Zongker else if ( p2 && p2 > p ) 2349270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p = p2; 2359270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2369270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return p; 2379270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 2389270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2399270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ char* adb_dirstop( const char* path ) 2409270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 2419270a20a801403c9f60d6a701b39eae70d380403Doug Zongker char* p = strrchr(path, '/'); 2429270a20a801403c9f60d6a701b39eae70d380403Doug Zongker char* p2 = strrchr(path, '\\'); 2439270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2449270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if ( !p ) 2459270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p = p2; 2469270a20a801403c9f60d6a701b39eae70d380403Doug Zongker else if ( p2 && p2 > p ) 2479270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p = p2; 2489270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2499270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return p; 2509270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 2519270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2529270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_is_absolute_host_path( const char* path ) 2539270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 2549270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return isalpha(path[0]) && path[1] == ':' && path[2] == '\\'; 2559270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 2569270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2579270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#else /* !_WIN32 a.k.a. Unix */ 2589270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2599270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include "fdevent.h" 2609270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <cutils/sockets.h> 2619270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <cutils/properties.h> 2629270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <cutils/misc.h> 2639270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <signal.h> 2649270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <sys/wait.h> 2659270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <sys/stat.h> 2669270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <fcntl.h> 2679270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2689270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <pthread.h> 2699270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <unistd.h> 2709270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <fcntl.h> 2719270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <stdarg.h> 2729270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <netinet/in.h> 2739270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <netinet/tcp.h> 2749270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <string.h> 2759270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2769270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define OS_PATH_SEPARATOR '/' 2779270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define OS_PATH_SEPARATOR_STR "/" 2789270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2799270a20a801403c9f60d6a701b39eae70d380403Doug Zongkertypedef pthread_mutex_t adb_mutex_t; 2809270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2819270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define ADB_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER 2829270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_mutex_init pthread_mutex_init 2839270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_mutex_lock pthread_mutex_lock 2849270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_mutex_unlock pthread_mutex_unlock 2859270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_mutex_destroy pthread_mutex_destroy 2869270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2879270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define ADB_MUTEX_DEFINE(m) adb_mutex_t m = PTHREAD_MUTEX_INITIALIZER 2889270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2899270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_cond_t pthread_cond_t 2909270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_cond_init pthread_cond_init 2919270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_cond_wait pthread_cond_wait 2929270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_cond_broadcast pthread_cond_broadcast 2939270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_cond_signal pthread_cond_signal 2949270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define adb_cond_destroy pthread_cond_destroy 2959270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 2969270a20a801403c9f60d6a701b39eae70d380403Doug Zongker/* declare all mutexes */ 2979270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define ADB_MUTEX(x) extern adb_mutex_t x; 2989270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include "mutex_list.h" 2999270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3009270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ void close_on_exec(int fd) 3019270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3029270a20a801403c9f60d6a701b39eae70d380403Doug Zongker fcntl( fd, F_SETFD, FD_CLOEXEC ); 3039270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3049270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3059270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int unix_open(const char* path, int options,...) 3069270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3079270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if ((options & O_CREAT) == 0) 3089270a20a801403c9f60d6a701b39eae70d380403Doug Zongker { 3099270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return open(path, options); 3109270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 3119270a20a801403c9f60d6a701b39eae70d380403Doug Zongker else 3129270a20a801403c9f60d6a701b39eae70d380403Doug Zongker { 3139270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int mode; 3149270a20a801403c9f60d6a701b39eae70d380403Doug Zongker va_list args; 3159270a20a801403c9f60d6a701b39eae70d380403Doug Zongker va_start( args, options ); 3169270a20a801403c9f60d6a701b39eae70d380403Doug Zongker mode = va_arg( args, int ); 3179270a20a801403c9f60d6a701b39eae70d380403Doug Zongker va_end( args ); 3189270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return open(path, options, mode); 3199270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 3209270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3219270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3229270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_open_mode( const char* pathname, int options, int mode ) 3239270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3249270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return open( pathname, options, mode ); 3259270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3269270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 327703ed152147d90a549a2fee7cda5771703e502a0Doug Zongkerstatic __inline__ int adb_creat(const char* path, int mode) 328703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker{ 329703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker int fd = open(path, O_CREAT|O_WRONLY|O_TRUNC|O_NOFOLLOW, mode); 330703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker 331703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker if ( fd < 0 ) 332703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker return -1; 333703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker 334703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker close_on_exec(fd); 335703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker return fd; 336703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker} 337703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker#undef creat 338703ed152147d90a549a2fee7cda5771703e502a0Doug Zongker#define creat ___xxx_creat 3399270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3409270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_open( const char* pathname, int options ) 3419270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3429270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int fd = open( pathname, options ); 3439270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if (fd < 0) 3449270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return -1; 3459270a20a801403c9f60d6a701b39eae70d380403Doug Zongker close_on_exec( fd ); 3469270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return fd; 3479270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3489270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef open 3499270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define open ___xxx_open 3509270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3519270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_shutdown(int fd) 3529270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3539270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return shutdown(fd, SHUT_RDWR); 3549270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3559270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef shutdown 3569270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define shutdown ____xxx_shutdown 3579270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3589270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_close(int fd) 3599270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3609270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return close(fd); 3619270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3629270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef close 3639270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define close ____xxx_close 3649270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3659270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3669270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_read(int fd, void* buf, size_t len) 3679270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3689270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return read(fd, buf, len); 3699270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3709270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3719270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef read 3729270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define read ___xxx_read 3739270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3749270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_write(int fd, const void* buf, size_t len) 3759270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3769270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return write(fd, buf, len); 3779270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3789270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef write 3799270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define write ___xxx_write 3809270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3819270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_lseek(int fd, int pos, int where) 3829270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3839270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return lseek(fd, pos, where); 3849270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3859270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef lseek 3869270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define lseek ___xxx_lseek 3879270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3889270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_unlink(const char* path) 3899270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3909270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return unlink(path); 3919270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 3929270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef unlink 3939270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define unlink ___xxx_unlink 3949270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3959270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_socket_accept(int serverfd, struct sockaddr* addr, socklen_t *addrlen) 3969270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 3979270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int fd; 3989270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 3999270a20a801403c9f60d6a701b39eae70d380403Doug Zongker fd = accept(serverfd, addr, addrlen); 4009270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if (fd >= 0) 4019270a20a801403c9f60d6a701b39eae70d380403Doug Zongker close_on_exec(fd); 4029270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4039270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return fd; 4049270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4059270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4069270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef accept 4079270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define accept ___xxx_accept 4089270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4099270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define unix_read adb_read 4109270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define unix_write adb_write 4119270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define unix_close adb_close 4129270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4139270a20a801403c9f60d6a701b39eae70d380403Doug Zongkertypedef pthread_t adb_thread_t; 4149270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4159270a20a801403c9f60d6a701b39eae70d380403Doug Zongkertypedef void* (*adb_thread_func_t)( void* arg ); 4169270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4179270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_thread_create( adb_thread_t *pthread, adb_thread_func_t start, void* arg ) 4189270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4199270a20a801403c9f60d6a701b39eae70d380403Doug Zongker pthread_attr_t attr; 4209270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4219270a20a801403c9f60d6a701b39eae70d380403Doug Zongker pthread_attr_init (&attr); 4229270a20a801403c9f60d6a701b39eae70d380403Doug Zongker pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); 4239270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4249270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return pthread_create( pthread, &attr, start, arg ); 4259270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4269270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4279270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_socket_setbufsize( int fd, int bufsize ) 4289270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4299270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int opt = bufsize; 4309270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)); 4319270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4329270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4339270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ void disable_tcp_nagle(int fd) 4349270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4359270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int on = 1; 4369270a20a801403c9f60d6a701b39eae70d380403Doug Zongker setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, (void*)&on, sizeof(on) ); 4379270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4389270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4399270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4409270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int unix_socketpair( int d, int type, int protocol, int sv[2] ) 4419270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4429270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return socketpair( d, type, protocol, sv ); 4439270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4449270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4459270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_socketpair( int sv[2] ) 4469270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4479270a20a801403c9f60d6a701b39eae70d380403Doug Zongker int rc; 4489270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4499270a20a801403c9f60d6a701b39eae70d380403Doug Zongker rc = unix_socketpair( AF_UNIX, SOCK_STREAM, 0, sv ); 4509270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if (rc < 0) 4519270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return -1; 4529270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4539270a20a801403c9f60d6a701b39eae70d380403Doug Zongker close_on_exec( sv[0] ); 4549270a20a801403c9f60d6a701b39eae70d380403Doug Zongker close_on_exec( sv[1] ); 4559270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return 0; 4569270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4579270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4589270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef socketpair 4599270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define socketpair ___xxx_socketpair 4609270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4619270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ void adb_sleep_ms( int mseconds ) 4629270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4639270a20a801403c9f60d6a701b39eae70d380403Doug Zongker usleep( mseconds*1000 ); 4649270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4659270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4669270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_mkdir(const char* path, int mode) 4679270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4689270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return mkdir(path, mode); 4699270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4709270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#undef mkdir 4719270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define mkdir ___xxx_mkdir 4729270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4739270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ void adb_sysdeps_init(void) 4749270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4759270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4769270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4779270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ char* adb_dirstart(const char* path) 4789270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4799270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return strchr(path, '/'); 4809270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4819270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4829270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ char* adb_dirstop(const char* path) 4839270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4849270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return strrchr(path, '/'); 4859270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4869270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4879270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic __inline__ int adb_is_absolute_host_path( const char* path ) 4889270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 4899270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return path[0] == '/'; 4909270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 4919270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4929270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#endif /* !_WIN32 */ 4939270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 4949270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#endif /* _ADB_SYSDEPS_H */ 495