OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "update_engine/subprocess.h" | 5 #include "update_engine/subprocess.h" |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 #include <string.h> | 7 #include <string.h> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 #include "chromeos/obsolete_logging.h" | 10 #include "chromeos/obsolete_logging.h" |
11 #include "base/scoped_ptr.h" | 11 #include "base/scoped_ptr.h" |
12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
13 | 13 |
14 using std::string; | 14 using std::string; |
15 using std::vector; | 15 using std::vector; |
16 | 16 |
17 namespace chromeos_update_engine { | 17 namespace chromeos_update_engine { |
18 | 18 |
19 void Subprocess::GChildExitedCallback(GPid pid, gint status, gpointer data) { | 19 void Subprocess::GChildExitedCallback(GPid pid, gint status, gpointer data) { |
20 COMPILE_ASSERT(sizeof(guint) == sizeof(uint32), | 20 COMPILE_ASSERT(sizeof(guint) == sizeof(uint32_t), |
21 guint_uint32_size_mismatch); | 21 guint_uint32_size_mismatch); |
22 guint* tag = reinterpret_cast<guint*>(data); | 22 guint* tag = reinterpret_cast<guint*>(data); |
23 const SubprocessCallbackRecord& record = Get().callback_records_[*tag]; | 23 const SubprocessCallbackRecord& record = Get().callback_records_[*tag]; |
24 if (record.callback) | 24 if (record.callback) |
25 record.callback(status, record.callback_data); | 25 record.callback(status, record.callback_data); |
26 g_spawn_close_pid(pid); | 26 g_spawn_close_pid(pid); |
27 Get().callback_records_.erase(*tag); | 27 Get().callback_records_.erase(*tag); |
28 delete tag; | 28 delete tag; |
29 } | 29 } |
30 | 30 |
31 namespace { | 31 namespace { |
32 void FreeArgv(char** argv) { | 32 void FreeArgv(char** argv) { |
33 for (int i = 0; argv[i]; i++) { | 33 for (int i = 0; argv[i]; i++) { |
34 free(argv[i]); | 34 free(argv[i]); |
35 argv[i] = NULL; | 35 argv[i] = NULL; |
36 } | 36 } |
37 } | 37 } |
38 } // namespace {} | 38 } // namespace {} |
39 | 39 |
40 uint32 Subprocess::Exec(const std::vector<std::string>& cmd, | 40 uint32_t Subprocess::Exec(const std::vector<std::string>& cmd, |
41 ExecCallback callback, | 41 ExecCallback callback, |
42 void* p) { | 42 void* p) { |
43 GPid child_pid; | 43 GPid child_pid; |
44 GError* err; | 44 GError* err; |
45 scoped_array<char*> argv(new char*[cmd.size() + 1]); | 45 scoped_array<char*> argv(new char*[cmd.size() + 1]); |
46 for (unsigned int i = 0; i < cmd.size(); i++) { | 46 for (unsigned int i = 0; i < cmd.size(); i++) { |
47 argv[i] = strdup(cmd[i].c_str()); | 47 argv[i] = strdup(cmd[i].c_str()); |
48 } | 48 } |
49 argv[cmd.size()] = NULL; | 49 argv[cmd.size()] = NULL; |
50 | 50 |
(...skipping 21 matching lines...) Expand all Loading... |
72 if (!success) { | 72 if (!success) { |
73 LOG(ERROR) << "g_spawn_async failed"; | 73 LOG(ERROR) << "g_spawn_async failed"; |
74 return 0; | 74 return 0; |
75 } | 75 } |
76 guint* tag = new guint; | 76 guint* tag = new guint; |
77 *tag = g_child_watch_add(child_pid, GChildExitedCallback, tag); | 77 *tag = g_child_watch_add(child_pid, GChildExitedCallback, tag); |
78 callback_records_[*tag] = callback_record; | 78 callback_records_[*tag] = callback_record; |
79 return *tag; | 79 return *tag; |
80 } | 80 } |
81 | 81 |
82 void Subprocess::CancelExec(uint32 tag) { | 82 void Subprocess::CancelExec(uint32_t tag) { |
83 if (callback_records_[tag].callback) { | 83 if (callback_records_[tag].callback) { |
84 callback_records_[tag].callback = NULL; | 84 callback_records_[tag].callback = NULL; |
85 } | 85 } |
86 } | 86 } |
87 | 87 |
88 bool Subprocess::SynchronousExec(const std::vector<std::string>& cmd, | 88 bool Subprocess::SynchronousExec(const std::vector<std::string>& cmd, |
89 int* return_code) { | 89 int* return_code) { |
90 GError* err = NULL; | 90 GError* err = NULL; |
91 scoped_array<char*> argv(new char*[cmd.size() + 1]); | 91 scoped_array<char*> argv(new char*[cmd.size() + 1]); |
92 for (unsigned int i = 0; i < cmd.size(); i++) { | 92 for (unsigned int i = 0; i < cmd.size(); i++) { |
(...skipping 15 matching lines...) Expand all Loading... |
108 &err); | 108 &err); |
109 FreeArgv(argv.get()); | 109 FreeArgv(argv.get()); |
110 if (err) | 110 if (err) |
111 LOG(INFO) << "err is: " << err->code << ", " << err->message; | 111 LOG(INFO) << "err is: " << err->code << ", " << err->message; |
112 return success; | 112 return success; |
113 } | 113 } |
114 | 114 |
115 Subprocess* Subprocess::subprocess_singleton_ = NULL; | 115 Subprocess* Subprocess::subprocess_singleton_ = NULL; |
116 | 116 |
117 } // namespace chromeos_update_engine | 117 } // namespace chromeos_update_engine |
OLD | NEW |