Merge "adb: fix adb_close() vs. unix_close() usage"
This commit is contained in:
commit
ebce147077
9 changed files with 79 additions and 35 deletions
|
@ -115,7 +115,7 @@ void start_device_log(void) {
|
|||
dup2(fd, STDOUT_FILENO);
|
||||
dup2(fd, STDERR_FILENO);
|
||||
fprintf(stderr, "--- adb starting (pid %d) ---\n", getpid());
|
||||
adb_close(fd);
|
||||
unix_close(fd);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -420,6 +420,9 @@ int adb_auth_get_userkey(unsigned char *data, size_t len)
|
|||
strcat(path, ".pub");
|
||||
|
||||
// TODO(danalbert): ReadFileToString
|
||||
// Note that on Windows, load_file() does not do CR/LF translation, but
|
||||
// ReadFileToString() uses the C Runtime which uses CR/LF translation by
|
||||
// default (by is overridable with _setmode()).
|
||||
unsigned size;
|
||||
char* file_data = reinterpret_cast<char*>(load_file(path, &size));
|
||||
if (file_data == nullptr) {
|
||||
|
|
|
@ -226,7 +226,7 @@ static void close_stdin() {
|
|||
return;
|
||||
}
|
||||
dup2(fd, STDIN_FILENO);
|
||||
adb_close(fd);
|
||||
unix_close(fd);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
|
|
|
@ -58,7 +58,7 @@ bool make_block_device_writable(const std::string& dev) {
|
|||
|
||||
int OFF = 0;
|
||||
bool result = (ioctl(fd, BLKROSET, &OFF) != -1);
|
||||
adb_close(fd);
|
||||
unix_close(fd);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -252,7 +252,7 @@ static int create_subproc_pty(const char* cmd, const char* arg0,
|
|||
*pid = forkpty(&ptm, pts_name, nullptr, nullptr);
|
||||
if (*pid == -1) {
|
||||
printf("- fork failed: %s -\n", strerror(errno));
|
||||
adb_close(ptm);
|
||||
unix_close(ptm);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -263,7 +263,7 @@ static int create_subproc_pty(const char* cmd, const char* arg0,
|
|||
if (pts == -1) {
|
||||
fprintf(stderr, "child failed to open pseudo-term slave %s: %s\n",
|
||||
pts_name, strerror(errno));
|
||||
adb_close(ptm);
|
||||
unix_close(ptm);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
|
@ -272,16 +272,16 @@ static int create_subproc_pty(const char* cmd, const char* arg0,
|
|||
termios tattr;
|
||||
if (tcgetattr(pts, &tattr) == -1) {
|
||||
fprintf(stderr, "tcgetattr failed: %s\n", strerror(errno));
|
||||
adb_close(pts);
|
||||
adb_close(ptm);
|
||||
unix_close(pts);
|
||||
unix_close(ptm);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
cfmakeraw(&tattr);
|
||||
if (tcsetattr(pts, TCSADRAIN, &tattr) == -1) {
|
||||
fprintf(stderr, "tcsetattr failed: %s\n", strerror(errno));
|
||||
adb_close(pts);
|
||||
adb_close(ptm);
|
||||
unix_close(pts);
|
||||
unix_close(ptm);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
@ -290,8 +290,8 @@ static int create_subproc_pty(const char* cmd, const char* arg0,
|
|||
dup2(pts, STDOUT_FILENO);
|
||||
dup2(pts, STDERR_FILENO);
|
||||
|
||||
adb_close(pts);
|
||||
adb_close(ptm);
|
||||
unix_close(pts);
|
||||
unix_close(ptm);
|
||||
|
||||
execl(cmd, cmd, arg0, arg1, nullptr);
|
||||
fprintf(stderr, "- exec '%s' failed: %s (%d) -\n",
|
||||
|
|
|
@ -125,6 +125,7 @@ static __inline__ int adb_mkdir(const char* path, int mode)
|
|||
#undef mkdir
|
||||
#define mkdir ___xxx_mkdir
|
||||
|
||||
// See the comments for the !defined(_WIN32) versions of adb_*().
|
||||
extern int adb_open(const char* path, int options);
|
||||
extern int adb_creat(const char* path, int mode);
|
||||
extern int adb_read(int fd, void* buf, int len);
|
||||
|
@ -133,6 +134,7 @@ extern int adb_lseek(int fd, int pos, int where);
|
|||
extern int adb_shutdown(int fd);
|
||||
extern int adb_close(int fd);
|
||||
|
||||
// See the comments for the !defined(_WIN32) version of unix_close().
|
||||
static __inline__ int unix_close(int fd)
|
||||
{
|
||||
return close(fd);
|
||||
|
@ -140,11 +142,13 @@ static __inline__ int unix_close(int fd)
|
|||
#undef close
|
||||
#define close ____xxx_close
|
||||
|
||||
// See the comments for the !defined(_WIN32) version of unix_read().
|
||||
extern int unix_read(int fd, void* buf, size_t len);
|
||||
|
||||
#undef read
|
||||
#define read ___xxx_read
|
||||
|
||||
// See the comments for the !defined(_WIN32) version of unix_write().
|
||||
static __inline__ int unix_write(int fd, const void* buf, size_t len)
|
||||
{
|
||||
return write(fd, buf, len);
|
||||
|
@ -152,11 +156,13 @@ static __inline__ int unix_write(int fd, const void* buf, size_t len)
|
|||
#undef write
|
||||
#define write ___xxx_write
|
||||
|
||||
// See the comments for the !defined(_WIN32) version of adb_open_mode().
|
||||
static __inline__ int adb_open_mode(const char* path, int options, int mode)
|
||||
{
|
||||
return adb_open(path, options);
|
||||
}
|
||||
|
||||
// See the comments for the !defined(_WIN32) version of unix_open().
|
||||
static __inline__ int unix_open(const char* path, int options,...)
|
||||
{
|
||||
if ((options & O_CREAT) == 0)
|
||||
|
@ -314,6 +320,15 @@ static __inline__ void close_on_exec(int fd)
|
|||
fcntl( fd, F_SETFD, FD_CLOEXEC );
|
||||
}
|
||||
|
||||
// Open a file and return a file descriptor that may be used with unix_read(),
|
||||
// unix_write(), unix_close(), but not adb_read(), adb_write(), adb_close().
|
||||
//
|
||||
// On Unix, this is based on open(), so the file descriptor is a real OS file
|
||||
// descriptor, but the Windows implementation (in sysdeps_win32.cpp) returns a
|
||||
// file descriptor that can only be used with C Runtime APIs (which are wrapped
|
||||
// by unix_read(), unix_write(), unix_close()). Also, the C Runtime has
|
||||
// configurable CR/LF translation which defaults to text mode, but is settable
|
||||
// with _setmode().
|
||||
static __inline__ int unix_open(const char* path, int options,...)
|
||||
{
|
||||
if ((options & O_CREAT) == 0)
|
||||
|
@ -331,12 +346,21 @@ static __inline__ int unix_open(const char* path, int options,...)
|
|||
}
|
||||
}
|
||||
|
||||
// Similar to the two-argument adb_open(), but takes a mode parameter for file
|
||||
// creation. See adb_open() for more info.
|
||||
static __inline__ int adb_open_mode( const char* pathname, int options, int mode )
|
||||
{
|
||||
return TEMP_FAILURE_RETRY( open( pathname, options, mode ) );
|
||||
}
|
||||
|
||||
|
||||
// Open a file and return a file descriptor that may be used with adb_read(),
|
||||
// adb_write(), adb_close(), but not unix_read(), unix_write(), unix_close().
|
||||
//
|
||||
// On Unix, this is based on open(), but the Windows implementation (in
|
||||
// sysdeps_win32.cpp) uses Windows native file I/O and bypasses the C Runtime
|
||||
// and its CR/LF translation. The returned file descriptor should be used with
|
||||
// adb_read(), adb_write(), adb_close(), etc.
|
||||
static __inline__ int adb_open( const char* pathname, int options )
|
||||
{
|
||||
int fd = TEMP_FAILURE_RETRY( open( pathname, options ) );
|
||||
|
@ -355,6 +379,9 @@ static __inline__ int adb_shutdown(int fd)
|
|||
#undef shutdown
|
||||
#define shutdown ____xxx_shutdown
|
||||
|
||||
// Closes a file descriptor that came from adb_open() or adb_open_mode(), but
|
||||
// not designed to take a file descriptor from unix_open(). See the comments
|
||||
// for adb_open() for more info.
|
||||
static __inline__ int adb_close(int fd)
|
||||
{
|
||||
return close(fd);
|
||||
|
@ -419,6 +446,14 @@ static __inline__ int adb_socket_accept(int serverfd, struct sockaddr* addr,
|
|||
#undef accept
|
||||
#define accept ___xxx_accept
|
||||
|
||||
// Operate on a file descriptor returned from unix_open() or a well-known file
|
||||
// descriptor such as STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
|
||||
//
|
||||
// On Unix, unix_read(), unix_write(), unix_close() map to adb_read(),
|
||||
// adb_write(), adb_close() (which all map to Unix system calls), but the
|
||||
// Windows implementations (in the ifdef above and in sysdeps_win32.cpp) call
|
||||
// into the C Runtime and its configurable CR/LF translation (which is settable
|
||||
// via _setmode()).
|
||||
#define unix_read adb_read
|
||||
#define unix_write adb_write
|
||||
#define unix_close adb_close
|
||||
|
|
|
@ -172,14 +172,15 @@ static FHRec _win32_fhs[ WIN32_MAX_FHS ];
|
|||
static int _win32_fh_count;
|
||||
|
||||
static FH
|
||||
_fh_from_int( int fd )
|
||||
_fh_from_int( int fd, const char* func )
|
||||
{
|
||||
FH f;
|
||||
|
||||
fd -= WIN32_FH_BASE;
|
||||
|
||||
if (fd < 0 || fd >= _win32_fh_count) {
|
||||
D( "_fh_from_int: invalid fd %d\n", fd + WIN32_FH_BASE );
|
||||
D( "_fh_from_int: invalid fd %d passed to %s\n", fd + WIN32_FH_BASE,
|
||||
func );
|
||||
errno = EBADF;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -187,7 +188,8 @@ _fh_from_int( int fd )
|
|||
f = &_win32_fhs[fd];
|
||||
|
||||
if (f->used == 0) {
|
||||
D( "_fh_from_int: invalid fd %d\n", fd + WIN32_FH_BASE );
|
||||
D( "_fh_from_int: invalid fd %d passed to %s\n", fd + WIN32_FH_BASE,
|
||||
func );
|
||||
errno = EBADF;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -427,7 +429,7 @@ int adb_creat(const char* path, int mode)
|
|||
|
||||
int adb_read(int fd, void* buf, int len)
|
||||
{
|
||||
FH f = _fh_from_int(fd);
|
||||
FH f = _fh_from_int(fd, __func__);
|
||||
|
||||
if (f == NULL) {
|
||||
return -1;
|
||||
|
@ -439,7 +441,7 @@ int adb_read(int fd, void* buf, int len)
|
|||
|
||||
int adb_write(int fd, const void* buf, int len)
|
||||
{
|
||||
FH f = _fh_from_int(fd);
|
||||
FH f = _fh_from_int(fd, __func__);
|
||||
|
||||
if (f == NULL) {
|
||||
return -1;
|
||||
|
@ -451,7 +453,7 @@ int adb_write(int fd, const void* buf, int len)
|
|||
|
||||
int adb_lseek(int fd, int pos, int where)
|
||||
{
|
||||
FH f = _fh_from_int(fd);
|
||||
FH f = _fh_from_int(fd, __func__);
|
||||
|
||||
if (!f) {
|
||||
return -1;
|
||||
|
@ -463,7 +465,7 @@ int adb_lseek(int fd, int pos, int where)
|
|||
|
||||
int adb_shutdown(int fd)
|
||||
{
|
||||
FH f = _fh_from_int(fd);
|
||||
FH f = _fh_from_int(fd, __func__);
|
||||
|
||||
if (!f || f->clazz != &_fh_socket_class) {
|
||||
D("adb_shutdown: invalid fd %d\n", fd);
|
||||
|
@ -478,7 +480,7 @@ int adb_shutdown(int fd)
|
|||
|
||||
int adb_close(int fd)
|
||||
{
|
||||
FH f = _fh_from_int(fd);
|
||||
FH f = _fh_from_int(fd, __func__);
|
||||
|
||||
if (!f) {
|
||||
return -1;
|
||||
|
@ -763,7 +765,7 @@ int socket_inaddr_any_server(int port, int type)
|
|||
#undef accept
|
||||
int adb_socket_accept(int serverfd, struct sockaddr* addr, socklen_t *addrlen)
|
||||
{
|
||||
FH serverfh = _fh_from_int(serverfd);
|
||||
FH serverfh = _fh_from_int(serverfd, __func__);
|
||||
FH fh;
|
||||
|
||||
if ( !serverfh || serverfh->clazz != &_fh_socket_class ) {
|
||||
|
@ -792,7 +794,7 @@ int adb_socket_accept(int serverfd, struct sockaddr* addr, socklen_t *addrle
|
|||
|
||||
int adb_setsockopt( int fd, int level, int optname, const void* optval, socklen_t optlen )
|
||||
{
|
||||
FH fh = _fh_from_int(fd);
|
||||
FH fh = _fh_from_int(fd, __func__);
|
||||
|
||||
if ( !fh || fh->clazz != &_fh_socket_class ) {
|
||||
D("adb_setsockopt: invalid fd %d\n", fd);
|
||||
|
@ -1386,7 +1388,7 @@ event_looper_find_p( EventLooper looper, FH fh )
|
|||
static void
|
||||
event_looper_hook( EventLooper looper, int fd, int events )
|
||||
{
|
||||
FH f = _fh_from_int(fd);
|
||||
FH f = _fh_from_int(fd, __func__);
|
||||
EventHook *pnode;
|
||||
EventHook node;
|
||||
|
||||
|
@ -1418,7 +1420,7 @@ event_looper_hook( EventLooper looper, int fd, int events )
|
|||
static void
|
||||
event_looper_unhook( EventLooper looper, int fd, int events )
|
||||
{
|
||||
FH fh = _fh_from_int(fd);
|
||||
FH fh = _fh_from_int(fd, __func__);
|
||||
EventHook *pnode = event_looper_find_p( looper, fh );
|
||||
EventHook node = *pnode;
|
||||
|
||||
|
@ -3036,7 +3038,7 @@ void stdin_raw_restore(const int fd) {
|
|||
}
|
||||
}
|
||||
|
||||
// Called by 'adb shell' command to read from stdin.
|
||||
// Called by 'adb shell' and 'adb exec-in' to read from stdin.
|
||||
int unix_read(int fd, void* buf, size_t len) {
|
||||
if ((fd == STDIN_FILENO) && (_console_handle != NULL)) {
|
||||
// If it is a request to read from stdin, and stdin_raw_init() has been
|
||||
|
@ -3046,8 +3048,12 @@ int unix_read(int fd, void* buf, size_t len) {
|
|||
return _console_read(_console_handle, buf, len);
|
||||
} else {
|
||||
// Just call into C Runtime which can read from pipes/files and which
|
||||
// can do LF/CR translation.
|
||||
// can do LF/CR translation (which is overridable with _setmode()).
|
||||
// Undefine the macro that is set in sysdeps.h which bans calls to
|
||||
// plain read() in favor of unix_read() or adb_read().
|
||||
#pragma push_macro("read")
|
||||
#undef read
|
||||
return read(fd, buf, len);
|
||||
#pragma pop_macro("read")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -168,13 +168,13 @@ static void find_usb_device(const char *base,
|
|||
continue;
|
||||
}
|
||||
|
||||
desclength = adb_read(fd, devdesc, sizeof(devdesc));
|
||||
desclength = unix_read(fd, devdesc, sizeof(devdesc));
|
||||
bufend = bufptr + desclength;
|
||||
|
||||
// should have device and configuration descriptors, and atleast two endpoints
|
||||
if (desclength < USB_DT_DEVICE_SIZE + USB_DT_CONFIG_SIZE) {
|
||||
D("desclength %zu is too small\n", desclength);
|
||||
adb_close(fd);
|
||||
unix_close(fd);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -182,7 +182,7 @@ static void find_usb_device(const char *base,
|
|||
bufptr += USB_DT_DEVICE_SIZE;
|
||||
|
||||
if((device->bLength != USB_DT_DEVICE_SIZE) || (device->bDescriptorType != USB_DT_DEVICE)) {
|
||||
adb_close(fd);
|
||||
unix_close(fd);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -195,7 +195,7 @@ static void find_usb_device(const char *base,
|
|||
bufptr += USB_DT_CONFIG_SIZE;
|
||||
if (config->bLength != USB_DT_CONFIG_SIZE || config->bDescriptorType != USB_DT_CONFIG) {
|
||||
D("usb_config_descriptor not found\n");
|
||||
adb_close(fd);
|
||||
unix_close(fd);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -303,7 +303,7 @@ static void find_usb_device(const char *base,
|
|||
}
|
||||
} // end of while
|
||||
|
||||
adb_close(fd);
|
||||
unix_close(fd);
|
||||
} // end of devdir while
|
||||
closedir(devdir);
|
||||
} //end of busdir while
|
||||
|
@ -555,7 +555,7 @@ int usb_close(usb_handle *h)
|
|||
h->prev = 0;
|
||||
h->next = 0;
|
||||
|
||||
adb_close(h->desc);
|
||||
unix_close(h->desc);
|
||||
D("-- usb closed %p (fd = %d) --\n", h, h->desc);
|
||||
adb_mutex_unlock(&usb_lock);
|
||||
|
||||
|
@ -618,7 +618,7 @@ static void register_device(const char* dev_name, const char* dev_path,
|
|||
if (ioctl(usb->desc, USBDEVFS_CLAIMINTERFACE, &interface) != 0) {
|
||||
D("[ usb ioctl(%d, USBDEVFS_CLAIMINTERFACE) failed: %s]\n",
|
||||
usb->desc, strerror(errno));
|
||||
adb_close(usb->desc);
|
||||
unix_close(usb->desc);
|
||||
free(usb);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -201,7 +201,7 @@ static int usb_adb_write(usb_handle *h, const void *data, int len)
|
|||
int n;
|
||||
|
||||
D("about to write (fd=%d, len=%d)\n", h->fd, len);
|
||||
n = adb_write(h->fd, data, len);
|
||||
n = unix_write(h->fd, data, len);
|
||||
if(n != len) {
|
||||
D("ERROR: fd = %d, n = %d, errno = %d (%s)\n",
|
||||
h->fd, n, errno, strerror(errno));
|
||||
|
@ -216,7 +216,7 @@ static int usb_adb_read(usb_handle *h, void *data, int len)
|
|||
int n;
|
||||
|
||||
D("about to read (fd=%d, len=%d)\n", h->fd, len);
|
||||
n = adb_read(h->fd, data, len);
|
||||
n = unix_read(h->fd, data, len);
|
||||
if(n != len) {
|
||||
D("ERROR: fd = %d, n = %d, errno = %d (%s)\n",
|
||||
h->fd, n, errno, strerror(errno));
|
||||
|
@ -230,7 +230,7 @@ static void usb_adb_kick(usb_handle *h)
|
|||
{
|
||||
D("usb_kick\n");
|
||||
adb_mutex_lock(&h->lock);
|
||||
adb_close(h->fd);
|
||||
unix_close(h->fd);
|
||||
h->fd = -1;
|
||||
|
||||
// notify usb_adb_open_thread that we are disconnected
|
||||
|
|
Loading…
Reference in a new issue