This commit fixes two somewhat related issues in shell_service.
- The fd returned by StartSubprocess is owned by a unique_fd
contained in the Subprocess object, but also gets closed by the
caller. Resolve this by duping the returned file descriptor.
- A Subprocess object can be destroyed immediately after its initial
construction in StartSubprocess if we're sufficiently unlucky.
Split up the fork/exec and "start management thread" steps, so that
we can safely do everything we need to do on the Subprocess before
handing it over to the thread that'll eventually destroy it.
Also includes squashed patches from AOSP master that allow for use of
unique_fd inside adb.
Bug: http://b/29254462
Change-Id: Id9cf0b7e7a7293bee7176919edc758597691c636
(cherry picked from commit c0e6e40cc9)
(cherry picked from commit 54c72aaccc)
(cherry picked from commit 2c5d1d7cd9)
(cherry picked from commit 2a7b86337f)
(cherry picked from commit 13ea01db45)
(cherry picked from commit 344778da41)
56 lines
1.9 KiB
C++
56 lines
1.9 KiB
C++
/*
|
|
* Copyright (C) 2011 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ANDROID_BASE_STRINGPRINTF_H
|
|
#define ANDROID_BASE_STRINGPRINTF_H
|
|
|
|
#include <stdarg.h>
|
|
#include <string>
|
|
|
|
namespace android {
|
|
namespace base {
|
|
|
|
// These printf-like functions are implemented in terms of vsnprintf, so they
|
|
// use the same attribute for compile-time format string checking. On Windows,
|
|
// if the mingw version of vsnprintf is used, use `gnu_printf' which allows z
|
|
// in %zd and PRIu64 (and related) to be recognized by the compile-time
|
|
// checking.
|
|
#define FORMAT_ARCHETYPE __printf__
|
|
#ifdef __USE_MINGW_ANSI_STDIO
|
|
#if __USE_MINGW_ANSI_STDIO
|
|
#undef FORMAT_ARCHETYPE
|
|
#define FORMAT_ARCHETYPE gnu_printf
|
|
#endif
|
|
#endif
|
|
|
|
// Returns a string corresponding to printf-like formatting of the arguments.
|
|
std::string StringPrintf(const char* fmt, ...)
|
|
__attribute__((__format__(FORMAT_ARCHETYPE, 1, 2)));
|
|
|
|
// Appends a printf-like formatting of the arguments to 'dst'.
|
|
void StringAppendF(std::string* dst, const char* fmt, ...)
|
|
__attribute__((__format__(FORMAT_ARCHETYPE, 2, 3)));
|
|
|
|
// Appends a printf-like formatting of the arguments to 'dst'.
|
|
void StringAppendV(std::string* dst, const char* format, va_list ap)
|
|
__attribute__((__format__(FORMAT_ARCHETYPE, 2, 0)));
|
|
|
|
#undef FORMAT_ARCHETYPE
|
|
|
|
} // namespace base
|
|
} // namespace android
|
|
|
|
#endif // ANDROID_BASE_STRINGPRINTF_H
|