blob: 729bbcb201f5a4bfc9ab071af8eebabbd60d81e9 [file] [log] [blame]
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/* this file contains system-dependent definitions used by ADB
18 * they're related to threads, sockets and file descriptors
19 */
20#ifndef _ADB_SYSDEPS_H
21#define _ADB_SYSDEPS_H
22
23#ifdef __CYGWIN__
24# undef _WIN32
25#endif
26
Elliott Hughes381cfa92015-07-23 17:12:58 -070027#include <errno.h>
28
Dan Albertcc731cc2015-02-24 21:26:58 -080029/*
30 * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
31 * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
32 * not already defined, then define it here.
33 */
34#ifndef TEMP_FAILURE_RETRY
35/* Used to retry syscalls that can return EINTR. */
36#define TEMP_FAILURE_RETRY(exp) ({ \
37 typeof (exp) _rc; \
38 do { \
39 _rc = (exp); \
40 } while (_rc == -1 && errno == EINTR); \
41 _rc; })
42#endif
43
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080044#ifdef _WIN32
45
Dan Albert630b9af2014-11-24 23:34:35 -080046#include <ctype.h>
47#include <direct.h>
48#include <errno.h>
49#include <fcntl.h>
50#include <io.h>
51#include <process.h>
52#include <sys/stat.h>
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080053#include <winsock2.h>
Stephen Hines2f431a82014-10-01 17:37:06 -070054#include <windows.h>
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080055#include <ws2tcpip.h>
Dan Albert630b9af2014-11-24 23:34:35 -080056
57#include "fdevent.h"
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080058
59#define OS_PATH_SEPARATOR '\\'
60#define OS_PATH_SEPARATOR_STR "\\"
Benoit Gobyd5fcafa2012-04-12 12:23:49 -070061#define ENV_PATH_SEPARATOR_STR ";"
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080062
63typedef CRITICAL_SECTION adb_mutex_t;
64
65#define ADB_MUTEX_DEFINE(x) adb_mutex_t x
66
67/* declare all mutexes */
JP Abgrall408fa572011-03-16 15:57:42 -070068/* For win32, adb_sysdeps_init() will do the mutex runtime initialization. */
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080069#define ADB_MUTEX(x) extern adb_mutex_t x;
70#include "mutex_list.h"
71
72extern void adb_sysdeps_init(void);
73
74static __inline__ void adb_mutex_lock( adb_mutex_t* lock )
75{
76 EnterCriticalSection( lock );
77}
78
79static __inline__ void adb_mutex_unlock( adb_mutex_t* lock )
80{
81 LeaveCriticalSection( lock );
82}
83
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080084typedef void* (*adb_thread_func_t)(void* arg);
85
86typedef void (*win_thread_func_t)(void* arg);
87
Elliott Hughes9b0f3542015-05-05 13:41:21 -070088static __inline__ bool adb_thread_create(adb_thread_func_t func, void* arg) {
Elliott Hughes2e4a2ee2015-05-05 14:34:41 -070089 uintptr_t tid = _beginthread((win_thread_func_t)func, 0, arg);
90 return (tid != static_cast<uintptr_t>(-1L));
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080091}
92
leozwangcbf02672014-08-15 09:51:27 -070093static __inline__ unsigned long adb_thread_id()
94{
95 return GetCurrentThreadId();
96}
97
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080098static __inline__ void close_on_exec(int fd)
99{
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +0200100 /* nothing really */
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800101}
102
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800103#define lstat stat /* no symlinks on Win32 */
104
105#define S_ISLNK(m) 0 /* no symlinks on Win32 */
106
107static __inline__ int adb_unlink(const char* path)
108{
109 int rc = unlink(path);
110
111 if (rc == -1 && errno == EACCES) {
112 /* unlink returns EACCES when the file is read-only, so we first */
113 /* try to make it writable, then unlink again... */
114 rc = chmod(path, _S_IREAD|_S_IWRITE );
115 if (rc == 0)
116 rc = unlink(path);
117 }
118 return rc;
119}
120#undef unlink
121#define unlink ___xxx_unlink
122
123static __inline__ int adb_mkdir(const char* path, int mode)
124{
JP Abgrall0e7c4272011-02-23 18:44:39 -0800125 return _mkdir(path);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800126}
127#undef mkdir
128#define mkdir ___xxx_mkdir
129
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700130// See the comments for the !defined(_WIN32) versions of adb_*().
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800131extern int adb_open(const char* path, int options);
132extern int adb_creat(const char* path, int mode);
133extern int adb_read(int fd, void* buf, int len);
134extern int adb_write(int fd, const void* buf, int len);
135extern int adb_lseek(int fd, int pos, int where);
Mike Lockwood8cf0d592009-10-11 23:04:18 -0400136extern int adb_shutdown(int fd);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800137extern int adb_close(int fd);
138
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700139// See the comments for the !defined(_WIN32) version of unix_close().
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800140static __inline__ int unix_close(int fd)
141{
142 return close(fd);
143}
144#undef close
145#define close ____xxx_close
146
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700147// See the comments for the !defined(_WIN32) version of unix_read().
Spencer Low50184062015-03-01 15:06:21 -0800148extern int unix_read(int fd, void* buf, size_t len);
149
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800150#undef read
151#define read ___xxx_read
152
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700153// See the comments for the !defined(_WIN32) version of unix_write().
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800154static __inline__ int unix_write(int fd, const void* buf, size_t len)
155{
156 return write(fd, buf, len);
157}
158#undef write
159#define write ___xxx_write
160
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700161// See the comments for the !defined(_WIN32) version of adb_open_mode().
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800162static __inline__ int adb_open_mode(const char* path, int options, int mode)
163{
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +0200164 return adb_open(path, options);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800165}
166
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700167// See the comments for the !defined(_WIN32) version of unix_open().
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800168static __inline__ int unix_open(const char* path, int options,...)
169{
170 if ((options & O_CREAT) == 0)
171 {
172 return open(path, options);
173 }
174 else
175 {
176 int mode;
177 va_list args;
178 va_start( args, options );
179 mode = va_arg( args, int );
180 va_end( args );
181 return open(path, options, mode);
182 }
183}
184#define open ___xxx_unix_open
185
186
187/* normally provided by <cutils/misc.h> */
188extern void* load_file(const char* pathname, unsigned* psize);
189
David 'Digit' Turner414ff7d2009-05-18 17:07:46 +0200190/* normally provided by "fdevent.h" */
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800191
192#define FDE_READ 0x0001
193#define FDE_WRITE 0x0002
194#define FDE_ERROR 0x0004
195#define FDE_DONT_CLOSE 0x0080
196
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800197typedef void (*fd_func)(int fd, unsigned events, void *userdata);
198
199fdevent *fdevent_create(int fd, fd_func func, void *arg);
200void fdevent_destroy(fdevent *fde);
201void fdevent_install(fdevent *fde, int fd, fd_func func, void *arg);
202void fdevent_remove(fdevent *item);
203void fdevent_set(fdevent *fde, unsigned events);
204void fdevent_add(fdevent *fde, unsigned events);
205void fdevent_del(fdevent *fde, unsigned events);
206void fdevent_loop();
207
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800208static __inline__ void adb_sleep_ms( int mseconds )
209{
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +0200210 Sleep( mseconds );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800211}
212
213extern int adb_socket_accept(int serverfd, struct sockaddr* addr, socklen_t *addrlen);
214
215#undef accept
216#define accept ___xxx_accept
217
Spencer Lowf055c192015-01-25 14:40:16 -0800218extern int adb_setsockopt(int fd, int level, int optname, const void* optval, socklen_t optlen);
219
220#undef setsockopt
221#define setsockopt ___xxx_setsockopt
222
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800223static __inline__ int adb_socket_setbufsize( int fd, int bufsize )
224{
225 int opt = bufsize;
Spencer Lowf055c192015-01-25 14:40:16 -0800226 return adb_setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (const void*)&opt, sizeof(opt));
227}
228
229static __inline__ void disable_tcp_nagle( int fd )
230{
231 int on = 1;
232 adb_setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const void*)&on, sizeof(on));
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800233}
234
235extern int adb_socketpair( int sv[2] );
236
237static __inline__ char* adb_dirstart( const char* path )
238{
239 char* p = strchr(path, '/');
240 char* p2 = strchr(path, '\\');
241
242 if ( !p )
243 p = p2;
244 else if ( p2 && p2 > p )
245 p = p2;
246
247 return p;
248}
249
Elliott Hughes3e7048c2015-07-27 21:21:39 -0700250static __inline__ const char* adb_dirstop( const char* path )
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800251{
Elliott Hughes3e7048c2015-07-27 21:21:39 -0700252 const char* p = strrchr(path, '/');
253 const char* p2 = strrchr(path, '\\');
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800254
255 if ( !p )
256 p = p2;
257 else if ( p2 && p2 > p )
258 p = p2;
259
260 return p;
261}
262
263static __inline__ int adb_is_absolute_host_path( const char* path )
264{
265 return isalpha(path[0]) && path[1] == ':' && path[2] == '\\';
266}
267
268#else /* !_WIN32 a.k.a. Unix */
269
David 'Digit' Turner414ff7d2009-05-18 17:07:46 +0200270#include "fdevent.h"
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800271#include <cutils/misc.h>
Spencer Low8d8126a2015-07-21 02:06:26 -0700272#include <cutils/threads.h>
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800273#include <signal.h>
274#include <sys/wait.h>
275#include <sys/stat.h>
276#include <fcntl.h>
277
278#include <pthread.h>
279#include <unistd.h>
280#include <fcntl.h>
281#include <stdarg.h>
282#include <netinet/in.h>
283#include <netinet/tcp.h>
284#include <string.h>
Kenny Root73167412012-10-12 15:26:45 -0700285#include <unistd.h>
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800286
287#define OS_PATH_SEPARATOR '/'
288#define OS_PATH_SEPARATOR_STR "/"
Benoit Gobyd5fcafa2012-04-12 12:23:49 -0700289#define ENV_PATH_SEPARATOR_STR ":"
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800290
291typedef pthread_mutex_t adb_mutex_t;
JP Abgrall408fa572011-03-16 15:57:42 -0700292
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800293#define ADB_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
294#define adb_mutex_init pthread_mutex_init
295#define adb_mutex_lock pthread_mutex_lock
296#define adb_mutex_unlock pthread_mutex_unlock
297#define adb_mutex_destroy pthread_mutex_destroy
298
JP Abgrall408fa572011-03-16 15:57:42 -0700299#define ADB_MUTEX_DEFINE(m) adb_mutex_t m = PTHREAD_MUTEX_INITIALIZER
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800300
301#define adb_cond_t pthread_cond_t
302#define adb_cond_init pthread_cond_init
303#define adb_cond_wait pthread_cond_wait
304#define adb_cond_broadcast pthread_cond_broadcast
305#define adb_cond_signal pthread_cond_signal
306#define adb_cond_destroy pthread_cond_destroy
307
JP Abgrall408fa572011-03-16 15:57:42 -0700308/* declare all mutexes */
309#define ADB_MUTEX(x) extern adb_mutex_t x;
310#include "mutex_list.h"
311
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800312static __inline__ void close_on_exec(int fd)
313{
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +0200314 fcntl( fd, F_SETFD, FD_CLOEXEC );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800315}
316
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700317// Open a file and return a file descriptor that may be used with unix_read(),
318// unix_write(), unix_close(), but not adb_read(), adb_write(), adb_close().
319//
320// On Unix, this is based on open(), so the file descriptor is a real OS file
321// descriptor, but the Windows implementation (in sysdeps_win32.cpp) returns a
322// file descriptor that can only be used with C Runtime APIs (which are wrapped
323// by unix_read(), unix_write(), unix_close()). Also, the C Runtime has
324// configurable CR/LF translation which defaults to text mode, but is settable
325// with _setmode().
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800326static __inline__ int unix_open(const char* path, int options,...)
327{
328 if ((options & O_CREAT) == 0)
329 {
Kenny Root73167412012-10-12 15:26:45 -0700330 return TEMP_FAILURE_RETRY( open(path, options) );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800331 }
332 else
333 {
334 int mode;
335 va_list args;
336 va_start( args, options );
337 mode = va_arg( args, int );
338 va_end( args );
Kenny Root73167412012-10-12 15:26:45 -0700339 return TEMP_FAILURE_RETRY( open( path, options, mode ) );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800340 }
341}
342
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700343// Similar to the two-argument adb_open(), but takes a mode parameter for file
344// creation. See adb_open() for more info.
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800345static __inline__ int adb_open_mode( const char* pathname, int options, int mode )
346{
Kenny Root73167412012-10-12 15:26:45 -0700347 return TEMP_FAILURE_RETRY( open( pathname, options, mode ) );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800348}
349
350
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700351// Open a file and return a file descriptor that may be used with adb_read(),
352// adb_write(), adb_close(), but not unix_read(), unix_write(), unix_close().
353//
354// On Unix, this is based on open(), but the Windows implementation (in
355// sysdeps_win32.cpp) uses Windows native file I/O and bypasses the C Runtime
356// and its CR/LF translation. The returned file descriptor should be used with
357// adb_read(), adb_write(), adb_close(), etc.
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800358static __inline__ int adb_open( const char* pathname, int options )
359{
Kenny Root73167412012-10-12 15:26:45 -0700360 int fd = TEMP_FAILURE_RETRY( open( pathname, options ) );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800361 if (fd < 0)
362 return -1;
363 close_on_exec( fd );
364 return fd;
365}
366#undef open
367#define open ___xxx_open
368
Mike Lockwood8cf0d592009-10-11 23:04:18 -0400369static __inline__ int adb_shutdown(int fd)
370{
371 return shutdown(fd, SHUT_RDWR);
372}
373#undef shutdown
374#define shutdown ____xxx_shutdown
375
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700376// Closes a file descriptor that came from adb_open() or adb_open_mode(), but
377// not designed to take a file descriptor from unix_open(). See the comments
378// for adb_open() for more info.
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800379static __inline__ int adb_close(int fd)
380{
381 return close(fd);
382}
383#undef close
384#define close ____xxx_close
385
386
387static __inline__ int adb_read(int fd, void* buf, size_t len)
388{
Kenny Root73167412012-10-12 15:26:45 -0700389 return TEMP_FAILURE_RETRY( read( fd, buf, len ) );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800390}
391
392#undef read
393#define read ___xxx_read
394
395static __inline__ int adb_write(int fd, const void* buf, size_t len)
396{
Kenny Root73167412012-10-12 15:26:45 -0700397 return TEMP_FAILURE_RETRY( write( fd, buf, len ) );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800398}
399#undef write
400#define write ___xxx_write
401
402static __inline__ int adb_lseek(int fd, int pos, int where)
403{
404 return lseek(fd, pos, where);
405}
406#undef lseek
407#define lseek ___xxx_lseek
408
409static __inline__ int adb_unlink(const char* path)
410{
411 return unlink(path);
412}
413#undef unlink
414#define unlink ___xxx_unlink
415
416static __inline__ int adb_creat(const char* path, int mode)
417{
Kenny Root73167412012-10-12 15:26:45 -0700418 int fd = TEMP_FAILURE_RETRY( creat( path, mode ) );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800419
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +0200420 if ( fd < 0 )
421 return -1;
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800422
423 close_on_exec(fd);
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +0200424 return fd;
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800425}
426#undef creat
427#define creat ___xxx_creat
428
429static __inline__ int adb_socket_accept(int serverfd, struct sockaddr* addr, socklen_t *addrlen)
430{
Benoit Goby95ef8282011-02-01 18:57:41 -0800431 int fd;
432
Kenny Root73167412012-10-12 15:26:45 -0700433 fd = TEMP_FAILURE_RETRY( accept( serverfd, addr, addrlen ) );
Benoit Goby95ef8282011-02-01 18:57:41 -0800434 if (fd >= 0)
435 close_on_exec(fd);
436
437 return fd;
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800438}
439
440#undef accept
441#define accept ___xxx_accept
442
Spencer Low6ac5d7d2015-05-22 20:09:06 -0700443// Operate on a file descriptor returned from unix_open() or a well-known file
444// descriptor such as STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
445//
446// On Unix, unix_read(), unix_write(), unix_close() map to adb_read(),
447// adb_write(), adb_close() (which all map to Unix system calls), but the
448// Windows implementations (in the ifdef above and in sysdeps_win32.cpp) call
449// into the C Runtime and its configurable CR/LF translation (which is settable
450// via _setmode()).
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800451#define unix_read adb_read
452#define unix_write adb_write
453#define unix_close adb_close
454
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800455typedef void* (*adb_thread_func_t)( void* arg );
456
Elliott Hughes9b0f3542015-05-05 13:41:21 -0700457static __inline__ bool adb_thread_create(adb_thread_func_t start, void* arg) {
458 pthread_attr_t attr;
459 pthread_attr_init(&attr);
460 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800461
Elliott Hughes9b0f3542015-05-05 13:41:21 -0700462 pthread_t thread;
463 errno = pthread_create(&thread, &attr, start, arg);
464 return (errno == 0);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800465}
466
467static __inline__ int adb_socket_setbufsize( int fd, int bufsize )
468{
469 int opt = bufsize;
470 return setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
471}
472
473static __inline__ void disable_tcp_nagle(int fd)
474{
475 int on = 1;
476 setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, (void*)&on, sizeof(on) );
477}
478
Spencer Lowf055c192015-01-25 14:40:16 -0800479static __inline__ int adb_setsockopt( int fd, int level, int optname, const void* optval, socklen_t optlen )
480{
481 return setsockopt( fd, level, optname, optval, optlen );
482}
483
484#undef setsockopt
485#define setsockopt ___xxx_setsockopt
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800486
487static __inline__ int unix_socketpair( int d, int type, int protocol, int sv[2] )
488{
489 return socketpair( d, type, protocol, sv );
490}
491
492static __inline__ int adb_socketpair( int sv[2] )
493{
494 int rc;
495
496 rc = unix_socketpair( AF_UNIX, SOCK_STREAM, 0, sv );
497 if (rc < 0)
498 return -1;
499
500 close_on_exec( sv[0] );
501 close_on_exec( sv[1] );
502 return 0;
503}
504
505#undef socketpair
506#define socketpair ___xxx_socketpair
507
508static __inline__ void adb_sleep_ms( int mseconds )
509{
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +0200510 usleep( mseconds*1000 );
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800511}
512
513static __inline__ int adb_mkdir(const char* path, int mode)
514{
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +0200515 return mkdir(path, mode);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800516}
517#undef mkdir
518#define mkdir ___xxx_mkdir
519
520static __inline__ void adb_sysdeps_init(void)
521{
522}
523
Elliott Hughes3e7048c2015-07-27 21:21:39 -0700524static __inline__ const char* adb_dirstart(const char* path)
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800525{
526 return strchr(path, '/');
527}
528
Elliott Hughes3e7048c2015-07-27 21:21:39 -0700529static __inline__ const char* adb_dirstop(const char* path)
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800530{
531 return strrchr(path, '/');
532}
533
534static __inline__ int adb_is_absolute_host_path( const char* path )
535{
536 return path[0] == '/';
537}
538
leozwangcbf02672014-08-15 09:51:27 -0700539static __inline__ unsigned long adb_thread_id()
540{
Spencer Low8d8126a2015-07-21 02:06:26 -0700541 return (unsigned long)gettid();
leozwangcbf02672014-08-15 09:51:27 -0700542}
543
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800544#endif /* !_WIN32 */
545
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800546#endif /* _ADB_SYSDEPS_H */