diff options
| -rw-r--r-- | meta/recipes-core/systemd/systemd/0001-systemd-analyze-rewrite-in-C.patch | 1087 | ||||
| -rw-r--r-- | meta/recipes-core/systemd/systemd/systemd-pam-fix-msformat.patch | 140 | ||||
| -rw-r--r-- | meta/recipes-core/systemd/systemd/udev-linkage.patch | 62 | ||||
| -rw-r--r-- | meta/recipes-core/systemd/systemd_198.bb (renamed from meta/recipes-core/systemd/systemd_197.bb) | 10 |
4 files changed, 75 insertions, 1224 deletions
diff --git a/meta/recipes-core/systemd/systemd/0001-systemd-analyze-rewrite-in-C.patch b/meta/recipes-core/systemd/systemd/0001-systemd-analyze-rewrite-in-C.patch deleted file mode 100644 index b278390fef..0000000000 --- a/meta/recipes-core/systemd/systemd/0001-systemd-analyze-rewrite-in-C.patch +++ /dev/null | |||
| @@ -1,1087 +0,0 @@ | |||
| 1 | Upstream-Status: Pending | ||
| 2 | |||
| 3 | From 523f304facdf3dbc09dbcdcff500ddce60274987 Mon Sep 17 00:00:00 2001 | ||
| 4 | From: Peeters Simon <peeters.simon@gmail.com> | ||
| 5 | Date: Thu, 17 Jan 2013 14:34:25 -0800 | ||
| 6 | Subject: [PATCH] systemd-analyze: rewrite in C. | ||
| 7 | |||
| 8 | Written by Peeters Simon <peeters.simon@gmail.com>. Makefile stuff | ||
| 9 | and cleaned up a bit by Auke Kok <auke-jan.h.kok@intel.com>. | ||
| 10 | --- | ||
| 11 | Makefile.am | 21 +- | ||
| 12 | src/analyze/systemd-analyze.c | 684 +++++++++++++++++++++++++++++++++++++++++ | ||
| 13 | src/analyze/systemd-analyze.in | 328 -------------------- | ||
| 14 | 3 files changed, 694 insertions(+), 339 deletions(-) | ||
| 15 | create mode 100644 src/analyze/systemd-analyze.c | ||
| 16 | delete mode 100755 src/analyze/systemd-analyze.in | ||
| 17 | |||
| 18 | Index: systemd-197/Makefile.am | ||
| 19 | =================================================================== | ||
| 20 | --- systemd-197.orig/Makefile.am 2013-01-07 17:37:15.391966148 -0800 | ||
| 21 | +++ systemd-197/Makefile.am 2013-01-24 10:06:11.219490786 -0800 | ||
| 22 | @@ -185,7 +185,8 @@ | ||
| 23 | systemd-ask-password \ | ||
| 24 | systemd-tty-ask-password-agent \ | ||
| 25 | systemd-tmpfiles \ | ||
| 26 | - systemd-machine-id-setup | ||
| 27 | + systemd-machine-id-setup \ | ||
| 28 | + systemd-analyze | ||
| 29 | |||
| 30 | bin_PROGRAMS = \ | ||
| 31 | systemd-cgls \ | ||
| 32 | @@ -220,14 +221,16 @@ | ||
| 33 | systemd-fstab-generator \ | ||
| 34 | systemd-system-update-generator | ||
| 35 | |||
| 36 | -dist_bin_SCRIPTS = \ | ||
| 37 | - src/analyze/systemd-analyze | ||
| 38 | +systemd_analyze_SOURCES = \ | ||
| 39 | + src/analyze/systemd-analyze.c | ||
| 40 | |||
| 41 | -EXTRA_DIST += \ | ||
| 42 | - src/analyze/systemd-analyze.in | ||
| 43 | +systemd_analyze_CFLAGS = \ | ||
| 44 | + $(AM_CFLAGS) \ | ||
| 45 | + $(DBUS_CFLAGS) | ||
| 46 | |||
| 47 | -CLEANFILES += \ | ||
| 48 | - src/analyze/systemd-analyze | ||
| 49 | +systemd_analyze_LDADD = \ | ||
| 50 | + libsystemd-shared.la \ | ||
| 51 | + libsystemd-dbus.la | ||
| 52 | |||
| 53 | dist_bashcompletion_DATA = \ | ||
| 54 | shell-completion/systemd-bash-completion.sh | ||
| 55 | @@ -3839,10 +3842,6 @@ | ||
| 56 | $(SED_PROCESS) | ||
| 57 | $(AM_V_GEN)chmod +x $@ | ||
| 58 | |||
| 59 | -src/analyze/systemd-analyze: %: %.in Makefile | ||
| 60 | - $(SED_PROCESS) | ||
| 61 | - $(AM_V_GEN)chmod +x $@ | ||
| 62 | - | ||
| 63 | src/%.c: src/%.gperf | ||
| 64 | $(AM_V_at)$(MKDIR_P) $(dir $@) | ||
| 65 | $(AM_V_GEN)$(GPERF) < $< > $@ | ||
| 66 | Index: systemd-197/src/analyze/systemd-analyze.c | ||
| 67 | =================================================================== | ||
| 68 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 69 | +++ systemd-197/src/analyze/systemd-analyze.c 2013-01-24 10:06:11.219490786 -0800 | ||
| 70 | @@ -0,0 +1,684 @@ | ||
| 71 | +#include <stdio.h> | ||
| 72 | +#include <stdlib.h> | ||
| 73 | +#include <getopt.h> | ||
| 74 | +#include <locale.h> | ||
| 75 | + | ||
| 76 | +#include "install.h" | ||
| 77 | +#include "log.h" | ||
| 78 | +#include "dbus-common.h" | ||
| 79 | +#include "build.h" | ||
| 80 | +#include "util.h" | ||
| 81 | + | ||
| 82 | +#define svg(...) printf(__VA_ARGS__) | ||
| 83 | + | ||
| 84 | +static UnitFileScope arg_scope = UNIT_FILE_SYSTEM; | ||
| 85 | + | ||
| 86 | +struct unit_times { | ||
| 87 | + char *name; | ||
| 88 | + unsigned long long int ixt; | ||
| 89 | + unsigned long long int iet; | ||
| 90 | + unsigned long long int axt; | ||
| 91 | + unsigned long long int aet; | ||
| 92 | +}; | ||
| 93 | + | ||
| 94 | + | ||
| 95 | +unsigned long long int property_getull( | ||
| 96 | + DBusConnection *bus, | ||
| 97 | + const char *dest, | ||
| 98 | + const char *path, | ||
| 99 | + const char *interface, | ||
| 100 | + const char *property) | ||
| 101 | +{ | ||
| 102 | + _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; | ||
| 103 | + DBusMessageIter iter, sub; | ||
| 104 | + unsigned long long int result = 0; | ||
| 105 | + union { | ||
| 106 | + char byte; | ||
| 107 | + dbus_int16_t i16; | ||
| 108 | + dbus_uint16_t u16; | ||
| 109 | + dbus_int32_t i32; | ||
| 110 | + dbus_uint32_t u32; | ||
| 111 | + dbus_int64_t i64; | ||
| 112 | + dbus_uint64_t u64; | ||
| 113 | + } dbus_result; | ||
| 114 | + | ||
| 115 | + int r = bus_method_call_with_reply ( | ||
| 116 | + bus, | ||
| 117 | + dest, | ||
| 118 | + path, | ||
| 119 | + "org.freedesktop.DBus.Properties", | ||
| 120 | + "Get", | ||
| 121 | + &reply, | ||
| 122 | + NULL, | ||
| 123 | + DBUS_TYPE_STRING, &interface, | ||
| 124 | + DBUS_TYPE_STRING, &property, | ||
| 125 | + DBUS_TYPE_INVALID); | ||
| 126 | + if (r) | ||
| 127 | + goto finish; | ||
| 128 | + | ||
| 129 | + if (!dbus_message_iter_init(reply, &iter) || | ||
| 130 | + dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) | ||
| 131 | + goto finish; | ||
| 132 | + | ||
| 133 | + dbus_message_iter_recurse(&iter, &sub); | ||
| 134 | + | ||
| 135 | + switch(dbus_message_iter_get_arg_type(&sub)) { | ||
| 136 | + case DBUS_TYPE_BYTE: | ||
| 137 | + dbus_message_iter_get_basic(&sub, &dbus_result.byte); | ||
| 138 | + result = dbus_result.byte; | ||
| 139 | + break; | ||
| 140 | + case DBUS_TYPE_INT16: | ||
| 141 | + dbus_message_iter_get_basic(&sub, &dbus_result.i16); | ||
| 142 | + result = dbus_result.i16; | ||
| 143 | + break; | ||
| 144 | + case DBUS_TYPE_UINT16: | ||
| 145 | + dbus_message_iter_get_basic(&sub, &dbus_result.u16); | ||
| 146 | + result = dbus_result.u16; | ||
| 147 | + break; | ||
| 148 | + case DBUS_TYPE_INT32: | ||
| 149 | + dbus_message_iter_get_basic(&sub, &dbus_result.i32); | ||
| 150 | + result = dbus_result.i32; | ||
| 151 | + break; | ||
| 152 | + case DBUS_TYPE_UINT32: | ||
| 153 | + dbus_message_iter_get_basic(&sub, &dbus_result.u32); | ||
| 154 | + result = dbus_result.u32; | ||
| 155 | + break; | ||
| 156 | + case DBUS_TYPE_INT64: | ||
| 157 | + dbus_message_iter_get_basic(&sub, &dbus_result.i64); | ||
| 158 | + result = dbus_result.i64; | ||
| 159 | + break; | ||
| 160 | + case DBUS_TYPE_UINT64: | ||
| 161 | + dbus_message_iter_get_basic(&sub, &dbus_result.u64); | ||
| 162 | + result = dbus_result.u64; | ||
| 163 | + break; | ||
| 164 | + default: | ||
| 165 | + goto finish; | ||
| 166 | + } | ||
| 167 | +finish: | ||
| 168 | + return result; | ||
| 169 | +} | ||
| 170 | + | ||
| 171 | +static int compare_unit_times1(const void *a, const void *b) { | ||
| 172 | + const struct unit_times *u = a, *v = b; | ||
| 173 | + | ||
| 174 | + return (int)(v->aet - v->ixt) - (int)(u->aet - u->ixt); | ||
| 175 | +} | ||
| 176 | + | ||
| 177 | +static int compare_unit_times2(const void *a, const void *b) { | ||
| 178 | + const struct unit_times *u = a, *v = b; | ||
| 179 | + | ||
| 180 | + return (long long int)(u->ixt) - (long long int)(v->ixt); | ||
| 181 | +} | ||
| 182 | + | ||
| 183 | +int acquire_time_data(DBusConnection *bus, struct unit_times **out) | ||
| 184 | +{ | ||
| 185 | + _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; | ||
| 186 | + DBusMessageIter iter, sub, sub2; | ||
| 187 | + unsigned int c = 0, n_units = 0; | ||
| 188 | + struct unit_times *unit_times = NULL; | ||
| 189 | + int r = bus_method_call_with_reply ( | ||
| 190 | + bus, | ||
| 191 | + "org.freedesktop.systemd1", | ||
| 192 | + "/org/freedesktop/systemd1", | ||
| 193 | + "org.freedesktop.systemd1.Manager", | ||
| 194 | + "ListUnits", | ||
| 195 | + &reply, | ||
| 196 | + NULL, | ||
| 197 | + DBUS_TYPE_INVALID); | ||
| 198 | + if (r) | ||
| 199 | + goto finish; | ||
| 200 | + | ||
| 201 | + if (!dbus_message_iter_init(reply, &iter) || | ||
| 202 | + dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || | ||
| 203 | + dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_STRUCT) { | ||
| 204 | + log_error("Failed to parse reply."); | ||
| 205 | + r = -EIO; | ||
| 206 | + goto finish; | ||
| 207 | + } | ||
| 208 | + | ||
| 209 | + dbus_message_iter_recurse(&iter, &sub); | ||
| 210 | + | ||
| 211 | + while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { | ||
| 212 | + struct unit_times *u; | ||
| 213 | + char *path; | ||
| 214 | + | ||
| 215 | + if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRUCT) { | ||
| 216 | + log_error("Failed to parse reply."); | ||
| 217 | + r = -EIO; | ||
| 218 | + goto finish; | ||
| 219 | + } | ||
| 220 | + | ||
| 221 | + if (c >= n_units) { | ||
| 222 | + struct unit_times *w; | ||
| 223 | + | ||
| 224 | + n_units = MAX(2*c, 16); | ||
| 225 | + w = realloc(unit_times, sizeof(struct unit_times) * n_units); | ||
| 226 | + | ||
| 227 | + if (!w) { | ||
| 228 | + log_error("Failed to allocate unit array."); | ||
| 229 | + r = -ENOMEM; | ||
| 230 | + goto finish; | ||
| 231 | + } | ||
| 232 | + | ||
| 233 | + unit_times = w; | ||
| 234 | + } | ||
| 235 | + u = unit_times+c; | ||
| 236 | + | ||
| 237 | + dbus_message_iter_recurse(&sub, &sub2); | ||
| 238 | + | ||
| 239 | + if (bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &u->name, true) < 0 || | ||
| 240 | + dbus_message_iter_next(&sub2), dbus_message_iter_next(&sub2), dbus_message_iter_next(&sub2), | ||
| 241 | + dbus_message_iter_next(&sub2), dbus_message_iter_next(&sub2), | ||
| 242 | + bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_OBJECT_PATH, &path, true) < 0) { | ||
| 243 | + log_error("Failed to parse reply."); | ||
| 244 | + r = -EIO; | ||
| 245 | + goto finish; | ||
| 246 | + } | ||
| 247 | + u->name = strdup(u->name); | ||
| 248 | + u->ixt = property_getull(bus, | ||
| 249 | + "org.freedesktop.systemd1", | ||
| 250 | + path, | ||
| 251 | + "org.freedesktop.systemd1.Unit", | ||
| 252 | + "InactiveExitTimestampMonotonic"); | ||
| 253 | + u->iet = property_getull(bus, | ||
| 254 | + "org.freedesktop.systemd1", | ||
| 255 | + path, | ||
| 256 | + "org.freedesktop.systemd1.Unit", | ||
| 257 | + "InactiveEnterTimestampMonotonic"); | ||
| 258 | + u->axt = property_getull(bus, | ||
| 259 | + "org.freedesktop.systemd1", | ||
| 260 | + path, | ||
| 261 | + "org.freedesktop.systemd1.Unit", | ||
| 262 | + "ActiveExitTimestampMonotonic"); | ||
| 263 | + u->aet = property_getull(bus, | ||
| 264 | + "org.freedesktop.systemd1", | ||
| 265 | + path, | ||
| 266 | + "org.freedesktop.systemd1.Unit", | ||
| 267 | + "ActiveEnterTimestampMonotonic"); | ||
| 268 | + dbus_message_iter_next(&sub); | ||
| 269 | + if (u->ixt == 0) | ||
| 270 | + continue; | ||
| 271 | + c++; | ||
| 272 | + } | ||
| 273 | + | ||
| 274 | + *out = unit_times; | ||
| 275 | + return c; | ||
| 276 | +finish: | ||
| 277 | + free(unit_times); | ||
| 278 | + return r; | ||
| 279 | +} | ||
| 280 | + | ||
| 281 | +static void svg_graph_box(int height, long long int begin, long long int end, float scale_x, float scale_y) | ||
| 282 | +{ | ||
| 283 | + double d = 0.0; | ||
| 284 | + int i = 0; | ||
| 285 | + | ||
| 286 | + /* outside box, fill */ | ||
| 287 | + svg("<rect class=\"box\" x=\"%.03f\" y=\"0\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 288 | + 0, | ||
| 289 | + scale_x * (end - begin), | ||
| 290 | + scale_y * height); | ||
| 291 | + | ||
| 292 | + for (d = 0.000001 * begin; d <= 0.000001 * end; | ||
| 293 | + d += 0.1) { | ||
| 294 | + /* lines for each second */ | ||
| 295 | + if (i % 50 == 0) | ||
| 296 | + svg(" <line class=\"sec5\" x1=\"%.03f\" y1=\"0\" x2=\"%.03f\" y2=\"%.03f\" />\n", | ||
| 297 | + scale_x * d, | ||
| 298 | + scale_x * d, | ||
| 299 | + scale_y * height); | ||
| 300 | + else if (i % 10 == 0) | ||
| 301 | + svg(" <line class=\"sec1\" x1=\"%.03f\" y1=\"0\" x2=\"%.03f\" y2=\"%.03f\" />\n", | ||
| 302 | + scale_x * d, | ||
| 303 | + scale_x * d, | ||
| 304 | + scale_y * height); | ||
| 305 | + else | ||
| 306 | + svg(" <line class=\"sec01\" x1=\"%.03f\" y1=\"0\" x2=\"%.03f\" y2=\"%.03f\" />\n", | ||
| 307 | + scale_x * d, | ||
| 308 | + scale_x * d, | ||
| 309 | + scale_y * height); | ||
| 310 | + | ||
| 311 | + /* time label */ | ||
| 312 | + if (i % 10 == 0) | ||
| 313 | + svg(" <text class=\"sec\" x=\"%.03f\" y=\"%.03f\" >%.01fs</text>\n", | ||
| 314 | + scale_x * d, -5.0, d); | ||
| 315 | + | ||
| 316 | + i++; | ||
| 317 | + } | ||
| 318 | +} | ||
| 319 | + | ||
| 320 | +int analyze_plot(DBusConnection *bus) | ||
| 321 | +{ | ||
| 322 | + struct unit_times *times; | ||
| 323 | + int n = acquire_time_data(bus, ×); | ||
| 324 | + int m = n + 1; | ||
| 325 | + unsigned long long int firmware_time, loader_time, kernel_time, initrd_time, userspace_time, finish_time; | ||
| 326 | + long long int starttime = 0; | ||
| 327 | + | ||
| 328 | + float scale_x = 100.0; | ||
| 329 | + float scale_y = 20.0; | ||
| 330 | + | ||
| 331 | + if (n<=0) | ||
| 332 | + return -n; | ||
| 333 | + | ||
| 334 | + qsort(times, n, sizeof(struct unit_times), compare_unit_times2); | ||
| 335 | + | ||
| 336 | + firmware_time = property_getull(bus, | ||
| 337 | + "org.freedesktop.systemd1", | ||
| 338 | + "/org/freedesktop/systemd1", | ||
| 339 | + "org.freedesktop.systemd1.Manager", | ||
| 340 | + "FirmwareTimestampMonotonic"); | ||
| 341 | + loader_time = property_getull(bus, | ||
| 342 | + "org.freedesktop.systemd1", | ||
| 343 | + "/org/freedesktop/systemd1", | ||
| 344 | + "org.freedesktop.systemd1.Manager", | ||
| 345 | + "LoaderTimestampMonotonic"); | ||
| 346 | + kernel_time = property_getull(bus, | ||
| 347 | + "org.freedesktop.systemd1", | ||
| 348 | + "/org/freedesktop/systemd1", | ||
| 349 | + "org.freedesktop.systemd1.Manager", | ||
| 350 | + "KernelTimestamp"); | ||
| 351 | + initrd_time = property_getull(bus, | ||
| 352 | + "org.freedesktop.systemd1", | ||
| 353 | + "/org/freedesktop/systemd1", | ||
| 354 | + "org.freedesktop.systemd1.Manager", | ||
| 355 | + "InitRDTimestampMonotonic"); | ||
| 356 | + userspace_time = property_getull(bus, | ||
| 357 | + "org.freedesktop.systemd1", | ||
| 358 | + "/org/freedesktop/systemd1", | ||
| 359 | + "org.freedesktop.systemd1.Manager", | ||
| 360 | + "UserspaceTimestampMonotonic"); | ||
| 361 | + finish_time = property_getull(bus, | ||
| 362 | + "org.freedesktop.systemd1", | ||
| 363 | + "/org/freedesktop/systemd1", | ||
| 364 | + "org.freedesktop.systemd1.Manager", | ||
| 365 | + "FinishTimestampMonotonic"); | ||
| 366 | + | ||
| 367 | + | ||
| 368 | + if (firmware_time > 0) { | ||
| 369 | + m++; | ||
| 370 | + starttime += firmware_time - loader_time; | ||
| 371 | + } | ||
| 372 | + if (loader_time > 0) { | ||
| 373 | + m++; | ||
| 374 | + starttime += loader_time; | ||
| 375 | + } | ||
| 376 | + if (initrd_time > 0) | ||
| 377 | + m += 2; | ||
| 378 | + else if (kernel_time > 0) | ||
| 379 | + m++; | ||
| 380 | + | ||
| 381 | + float width = 80.0 + (scale_x * (starttime + finish_time) * 0.000001); | ||
| 382 | + float height = 150.0 + (m* scale_y); | ||
| 383 | + | ||
| 384 | + svg("<?xml version=\"1.0\" standalone=\"no\"?>\n"); | ||
| 385 | + svg("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" "); | ||
| 386 | + svg("\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"); | ||
| 387 | + | ||
| 388 | + //svg("<g transform=\"translate(10,%d)\">\n", 1000 + 150 + (pcount * 20)); | ||
| 389 | + svg("<svg width=\"%.0fpx\" height=\"%.0fpx\" version=\"1.1\" ", width, height); | ||
| 390 | + svg("xmlns=\"http://www.w3.org/2000/svg\">\n\n"); | ||
| 391 | + | ||
| 392 | + /* write some basic info as a comment, including some help */ | ||
| 393 | + svg("<!-- This file is a systemd-analyze SVG file. It is best rendered in a -->\n"); | ||
| 394 | + svg("<!-- browser such as Chrome/Chromium, firefox. Other applications that -->\n"); | ||
| 395 | + svg("<!-- render these files properly but much more slow are ImageMagick, -->\n"); | ||
| 396 | + svg("<!-- gimp, inkscape, etc.. To display the files on your system, just -->\n"); | ||
| 397 | + svg("<!-- point your browser to file:///var/log/ and click. -->\n\n"); | ||
| 398 | + svg("<!-- this plot was generated by systemd-analyze version %-16.16s -->\n\n", VERSION); | ||
| 399 | + | ||
| 400 | + /* style sheet */ | ||
| 401 | + svg("<defs>\n <style type=\"text/css\">\n <![CDATA[\n"); | ||
| 402 | + | ||
| 403 | + svg(" rect { stroke-width: 1; stroke-opacity: 0; }\n"); | ||
| 404 | + svg(" rect.activating { fill: rgb(255,0,0); fill-opacity: 0.7; }\n"); | ||
| 405 | + svg(" rect.active { fill: rgb(200,150,150); fill-opacity: 0.7; }\n"); | ||
| 406 | + svg(" rect.deactivating { fill: rgb(150,100,100); fill-opacity: 0.7; }\n"); | ||
| 407 | + svg(" rect.kernel { fill: rgb(150,150,150); fill-opacity: 0.7; }\n"); | ||
| 408 | + svg(" rect.initrd { fill: rgb(150,150,150); fill-opacity: 0.7; }\n"); | ||
| 409 | + svg(" rect.firmware { fill: rgb(150,150,150); fill-opacity: 0.7; }\n"); | ||
| 410 | + svg(" rect.loader { fill: rgb(150,150,150); fill-opacity: 0.7; }\n"); | ||
| 411 | + svg(" rect.userspace { fill: rgb(150,150,150); fill-opacity: 0.7; }\n"); | ||
| 412 | + svg(" rect.cpu { fill: rgb(64,64,240); stroke-width: 0; fill-opacity: 0.7; }\n"); | ||
| 413 | + svg(" rect.wait { fill: rgb(240,240,0); stroke-width: 0; fill-opacity: 0.7; }\n"); | ||
| 414 | + svg(" rect.bi { fill: rgb(240,128,128); stroke-width: 0; fill-opacity: 0.7; }\n"); | ||
| 415 | + svg(" rect.bo { fill: rgb(192,64,64); stroke-width: 0; fill-opacity: 0.7; }\n"); | ||
| 416 | + svg(" rect.ps { fill: rgb(192,192,192); stroke: rgb(128,128,128); fill-opacity: 0.7; }\n"); | ||
| 417 | + svg(" rect.krnl { fill: rgb(240,240,0); stroke: rgb(128,128,128); fill-opacity: 0.7; }\n"); | ||
| 418 | + svg(" rect.box { fill: rgb(240,240,240); stroke: rgb(192,192,192); }\n"); | ||
| 419 | + svg(" rect.clrw { stroke-width: 0; fill-opacity: 0.7;}\n"); | ||
| 420 | + svg(" line { stroke: rgb(64,64,64); stroke-width: 1; }\n"); | ||
| 421 | + svg("// line.sec1 { }\n"); | ||
| 422 | + svg(" line.sec5 { stroke-width: 2; }\n"); | ||
| 423 | + svg(" line.sec01 { stroke: rgb(224,224,224); stroke-width: 1; }\n"); | ||
| 424 | + svg(" line.dot { stroke-dasharray: 2 4; }\n"); | ||
| 425 | + svg(" line.idle { stroke: rgb(64,64,64); stroke-dasharray: 10 6; stroke-opacity: 0.7; }\n"); | ||
| 426 | + | ||
| 427 | + svg(" .run { font-size: 8; font-style: italic; }\n"); | ||
| 428 | + svg(" text { font-family: Verdana, Helvetica; font-size: 10; }\n"); | ||
| 429 | + svg(" text.sec { font-size: 8; }\n"); | ||
| 430 | + svg(" text.t1 { font-size: 24; }\n"); | ||
| 431 | + svg(" text.t2 { font-size: 12; }\n"); | ||
| 432 | + svg(" text.idle { font-size: 18; }\n"); | ||
| 433 | + | ||
| 434 | + svg(" ]]>\n </style>\n</defs>\n\n"); | ||
| 435 | + | ||
| 436 | + svg("<text x=\"20\" y=\"40\">Startup finished in "); | ||
| 437 | + | ||
| 438 | + if (firmware_time > 0) | ||
| 439 | + svg("%llums (firmware) + ", (firmware_time - loader_time) / 1000); | ||
| 440 | + if (loader_time > 0) | ||
| 441 | + svg("%llums (loader) + ", loader_time / 1000); | ||
| 442 | + if (initrd_time > 0) | ||
| 443 | + svg("%llums (kernel) + %llums (initrd) + ", initrd_time / 1000, (userspace_time - initrd_time) / 1000); | ||
| 444 | + else if (kernel_time > 0) | ||
| 445 | + svg("%llums (kernel) + ", userspace_time / 1000); | ||
| 446 | + svg("%llums (userspace) ", (finish_time - userspace_time) / 1000); | ||
| 447 | + if (kernel_time > 0) | ||
| 448 | + svg("= %llums\n", (firmware_time + finish_time) / 1000); | ||
| 449 | + else | ||
| 450 | + svg("= %llums\n", (finish_time - userspace_time) / 1000); | ||
| 451 | + svg("</text>"); | ||
| 452 | + | ||
| 453 | + svg("<g transform=\"translate(20,100)\">\n"); | ||
| 454 | + svg_graph_box(m, starttime, finish_time, scale_x, scale_y); | ||
| 455 | + | ||
| 456 | + float top = 0.0; | ||
| 457 | + | ||
| 458 | + if (firmware_time > 0) { | ||
| 459 | + svg(" <rect class=\"firmware\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 460 | + scale_x * (starttime - firmware_time) * 0.000001, | ||
| 461 | + top, | ||
| 462 | + scale_x * (firmware_time - loader_time) * 0.000001, | ||
| 463 | + scale_y - 1.0); | ||
| 464 | + svg(" <text x=\"%.03f\" y=\"%.03f\">firmware</text>\n", | ||
| 465 | + scale_x * (starttime - firmware_time) * 0.000001 + 5.0, | ||
| 466 | + top + 14.0); | ||
| 467 | + top += scale_y; | ||
| 468 | + } | ||
| 469 | + if (loader_time > 0) { | ||
| 470 | + svg(" <rect class=\"loader\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 471 | + scale_x * (starttime - loader_time) * 0.000001, | ||
| 472 | + top, | ||
| 473 | + scale_x * (loader_time) * 0.000001, | ||
| 474 | + scale_y - 1.0); | ||
| 475 | + svg(" <text x=\"%.03f\" y=\"%.03f\">loader</text>\n", | ||
| 476 | + scale_x * (starttime - loader_time) * 0.000001 + 5.0, | ||
| 477 | + top + 14.0); | ||
| 478 | + top += scale_y; | ||
| 479 | + } | ||
| 480 | + if (initrd_time > 0) { | ||
| 481 | + svg(" <rect class=\"kernel\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 482 | + scale_x * (starttime) * 0.000001, | ||
| 483 | + top, | ||
| 484 | + scale_x * (initrd_time) * 0.000001, | ||
| 485 | + scale_y - 1.0); | ||
| 486 | + svg(" <text x=\"%.03f\" y=\"%.03f\">kernel</text>\n", | ||
| 487 | + scale_x * (starttime) * 0.000001 + 5.0, | ||
| 488 | + top + 14.0); | ||
| 489 | + top += scale_y; | ||
| 490 | + svg(" <rect class=\"inird\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 491 | + scale_x * (starttime + initrd_time) * 0.000001, | ||
| 492 | + top, | ||
| 493 | + scale_x * (userspace_time - initrd_time) * 0.000001, | ||
| 494 | + scale_y - 1.0); | ||
| 495 | + svg(" <text x=\"%.03f\" y=\"%.03f\">initrd</text>\n", | ||
| 496 | + scale_x * (starttime + initrd_time) * 0.000001 + 5.0, | ||
| 497 | + top + 14.0); | ||
| 498 | + top += scale_y; | ||
| 499 | + } else if (kernel_time > 0) { | ||
| 500 | + svg(" <rect class=\"kernel\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 501 | + scale_x * (starttime) * 0.000001, | ||
| 502 | + top, | ||
| 503 | + scale_x * (userspace_time) * 0.000001, | ||
| 504 | + scale_y - 1.0); | ||
| 505 | + svg(" <text x=\"%.03f\" y=\"%.03f\">kernel</text>\n", | ||
| 506 | + scale_x * (starttime) * 0.000001 + 5.0, | ||
| 507 | + top + 14.0); | ||
| 508 | + top += scale_y; | ||
| 509 | + } | ||
| 510 | + | ||
| 511 | + svg(" <rect class=\"userspace\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 512 | + scale_x * (userspace_time) * 0.000001, | ||
| 513 | + top, | ||
| 514 | + scale_x * (finish_time - userspace_time) * 0.000001, | ||
| 515 | + scale_y - 1.0); | ||
| 516 | + svg(" <text x=\"%.03f\" y=\"%.03f\">userspace</text>\n", | ||
| 517 | + scale_x * (userspace_time) * 0.000001 + 5.0, | ||
| 518 | + top + 14.0); | ||
| 519 | + top += scale_y; | ||
| 520 | + | ||
| 521 | + | ||
| 522 | + for (int i=0; i < n; i++) { | ||
| 523 | + //draw times[i] | ||
| 524 | + | ||
| 525 | + bool drawn = false; | ||
| 526 | + | ||
| 527 | + if (times[i].ixt >= userspace_time && times[i].ixt <= finish_time) { | ||
| 528 | + unsigned long long int end = finish_time; | ||
| 529 | + if (times[i].aet >= times[i].ixt && times[i].aet < end) | ||
| 530 | + end = times[i].aet; | ||
| 531 | + if (times[i].axt >= times[i].ixt && times[i].axt < end) | ||
| 532 | + end = times[i].axt; | ||
| 533 | + if (times[i].iet >= times[i].ixt && times[i].iet < end) | ||
| 534 | + end = times[i].iet; | ||
| 535 | + svg(" <rect class=\"activating\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 536 | + scale_x * (starttime + times[i].ixt) * 0.000001, | ||
| 537 | + top + (scale_y * i), | ||
| 538 | + scale_x * (end - times[i].ixt) * 0.000001, | ||
| 539 | + scale_y - 1.0); | ||
| 540 | + } | ||
| 541 | + if (times[i].aet >= userspace_time && times[i].aet <= finish_time) { | ||
| 542 | + unsigned long long int end = finish_time; | ||
| 543 | + if (times[i].axt >= times[i].aet && times[i].axt < end) | ||
| 544 | + end = times[i].axt; | ||
| 545 | + if (times[i].iet >= times[i].aet && times[i].iet < end) | ||
| 546 | + end = times[i].iet; | ||
| 547 | + svg(" <rect class=\"active\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 548 | + scale_x * (starttime + times[i].aet) * 0.000001, | ||
| 549 | + top + (scale_y * i), | ||
| 550 | + scale_x * (end - times[i].aet) * 0.000001, | ||
| 551 | + scale_y - 1.0); | ||
| 552 | + } | ||
| 553 | + if (times[i].axt >= userspace_time && times[i].axt <= finish_time) { | ||
| 554 | + unsigned long long int end = finish_time; | ||
| 555 | + if (times[i].iet >= times[i].axt && times[i].iet < end) | ||
| 556 | + end = times[i].iet; | ||
| 557 | + svg(" <rect class=\"deactivating\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n", | ||
| 558 | + scale_x * (starttime + times[i].axt) * 0.000001, | ||
| 559 | + top + (scale_y * i), | ||
| 560 | + scale_x * (end - times[i].axt) * 0.000001, | ||
| 561 | + scale_y - 1.0); | ||
| 562 | + } | ||
| 563 | + | ||
| 564 | + svg(" <text x=\"%.03f\" y=\"%.03f\">%s</text>\n", | ||
| 565 | + (starttime + times[i].ixt) * scale_x * 0.000001 + 5.0, | ||
| 566 | + top + (scale_y * i) + 14.0, | ||
| 567 | + times[i].name); | ||
| 568 | + | ||
| 569 | + } | ||
| 570 | + svg("</g>\n\n"); | ||
| 571 | + | ||
| 572 | + svg("</svg>"); | ||
| 573 | + return 0; | ||
| 574 | +} | ||
| 575 | + | ||
| 576 | +int analyze_blame(DBusConnection *bus) | ||
| 577 | +{ | ||
| 578 | + struct unit_times *times; | ||
| 579 | + int n = acquire_time_data(bus, ×); | ||
| 580 | + if (n<=0) | ||
| 581 | + return -n; | ||
| 582 | + | ||
| 583 | + qsort(times, n, sizeof(struct unit_times), compare_unit_times1); | ||
| 584 | + | ||
| 585 | + for (int i = 0; i < n; i++) { | ||
| 586 | + if (times[i].ixt <= 0 || times[i].aet <= 0) | ||
| 587 | + continue; | ||
| 588 | + if (times[i].aet <= times[i].ixt) | ||
| 589 | + continue; | ||
| 590 | + printf("%6llums %s\n", (times[i].aet - times[i].ixt) / 1000, times[i].name); | ||
| 591 | + } | ||
| 592 | + return 0; | ||
| 593 | +} | ||
| 594 | +int analyze_time(DBusConnection *bus) | ||
| 595 | +{ | ||
| 596 | + unsigned long long firmware_time, loader_time, kernel_time, initrd_time, userspace_time, finish_time; | ||
| 597 | + | ||
| 598 | + firmware_time = property_getull(bus, | ||
| 599 | + "org.freedesktop.systemd1", | ||
| 600 | + "/org/freedesktop/systemd1", | ||
| 601 | + "org.freedesktop.systemd1.Manager", | ||
| 602 | + "FirmwareTimestampMonotonic"); | ||
| 603 | + loader_time = property_getull(bus, | ||
| 604 | + "org.freedesktop.systemd1", | ||
| 605 | + "/org/freedesktop/systemd1", | ||
| 606 | + "org.freedesktop.systemd1.Manager", | ||
| 607 | + "LoaderTimestampMonotonic"); | ||
| 608 | + kernel_time = property_getull(bus, | ||
| 609 | + "org.freedesktop.systemd1", | ||
| 610 | + "/org/freedesktop/systemd1", | ||
| 611 | + "org.freedesktop.systemd1.Manager", | ||
| 612 | + "KernelTimestamp"); | ||
| 613 | + initrd_time = property_getull(bus, | ||
| 614 | + "org.freedesktop.systemd1", | ||
| 615 | + "/org/freedesktop/systemd1", | ||
| 616 | + "org.freedesktop.systemd1.Manager", | ||
| 617 | + "InitRDTimestampMonotonic"); | ||
| 618 | + userspace_time = property_getull(bus, | ||
| 619 | + "org.freedesktop.systemd1", | ||
| 620 | + "/org/freedesktop/systemd1", | ||
| 621 | + "org.freedesktop.systemd1.Manager", | ||
| 622 | + "UserspaceTimestampMonotonic"); | ||
| 623 | + finish_time = property_getull(bus, | ||
| 624 | + "org.freedesktop.systemd1", | ||
| 625 | + "/org/freedesktop/systemd1", | ||
| 626 | + "org.freedesktop.systemd1.Manager", | ||
| 627 | + "FinishTimestampMonotonic"); | ||
| 628 | + | ||
| 629 | + printf("Startup finished in "); | ||
| 630 | + | ||
| 631 | + if (firmware_time > 0) | ||
| 632 | + printf("%llums (firmware) + ", (firmware_time - loader_time) / 1000); | ||
| 633 | + if (loader_time > 0) | ||
| 634 | + printf("%llums (loader) + ", loader_time / 1000); | ||
| 635 | + if (initrd_time > 0) | ||
| 636 | + printf("%llums (kernel) + %llums (initrd) + ", initrd_time / 1000, (userspace_time - initrd_time) / 1000); | ||
| 637 | + else if (kernel_time > 0) | ||
| 638 | + printf("%llums (kernel) + ", userspace_time / 1000); | ||
| 639 | + | ||
| 640 | + printf("%llums (userspace) ", (finish_time - userspace_time) / 1000); | ||
| 641 | + | ||
| 642 | + if (kernel_time > 0) | ||
| 643 | + printf("= %llums\n", (firmware_time + finish_time) / 1000); | ||
| 644 | + else | ||
| 645 | + printf("= %llums\n", (finish_time - userspace_time) / 1000); | ||
| 646 | + | ||
| 647 | + return 0; | ||
| 648 | +} | ||
| 649 | + | ||
| 650 | +void analyze_help() | ||
| 651 | +{ | ||
| 652 | + printf("%s [OPTIONS...] {COMMAND} ...\n\n" | ||
| 653 | + " -h --help Show this help\n" | ||
| 654 | + " --version Show package version\n" | ||
| 655 | + " --system Connect to system manager\n" | ||
| 656 | + " --user Connect to user service manager\n\n" | ||
| 657 | + "Commands:\n" | ||
| 658 | + " time\n" | ||
| 659 | + " blame\n", | ||
| 660 | + program_invocation_short_name); | ||
| 661 | + | ||
| 662 | +} | ||
| 663 | + | ||
| 664 | +static int parse_argv(int argc, char *argv[]) | ||
| 665 | +{ | ||
| 666 | + enum { | ||
| 667 | + ARG_VERSION = 0x100, | ||
| 668 | + ARG_USER, | ||
| 669 | + ARG_SYSTEM | ||
| 670 | + }; | ||
| 671 | + | ||
| 672 | + static const struct option options[] = { | ||
| 673 | + { "help", no_argument, NULL, 'h' }, | ||
| 674 | + { "version", no_argument, NULL, ARG_VERSION }, | ||
| 675 | + { "user", no_argument, NULL, ARG_USER }, | ||
| 676 | + { "system", no_argument, NULL, ARG_SYSTEM }, | ||
| 677 | + { NULL, 0, NULL, 0 } | ||
| 678 | + }; | ||
| 679 | + | ||
| 680 | + int c; | ||
| 681 | + | ||
| 682 | + assert(argc >= 0); | ||
| 683 | + assert(argv); | ||
| 684 | + | ||
| 685 | + while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) { | ||
| 686 | + switch (c) { | ||
| 687 | + case 'h': | ||
| 688 | + analyze_help(); | ||
| 689 | + return 0; | ||
| 690 | + case ARG_VERSION: | ||
| 691 | + puts(PACKAGE_STRING); | ||
| 692 | + puts(SYSTEMD_FEATURES); | ||
| 693 | + return 0; | ||
| 694 | + case ARG_USER: | ||
| 695 | + arg_scope = UNIT_FILE_USER; | ||
| 696 | + break; | ||
| 697 | + case ARG_SYSTEM: | ||
| 698 | + arg_scope = UNIT_FILE_SYSTEM; | ||
| 699 | + break; | ||
| 700 | + | ||
| 701 | + case '?': | ||
| 702 | + return -EINVAL; | ||
| 703 | + | ||
| 704 | + default: | ||
| 705 | + log_error("Unknown option code '%c'.", c); | ||
| 706 | + return -EINVAL; | ||
| 707 | + } | ||
| 708 | + } | ||
| 709 | + return 1; | ||
| 710 | +} | ||
| 711 | + | ||
| 712 | + | ||
| 713 | +int main(int argc, char*argv[]) { | ||
| 714 | + int r, retval = EXIT_FAILURE; | ||
| 715 | + DBusConnection *bus = NULL; | ||
| 716 | + DBusError error; | ||
| 717 | + bool private_bus = false; | ||
| 718 | + | ||
| 719 | + dbus_error_init(&error); | ||
| 720 | + | ||
| 721 | + setlocale(LC_ALL, ""); | ||
| 722 | + log_parse_environment(); | ||
| 723 | + log_open(); | ||
| 724 | + | ||
| 725 | + r = parse_argv(argc, argv); | ||
| 726 | + if (r < 0) | ||
| 727 | + goto finish; | ||
| 728 | + else if (r == 0) { | ||
| 729 | + retval = EXIT_SUCCESS; | ||
| 730 | + goto finish; | ||
| 731 | + } | ||
| 732 | + | ||
| 733 | + bus_connect(arg_scope == UNIT_FILE_SYSTEM ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, &bus, &private_bus, &error); | ||
| 734 | + | ||
| 735 | + if (!argv[optind] || streq(argv[optind], "time")) | ||
| 736 | + retval = analyze_time(bus); | ||
| 737 | + else if (streq(argv[optind], "blame")) | ||
| 738 | + retval = analyze_blame(bus); | ||
| 739 | + else if (streq(argv[optind], "plot")) | ||
| 740 | + retval = analyze_plot(bus); | ||
| 741 | + else | ||
| 742 | + log_error("Unknown operation '%s'.", argv[optind]); | ||
| 743 | + | ||
| 744 | +finish: | ||
| 745 | + if (bus) { | ||
| 746 | + dbus_connection_flush(bus); | ||
| 747 | + dbus_connection_close(bus); | ||
| 748 | + dbus_connection_unref(bus); | ||
| 749 | + } | ||
| 750 | + | ||
| 751 | + dbus_error_free(&error); | ||
| 752 | + | ||
| 753 | + return retval; | ||
| 754 | +} | ||
| 755 | Index: systemd-197/src/analyze/systemd-analyze.in | ||
| 756 | =================================================================== | ||
| 757 | --- systemd-197.orig/src/analyze/systemd-analyze.in 2013-01-07 16:27:01.000000000 -0800 | ||
| 758 | +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 759 | @@ -1,328 +0,0 @@ | ||
| 760 | -#!@PYTHON_BINARY@ | ||
| 761 | -# -*-python-*- | ||
| 762 | - | ||
| 763 | -# This file is part of systemd. | ||
| 764 | -# | ||
| 765 | -# Copyright 2010-2013 Lennart Poettering | ||
| 766 | -# | ||
| 767 | -# systemd is free software; you can redistribute it and/or modify it | ||
| 768 | -# under the terms of the GNU Lesser General Public License as published by | ||
| 769 | -# the Free Software Foundation; either version 2.1 of the License, or | ||
| 770 | -# (at your option) any later version. | ||
| 771 | -# | ||
| 772 | -# systemd is distributed in the hope that it will be useful, but | ||
| 773 | -# WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 774 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 775 | -# Lesser General Public License for more details. | ||
| 776 | -# | ||
| 777 | -# You should have received a copy of the GNU Lesser General Public License | ||
| 778 | -# along with systemd; If not, see <http://www.gnu.org/licenses/>. | ||
| 779 | - | ||
| 780 | -import sys, os | ||
| 781 | -import argparse | ||
| 782 | -from gi.repository import Gio | ||
| 783 | -try: | ||
| 784 | - import cairo | ||
| 785 | -except ImportError: | ||
| 786 | - cairo = None | ||
| 787 | - | ||
| 788 | -def acquire_time_data(): | ||
| 789 | - manager = Gio.DBusProxy.new_for_bus_sync(bus, Gio.DBusProxyFlags.NONE, | ||
| 790 | - None, 'org.freedesktop.systemd1', '/org/freedesktop/systemd1', 'org.freedesktop.systemd1.Manager', None) | ||
| 791 | - units = manager.ListUnits() | ||
| 792 | - | ||
| 793 | - l = [] | ||
| 794 | - | ||
| 795 | - for i in units: | ||
| 796 | - if i[5] != "": | ||
| 797 | - continue | ||
| 798 | - | ||
| 799 | - properties = Gio.DBusProxy.new_for_bus_sync(bus, Gio.DBusProxyFlags.NONE, | ||
| 800 | - None, 'org.freedesktop.systemd1', i[6], 'org.freedesktop.DBus.Properties', None) | ||
| 801 | - | ||
| 802 | - ixt = properties.Get('(ss)', 'org.freedesktop.systemd1.Unit', 'InactiveExitTimestampMonotonic') | ||
| 803 | - aet = properties.Get('(ss)', 'org.freedesktop.systemd1.Unit', 'ActiveEnterTimestampMonotonic') | ||
| 804 | - axt = properties.Get('(ss)', 'org.freedesktop.systemd1.Unit', 'ActiveExitTimestampMonotonic') | ||
| 805 | - iet = properties.Get('(ss)', 'org.freedesktop.systemd1.Unit', 'InactiveEnterTimestampMonotonic') | ||
| 806 | - | ||
| 807 | - l.append((str(i[0]), ixt, aet, axt, iet)) | ||
| 808 | - | ||
| 809 | - return l | ||
| 810 | - | ||
| 811 | -def acquire_start_time(): | ||
| 812 | - properties = Gio.DBusProxy.new_for_bus_sync(bus, Gio.DBusProxyFlags.NONE, | ||
| 813 | - None, 'org.freedesktop.systemd1', '/org/freedesktop/systemd1', 'org.freedesktop.DBus.Properties', None) | ||
| 814 | - | ||
| 815 | - # Note that the firmware/loader times are returned as positive | ||
| 816 | - # values but are actually considered negative from the point | ||
| 817 | - # in time of kernel initialization. Also, the monotonic kernel | ||
| 818 | - # time will always be 0 since that's the epoch of the | ||
| 819 | - # monotonic clock. Since we want to know whether the kernel | ||
| 820 | - # timestamp is set at all we will instead ask for the realtime | ||
| 821 | - # clock for this timestamp. | ||
| 822 | - | ||
| 823 | - firmware_time = properties.Get('(ss)', 'org.freedesktop.systemd1.Manager', 'FirmwareTimestampMonotonic') | ||
| 824 | - loader_time = properties.Get('(ss)', 'org.freedesktop.systemd1.Manager', 'LoaderTimestampMonotonic') | ||
| 825 | - kernel_time = properties.Get('(ss)', 'org.freedesktop.systemd1.Manager', 'KernelTimestamp') | ||
| 826 | - initrd_time = properties.Get('(ss)', 'org.freedesktop.systemd1.Manager', 'InitRDTimestampMonotonic') | ||
| 827 | - userspace_time = properties.Get('(ss)', 'org.freedesktop.systemd1.Manager', 'UserspaceTimestampMonotonic') | ||
| 828 | - finish_time = properties.Get('(ss)', 'org.freedesktop.systemd1.Manager', 'FinishTimestampMonotonic') | ||
| 829 | - | ||
| 830 | - if finish_time == 0: | ||
| 831 | - sys.exit("Bootup is not yet finished. Please try again later.") | ||
| 832 | - | ||
| 833 | - assert firmware_time >= loader_time | ||
| 834 | - assert initrd_time <= userspace_time | ||
| 835 | - assert userspace_time <= finish_time | ||
| 836 | - | ||
| 837 | - return firmware_time, loader_time, kernel_time, initrd_time, userspace_time, finish_time | ||
| 838 | - | ||
| 839 | -def draw_box(context, j, k, l, m, r = 0, g = 0, b = 0): | ||
| 840 | - context.save() | ||
| 841 | - context.set_source_rgb(r, g, b) | ||
| 842 | - context.rectangle(j, k, l, m) | ||
| 843 | - context.fill() | ||
| 844 | - context.restore() | ||
| 845 | - | ||
| 846 | -def draw_text(context, x, y, text, size = 12, r = 0, g = 0, b = 0, vcenter = 0.5, hcenter = 0.5): | ||
| 847 | - context.save() | ||
| 848 | - | ||
| 849 | - context.set_source_rgb(r, g, b) | ||
| 850 | - context.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) | ||
| 851 | - context.set_font_size(size) | ||
| 852 | - | ||
| 853 | - if vcenter or hcenter: | ||
| 854 | - x_bearing, y_bearing, width, height = context.text_extents(text)[:4] | ||
| 855 | - | ||
| 856 | - if hcenter: | ||
| 857 | - x = x - width*hcenter - x_bearing | ||
| 858 | - | ||
| 859 | - if vcenter: | ||
| 860 | - y = y - height*vcenter - y_bearing | ||
| 861 | - | ||
| 862 | - context.move_to(x, y) | ||
| 863 | - context.show_text(text) | ||
| 864 | - | ||
| 865 | - context.restore() | ||
| 866 | - | ||
| 867 | -def time(): | ||
| 868 | - | ||
| 869 | - firmware_time, loader_time, kernel_time, initrd_time, userspace_time, finish_time = acquire_start_time() | ||
| 870 | - | ||
| 871 | - sys.stdout.write("Startup finished in ") | ||
| 872 | - | ||
| 873 | - if firmware_time > 0: | ||
| 874 | - sys.stdout.write("%lums (firmware) + " % ((firmware_time - loader_time) / 1000)) | ||
| 875 | - if loader_time > 0: | ||
| 876 | - sys.stdout.write("%lums (loader) + " % (loader_time / 1000)) | ||
| 877 | - if initrd_time > 0: | ||
| 878 | - sys.stdout.write("%lums (kernel) + %lums (initrd) + " % (initrd_time / 1000, (userspace_time - initrd_time) / 1000)) | ||
| 879 | - elif kernel_time > 0: | ||
| 880 | - sys.stdout.write("%lums (kernel) + " % (userspace_time / 1000)) | ||
| 881 | - | ||
| 882 | - sys.stdout.write("%lums (userspace) " % ((finish_time - userspace_time) / 1000)) | ||
| 883 | - | ||
| 884 | - if kernel_time > 0: | ||
| 885 | - sys.stdout.write("= %lums\n" % ((firmware_time + finish_time) / 1000)) | ||
| 886 | - else: | ||
| 887 | - sys.stdout.write("= %lums\n" % ((finish_time - userspace_time) / 1000)) | ||
| 888 | - | ||
| 889 | -def blame(): | ||
| 890 | - | ||
| 891 | - data = acquire_time_data() | ||
| 892 | - s = sorted(data, key = lambda i: i[2] - i[1], reverse = True) | ||
| 893 | - | ||
| 894 | - for name, ixt, aet, axt, iet in s: | ||
| 895 | - | ||
| 896 | - if ixt <= 0 or aet <= 0: | ||
| 897 | - continue | ||
| 898 | - | ||
| 899 | - if aet <= ixt: | ||
| 900 | - continue | ||
| 901 | - | ||
| 902 | - sys.stdout.write("%6lums %s\n" % ((aet - ixt) / 1000, name)) | ||
| 903 | - | ||
| 904 | -def plot(): | ||
| 905 | - if cairo is None: | ||
| 906 | - sys.exit("Failed to initilize python-cairo required for 'plot' verb.") | ||
| 907 | - firmware_time, loader_time, kernel_time, initrd_time, userspace_time, finish_time = acquire_start_time() | ||
| 908 | - data = acquire_time_data() | ||
| 909 | - s = sorted(data, key = lambda i: i[1]) | ||
| 910 | - | ||
| 911 | - # Account for kernel and initramfs bars if they exist | ||
| 912 | - if initrd_time > 0: | ||
| 913 | - count = 3 | ||
| 914 | - else: | ||
| 915 | - count = 2 | ||
| 916 | - | ||
| 917 | - for name, ixt, aet, axt, iet in s: | ||
| 918 | - | ||
| 919 | - if (ixt >= userspace_time and ixt <= finish_time) or \ | ||
| 920 | - (aet >= userspace_time and aet <= finish_time) or \ | ||
| 921 | - (axt >= userspace_time and axt <= finish_time): | ||
| 922 | - count += 1 | ||
| 923 | - | ||
| 924 | - border = 100 | ||
| 925 | - bar_height = 20 | ||
| 926 | - bar_space = bar_height * 0.1 | ||
| 927 | - | ||
| 928 | - # 1000px = 10s, 1px = 10ms | ||
| 929 | - width = finish_time/10000 + border*2 | ||
| 930 | - height = count * (bar_height + bar_space) + border * 2 | ||
| 931 | - | ||
| 932 | - if width < 1000: | ||
| 933 | - width = 1000 | ||
| 934 | - | ||
| 935 | - surface = cairo.SVGSurface(sys.stdout, width, height) | ||
| 936 | - context = cairo.Context(surface) | ||
| 937 | - | ||
| 938 | - draw_box(context, 0, 0, width, height, 1, 1, 1) | ||
| 939 | - | ||
| 940 | - context.translate(border + 0.5, border + 0.5) | ||
| 941 | - | ||
| 942 | - context.save() | ||
| 943 | - context.set_line_width(1) | ||
| 944 | - context.set_source_rgb(0.7, 0.7, 0.7) | ||
| 945 | - | ||
| 946 | - for x in range(0, int(finish_time/10000) + 100, 100): | ||
| 947 | - context.move_to(x, 0) | ||
| 948 | - context.line_to(x, height-border*2) | ||
| 949 | - | ||
| 950 | - context.move_to(0, 0) | ||
| 951 | - context.line_to(width-border*2, 0) | ||
| 952 | - | ||
| 953 | - context.move_to(0, height-border*2) | ||
| 954 | - context.line_to(width-border*2, height-border*2) | ||
| 955 | - | ||
| 956 | - context.stroke() | ||
| 957 | - context.restore() | ||
| 958 | - | ||
| 959 | - osrel = "Linux" | ||
| 960 | - if os.path.exists("/etc/os-release"): | ||
| 961 | - for line in open("/etc/os-release"): | ||
| 962 | - if line.startswith('PRETTY_NAME='): | ||
| 963 | - osrel = line[12:] | ||
| 964 | - osrel = osrel.strip('\"\n') | ||
| 965 | - break | ||
| 966 | - | ||
| 967 | - banner = "{} {} ({} {}) {}".format(osrel, *(os.uname()[1:5])) | ||
| 968 | - draw_text(context, 0, -15, banner, hcenter = 0, vcenter = 1) | ||
| 969 | - | ||
| 970 | - for x in range(0, int(finish_time/10000) + 100, 100): | ||
| 971 | - draw_text(context, x, -5, "%lus" % (x/100), vcenter = 0, hcenter = 0) | ||
| 972 | - | ||
| 973 | - y = 0 | ||
| 974 | - | ||
| 975 | - # draw boxes for kernel and initramfs boot time | ||
| 976 | - if initrd_time > 0: | ||
| 977 | - draw_box(context, 0, y, initrd_time/10000, bar_height, 0.7, 0.7, 0.7) | ||
| 978 | - draw_text(context, 10, y + bar_height/2, "kernel", hcenter = 0) | ||
| 979 | - y += bar_height + bar_space | ||
| 980 | - | ||
| 981 | - draw_box(context, initrd_time/10000, y, userspace_time/10000-initrd_time/10000, bar_height, 0.7, 0.7, 0.7) | ||
| 982 | - draw_text(context, initrd_time/10000 + 10, y + bar_height/2, "initramfs", hcenter = 0) | ||
| 983 | - y += bar_height + bar_space | ||
| 984 | - | ||
| 985 | - else: | ||
| 986 | - draw_box(context, 0, y, userspace_time/10000, bar_height, 0.6, 0.6, 0.6) | ||
| 987 | - draw_text(context, 10, y + bar_height/2, "kernel", hcenter = 0) | ||
| 988 | - y += bar_height + bar_space | ||
| 989 | - | ||
| 990 | - draw_box(context, userspace_time/10000, y, finish_time/10000-userspace_time/10000, bar_height, 0.7, 0.7, 0.7) | ||
| 991 | - draw_text(context, userspace_time/10000 + 10, y + bar_height/2, "userspace", hcenter = 0) | ||
| 992 | - y += bar_height + bar_space | ||
| 993 | - | ||
| 994 | - for name, ixt, aet, axt, iet in s: | ||
| 995 | - | ||
| 996 | - drawn = False | ||
| 997 | - left = -1 | ||
| 998 | - | ||
| 999 | - if ixt >= userspace_time and ixt <= finish_time: | ||
| 1000 | - | ||
| 1001 | - # Activating | ||
| 1002 | - a = ixt | ||
| 1003 | - b = min(filter(lambda x: x >= ixt, (aet, axt, iet, finish_time))) - ixt | ||
| 1004 | - | ||
| 1005 | - draw_box(context, a/10000, y, b/10000, bar_height, 1, 0, 0) | ||
| 1006 | - drawn = True | ||
| 1007 | - | ||
| 1008 | - if left < 0: | ||
| 1009 | - left = a | ||
| 1010 | - | ||
| 1011 | - if aet >= userspace_time and aet <= finish_time: | ||
| 1012 | - | ||
| 1013 | - # Active | ||
| 1014 | - a = aet | ||
| 1015 | - b = min(filter(lambda x: x >= aet, (axt, iet, finish_time))) - aet | ||
| 1016 | - | ||
| 1017 | - draw_box(context, a/10000, y, b/10000, bar_height, .8, .6, .6) | ||
| 1018 | - drawn = True | ||
| 1019 | - | ||
| 1020 | - if left < 0: | ||
| 1021 | - left = a | ||
| 1022 | - | ||
| 1023 | - if axt >= userspace_time and axt <= finish_time: | ||
| 1024 | - | ||
| 1025 | - # Deactivating | ||
| 1026 | - a = axt | ||
| 1027 | - b = min(filter(lambda x: x >= axt, (iet, finish_time))) - axt | ||
| 1028 | - | ||
| 1029 | - draw_box(context, a/10000, y, b/10000, bar_height, .6, .4, .4) | ||
| 1030 | - drawn = True | ||
| 1031 | - | ||
| 1032 | - if left < 0: | ||
| 1033 | - left = a | ||
| 1034 | - | ||
| 1035 | - if drawn: | ||
| 1036 | - x = left/10000 | ||
| 1037 | - | ||
| 1038 | - if x < width/2-border: | ||
| 1039 | - draw_text(context, x + 10, y + bar_height/2, name, hcenter = 0) | ||
| 1040 | - else: | ||
| 1041 | - draw_text(context, x - 10, y + bar_height/2, name, hcenter = 1) | ||
| 1042 | - | ||
| 1043 | - y += bar_height + bar_space | ||
| 1044 | - | ||
| 1045 | - draw_text(context, 0, height-border*2, "Legend: Red = Activating; Pink = Active; Dark Pink = Deactivating", hcenter = 0, vcenter = -1) | ||
| 1046 | - | ||
| 1047 | - if initrd_time > 0: | ||
| 1048 | - draw_text(context, 0, height-border*2 + bar_height, "Startup finished in %lums (kernel) + %lums (initramfs) + %lums (userspace) = %lums" % ( \ | ||
| 1049 | - initrd_time/1000, \ | ||
| 1050 | - (userspace_time - initrd_time)/1000, \ | ||
| 1051 | - (finish_time - userspace_time)/1000, \ | ||
| 1052 | - finish_time/1000), hcenter = 0, vcenter = -1) | ||
| 1053 | - else: | ||
| 1054 | - draw_text(context, 0, height-border*2 + bar_height, "Startup finished in %lums (kernel) + %lums (userspace) = %lums" % ( \ | ||
| 1055 | - userspace_time/1000, \ | ||
| 1056 | - (finish_time - userspace_time)/1000, \ | ||
| 1057 | - finish_time/1000), hcenter = 0, vcenter = -1) | ||
| 1058 | - | ||
| 1059 | - surface.finish() | ||
| 1060 | - | ||
| 1061 | -parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, | ||
| 1062 | - version='systemd-analyze @PACKAGE_VERSION@', | ||
| 1063 | - description='Process systemd profiling information', | ||
| 1064 | - epilog='''\ | ||
| 1065 | -time - print time spent in the kernel before reaching userspace | ||
| 1066 | -blame - print list of running units ordered by time to init | ||
| 1067 | -plot - output SVG graphic showing service initialization | ||
| 1068 | -''') | ||
| 1069 | - | ||
| 1070 | -parser.add_argument('action', choices=('time', 'blame', 'plot'), | ||
| 1071 | - default='time', nargs='?', | ||
| 1072 | - help='action to perform (default: time)') | ||
| 1073 | -parser.add_argument('--user', action='store_true', | ||
| 1074 | - help='use the session bus') | ||
| 1075 | - | ||
| 1076 | -args = parser.parse_args() | ||
| 1077 | - | ||
| 1078 | -if args.user: | ||
| 1079 | - bus = Gio.BusType.SESSION | ||
| 1080 | -else: | ||
| 1081 | - bus = Gio.BusType.SYSTEM | ||
| 1082 | - | ||
| 1083 | -verb = {'time' : time, | ||
| 1084 | - 'blame': blame, | ||
| 1085 | - 'plot' : plot, | ||
| 1086 | - } | ||
| 1087 | -verb.get(args.action)() | ||
diff --git a/meta/recipes-core/systemd/systemd/systemd-pam-fix-msformat.patch b/meta/recipes-core/systemd/systemd/systemd-pam-fix-msformat.patch index aa186bda72..8d1aa7d11a 100644 --- a/meta/recipes-core/systemd/systemd/systemd-pam-fix-msformat.patch +++ b/meta/recipes-core/systemd/systemd/systemd-pam-fix-msformat.patch | |||
| @@ -1,20 +1,20 @@ | |||
| 1 | Upstream-Status: Denied [no desire for uclibc support] | 1 | Upstream-Status: Denied [no desire for uclibc support] |
| 2 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | 2 | Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| 3 | 3 | ||
| 4 | Index: systemd-196/src/fsck/fsck.c | 4 | Index: systemd-198/src/fsck/fsck.c |
| 5 | =================================================================== | 5 | =================================================================== |
| 6 | --- systemd-196.orig/src/fsck/fsck.c 2012-07-26 03:45:14.000000000 -0700 | 6 | --- systemd-198.orig/src/fsck/fsck.c 2013-03-07 13:18:34.000000000 -0800 |
| 7 | +++ systemd-196/src/fsck/fsck.c 2013-01-21 16:10:46.807537608 -0800 | 7 | +++ systemd-198/src/fsck/fsck.c 2013-03-09 14:49:03.756572873 -0800 |
| 8 | @@ -36,6 +36,8 @@ | 8 | @@ -37,6 +37,8 @@ |
| 9 | #include "bus-errors.h" | ||
| 10 | #include "virt.h" | 9 | #include "virt.h" |
| 10 | #include "fileio.h" | ||
| 11 | 11 | ||
| 12 | +#include "config.h" | 12 | +#include "config.h" |
| 13 | + | 13 | + |
| 14 | static bool arg_skip = false; | 14 | static bool arg_skip = false; |
| 15 | static bool arg_force = false; | 15 | static bool arg_force = false; |
| 16 | static bool arg_show_progress = false; | 16 | static bool arg_show_progress = false; |
| 17 | @@ -193,9 +195,16 @@ | 17 | @@ -203,9 +205,16 @@ |
| 18 | char *device; | 18 | char *device; |
| 19 | double p; | 19 | double p; |
| 20 | usec_t t; | 20 | usec_t t; |
| @@ -33,10 +33,10 @@ Index: systemd-196/src/fsck/fsck.c | |||
| 33 | 33 | ||
| 34 | /* Only show one progress counter at max */ | 34 | /* Only show one progress counter at max */ |
| 35 | if (!locked) { | 35 | if (!locked) { |
| 36 | Index: systemd-196/src/core/swap.c | 36 | Index: systemd-198/src/core/swap.c |
| 37 | =================================================================== | 37 | =================================================================== |
| 38 | --- systemd-196.orig/src/core/swap.c 2012-10-29 19:40:42.000000000 -0700 | 38 | --- systemd-198.orig/src/core/swap.c 2013-03-07 13:18:34.000000000 -0800 |
| 39 | +++ systemd-196/src/core/swap.c 2013-01-21 16:15:11.751544181 -0800 | 39 | +++ systemd-198/src/core/swap.c 2013-03-09 14:49:03.756572873 -0800 |
| 40 | @@ -41,6 +41,8 @@ | 40 | @@ -41,6 +41,8 @@ |
| 41 | #include "path-util.h" | 41 | #include "path-util.h" |
| 42 | #include "virt.h" | 42 | #include "virt.h" |
| @@ -46,7 +46,7 @@ Index: systemd-196/src/core/swap.c | |||
| 46 | static const UnitActiveState state_translation_table[_SWAP_STATE_MAX] = { | 46 | static const UnitActiveState state_translation_table[_SWAP_STATE_MAX] = { |
| 47 | [SWAP_DEAD] = UNIT_INACTIVE, | 47 | [SWAP_DEAD] = UNIT_INACTIVE, |
| 48 | [SWAP_ACTIVATING] = UNIT_ACTIVATING, | 48 | [SWAP_ACTIVATING] = UNIT_ACTIVATING, |
| 49 | @@ -1059,6 +1061,7 @@ | 49 | @@ -1037,6 +1039,7 @@ |
| 50 | char *dev = NULL, *d; | 50 | char *dev = NULL, *d; |
| 51 | int prio = 0, k; | 51 | int prio = 0, k; |
| 52 | 52 | ||
| @@ -54,7 +54,7 @@ Index: systemd-196/src/core/swap.c | |||
| 54 | k = fscanf(m->proc_swaps, | 54 | k = fscanf(m->proc_swaps, |
| 55 | "%ms " /* device/file */ | 55 | "%ms " /* device/file */ |
| 56 | "%*s " /* type of swap */ | 56 | "%*s " /* type of swap */ |
| 57 | @@ -1066,6 +1069,16 @@ | 57 | @@ -1044,6 +1047,16 @@ |
| 58 | "%*s " /* used */ | 58 | "%*s " /* used */ |
| 59 | "%i\n", /* priority */ | 59 | "%i\n", /* priority */ |
| 60 | &dev, &prio); | 60 | &dev, &prio); |
| @@ -71,10 +71,10 @@ Index: systemd-196/src/core/swap.c | |||
| 71 | if (k != 2) { | 71 | if (k != 2) { |
| 72 | if (k == EOF) | 72 | if (k == EOF) |
| 73 | break; | 73 | break; |
| 74 | Index: systemd-196/src/core/mount-setup.c | 74 | Index: systemd-198/src/core/mount-setup.c |
| 75 | =================================================================== | 75 | =================================================================== |
| 76 | --- systemd-196.orig/src/core/mount-setup.c 2012-11-09 06:55:35.000000000 -0800 | 76 | --- systemd-198.orig/src/core/mount-setup.c 2013-03-07 13:18:34.000000000 -0800 |
| 77 | +++ systemd-196/src/core/mount-setup.c 2013-01-21 16:10:46.807537608 -0800 | 77 | +++ systemd-198/src/core/mount-setup.c 2013-03-09 14:49:03.760572872 -0800 |
| 78 | @@ -28,6 +28,7 @@ | 78 | @@ -28,6 +28,7 @@ |
| 79 | #include <assert.h> | 79 | #include <assert.h> |
| 80 | #include <unistd.h> | 80 | #include <unistd.h> |
| @@ -83,16 +83,16 @@ Index: systemd-196/src/core/mount-setup.c | |||
| 83 | 83 | ||
| 84 | #include "mount-setup.h" | 84 | #include "mount-setup.h" |
| 85 | #include "dev-setup.h" | 85 | #include "dev-setup.h" |
| 86 | @@ -42,6 +43,8 @@ | 86 | @@ -43,6 +44,8 @@ |
| 87 | #include "missing.h" | ||
| 88 | #include "virt.h" | 87 | #include "virt.h" |
| 88 | #include "efivars.h" | ||
| 89 | 89 | ||
| 90 | +#include "config.h" | 90 | +#include "config.h" |
| 91 | + | 91 | + |
| 92 | #ifndef TTY_GID | 92 | #ifndef TTY_GID |
| 93 | #define TTY_GID 5 | 93 | #define TTY_GID 5 |
| 94 | #endif | 94 | #endif |
| 95 | @@ -224,9 +227,12 @@ | 95 | @@ -231,9 +234,12 @@ |
| 96 | for (;;) { | 96 | for (;;) { |
| 97 | char *controller; | 97 | char *controller; |
| 98 | int enabled = 0; | 98 | int enabled = 0; |
| @@ -107,11 +107,11 @@ Index: systemd-196/src/core/mount-setup.c | |||
| 107 | if (feof(f)) | 107 | if (feof(f)) |
| 108 | break; | 108 | break; |
| 109 | 109 | ||
| 110 | Index: systemd-196/src/core/mount.c | 110 | Index: systemd-198/src/core/mount.c |
| 111 | =================================================================== | 111 | =================================================================== |
| 112 | --- systemd-196.orig/src/core/mount.c 2012-10-22 16:53:02.000000000 -0700 | 112 | --- systemd-198.orig/src/core/mount.c 2013-03-07 13:18:34.000000000 -0800 |
| 113 | +++ systemd-196/src/core/mount.c 2013-01-21 16:10:46.811537609 -0800 | 113 | +++ systemd-198/src/core/mount.c 2013-03-09 14:49:03.760572872 -0800 |
| 114 | @@ -41,6 +41,8 @@ | 114 | @@ -42,6 +42,8 @@ |
| 115 | #include "exit-status.h" | 115 | #include "exit-status.h" |
| 116 | #include "def.h" | 116 | #include "def.h" |
| 117 | 117 | ||
| @@ -120,7 +120,7 @@ Index: systemd-196/src/core/mount.c | |||
| 120 | static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = { | 120 | static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = { |
| 121 | [MOUNT_DEAD] = UNIT_INACTIVE, | 121 | [MOUNT_DEAD] = UNIT_INACTIVE, |
| 122 | [MOUNT_MOUNTING] = UNIT_ACTIVATING, | 122 | [MOUNT_MOUNTING] = UNIT_ACTIVATING, |
| 123 | @@ -1538,7 +1540,7 @@ | 123 | @@ -1584,7 +1586,7 @@ |
| 124 | int k; | 124 | int k; |
| 125 | 125 | ||
| 126 | device = path = options = options2 = fstype = d = p = o = NULL; | 126 | device = path = options = options2 = fstype = d = p = o = NULL; |
| @@ -129,7 +129,7 @@ Index: systemd-196/src/core/mount.c | |||
| 129 | if ((k = fscanf(m->proc_self_mountinfo, | 129 | if ((k = fscanf(m->proc_self_mountinfo, |
| 130 | "%*s " /* (1) mount id */ | 130 | "%*s " /* (1) mount id */ |
| 131 | "%*s " /* (2) parent id */ | 131 | "%*s " /* (2) parent id */ |
| 132 | @@ -1557,7 +1559,31 @@ | 132 | @@ -1603,7 +1605,31 @@ |
| 133 | &fstype, | 133 | &fstype, |
| 134 | &device, | 134 | &device, |
| 135 | &options2)) != 5) { | 135 | &options2)) != 5) { |
| @@ -162,10 +162,10 @@ Index: systemd-196/src/core/mount.c | |||
| 162 | if (k == EOF) | 162 | if (k == EOF) |
| 163 | break; | 163 | break; |
| 164 | 164 | ||
| 165 | Index: systemd-196/src/core/umount.c | 165 | Index: systemd-198/src/core/umount.c |
| 166 | =================================================================== | 166 | =================================================================== |
| 167 | --- systemd-196.orig/src/core/umount.c 2012-11-16 09:32:41.000000000 -0800 | 167 | --- systemd-198.orig/src/core/umount.c 2013-03-07 13:18:34.000000000 -0800 |
| 168 | +++ systemd-196/src/core/umount.c 2013-01-21 16:10:46.811537609 -0800 | 168 | +++ systemd-198/src/core/umount.c 2013-03-09 14:49:03.760572872 -0800 |
| 169 | @@ -36,6 +36,8 @@ | 169 | @@ -36,6 +36,8 @@ |
| 170 | #include "util.h" | 170 | #include "util.h" |
| 171 | #include "virt.h" | 171 | #include "virt.h" |
| @@ -235,20 +235,20 @@ Index: systemd-196/src/core/umount.c | |||
| 235 | if (k == EOF) | 235 | if (k == EOF) |
| 236 | break; | 236 | break; |
| 237 | 237 | ||
| 238 | Index: systemd-196/src/shared/socket-util.c | 238 | Index: systemd-198/src/shared/socket-util.c |
| 239 | =================================================================== | 239 | =================================================================== |
| 240 | --- systemd-196.orig/src/shared/socket-util.c 2012-11-14 13:21:15.000000000 -0800 | 240 | --- systemd-198.orig/src/shared/socket-util.c 2013-03-07 13:18:34.000000000 -0800 |
| 241 | +++ systemd-196/src/shared/socket-util.c 2013-01-21 16:10:46.811537609 -0800 | 241 | +++ systemd-198/src/shared/socket-util.c 2013-03-09 14:49:03.760572872 -0800 |
| 242 | @@ -39,6 +39,8 @@ | 242 | @@ -40,6 +40,8 @@ |
| 243 | #include "socket-util.h" | ||
| 244 | #include "missing.h" | 243 | #include "missing.h" |
| 244 | #include "fileio.h" | ||
| 245 | 245 | ||
| 246 | +#include "config.h" | 246 | +#include "config.h" |
| 247 | + | 247 | + |
| 248 | int socket_address_parse(SocketAddress *a, const char *s) { | 248 | int socket_address_parse(SocketAddress *a, const char *s) { |
| 249 | int r; | 249 | int r; |
| 250 | char *e, *n; | 250 | char *e, *n; |
| 251 | @@ -202,8 +204,16 @@ | 251 | @@ -203,8 +205,16 @@ |
| 252 | a->type = SOCK_RAW; | 252 | a->type = SOCK_RAW; |
| 253 | 253 | ||
| 254 | errno = 0; | 254 | errno = 0; |
| @@ -266,10 +266,10 @@ Index: systemd-196/src/shared/socket-util.c | |||
| 266 | 266 | ||
| 267 | family = netlink_family_from_string(sfamily); | 267 | family = netlink_family_from_string(sfamily); |
| 268 | if (family < 0) | 268 | if (family < 0) |
| 269 | Index: systemd-196/src/tmpfiles/tmpfiles.c | 269 | Index: systemd-198/src/tmpfiles/tmpfiles.c |
| 270 | =================================================================== | 270 | =================================================================== |
| 271 | --- systemd-196.orig/src/tmpfiles/tmpfiles.c 2012-10-23 16:06:30.000000000 -0700 | 271 | --- systemd-198.orig/src/tmpfiles/tmpfiles.c 2013-03-07 13:18:34.000000000 -0800 |
| 272 | +++ systemd-196/src/tmpfiles/tmpfiles.c 2013-01-21 16:10:46.811537609 -0800 | 272 | +++ systemd-198/src/tmpfiles/tmpfiles.c 2013-03-09 14:55:40.772566599 -0800 |
| 273 | @@ -51,6 +51,8 @@ | 273 | @@ -51,6 +51,8 @@ |
| 274 | #include "conf-files.h" | 274 | #include "conf-files.h" |
| 275 | #include "capability.h" | 275 | #include "capability.h" |
| @@ -279,26 +279,25 @@ Index: systemd-196/src/tmpfiles/tmpfiles.c | |||
| 279 | /* This reads all files listed in /etc/tmpfiles.d/?*.conf and creates | 279 | /* This reads all files listed in /etc/tmpfiles.d/?*.conf and creates |
| 280 | * them in the file system. This is intended to be used to create | 280 | * them in the file system. This is intended to be used to create |
| 281 | * properly owned directories beneath /tmp, /var/tmp, /run, which are | 281 | * properly owned directories beneath /tmp, /var/tmp, /run, which are |
| 282 | @@ -990,7 +992,7 @@ | 282 | @@ -993,6 +995,7 @@ |
| 283 | i = new0(Item, 1); | ||
| 284 | if (!i) | 283 | if (!i) |
| 285 | return log_oom(); | 284 | return log_oom(); |
| 286 | - | 285 | |
| 287 | +#ifdef HAVE_MSFORMAT | 286 | +#ifdef HAVE_MSFORMAT |
| 288 | if (sscanf(buffer, | 287 | r = sscanf(buffer, |
| 289 | "%c " | 288 | "%c %ms %ms %ms %ms %ms %n", |
| 290 | "%ms " | 289 | &type, |
| 291 | @@ -1006,6 +1008,28 @@ | 290 | @@ -1002,6 +1005,29 @@ |
| 292 | &group, | 291 | &group, |
| 293 | &age, | 292 | &age, |
| 294 | &n) < 2) { | 293 | &n); |
| 295 | +#else | 294 | +#else |
| 296 | + i->path = malloc(257); | 295 | + i->path = malloc(257); |
| 297 | + mode = malloc(257); | 296 | + mode = malloc(257); |
| 298 | + user = malloc(257); | 297 | + user = malloc(257); |
| 299 | + group = malloc(257); | 298 | + group = malloc(257); |
| 300 | + age = malloc(257); | 299 | + age = malloc(257); |
| 301 | + if (sscanf(buffer, | 300 | + r = sscanf(buffer, |
| 302 | + "%c " | 301 | + "%c " |
| 303 | + "%256s " | 302 | + "%256s " |
| 304 | + "%256s " | 303 | + "%256s " |
| @@ -312,38 +311,39 @@ Index: systemd-196/src/tmpfiles/tmpfiles.c | |||
| 312 | + user, | 311 | + user, |
| 313 | + group, | 312 | + group, |
| 314 | + age, | 313 | + age, |
| 315 | + &n) < 2) { | 314 | + &n); |
| 316 | +#endif /* HAVE_MSFORMAT */ | 315 | +#endif /* HAVE_MSFORMAT */ |
| 316 | + | ||
| 317 | if (r < 2) { | ||
| 317 | log_error("[%s:%u] Syntax error.", fname, line); | 318 | log_error("[%s:%u] Syntax error.", fname, line); |
| 318 | r = -EIO; | 319 | r = -EIO; |
| 319 | goto finish; | 320 | Index: systemd-198/src/cryptsetup/cryptsetup-generator.c |
| 320 | Index: systemd-196/src/cryptsetup/cryptsetup-generator.c | ||
| 321 | =================================================================== | 321 | =================================================================== |
| 322 | --- systemd-196.orig/src/cryptsetup/cryptsetup-generator.c 2012-08-08 14:53:24.000000000 -0700 | 322 | --- systemd-198.orig/src/cryptsetup/cryptsetup-generator.c 2013-03-07 13:18:34.000000000 -0800 |
| 323 | +++ systemd-196/src/cryptsetup/cryptsetup-generator.c 2013-01-21 16:10:46.811537609 -0800 | 323 | +++ systemd-198/src/cryptsetup/cryptsetup-generator.c 2013-03-09 14:51:33.080571639 -0800 |
| 324 | @@ -30,6 +30,8 @@ | 324 | @@ -31,6 +31,8 @@ |
| 325 | #include "virt.h" | ||
| 326 | #include "strv.h" | 325 | #include "strv.h" |
| 326 | #include "fileio.h" | ||
| 327 | 327 | ||
| 328 | +#include "config.h" | 328 | +#include "config.h" |
| 329 | + | 329 | + |
| 330 | static const char *arg_dest = "/tmp"; | 330 | static const char *arg_dest = "/tmp"; |
| 331 | static bool arg_enabled = true; | 331 | static bool arg_enabled = true; |
| 332 | static bool arg_read_crypttab = true; | 332 | static bool arg_read_crypttab = true; |
| 333 | @@ -421,8 +423,15 @@ | 333 | @@ -395,7 +397,16 @@ |
| 334 | l = strstrip(line); | 334 | if (*l == '#' || *l == 0) |
| 335 | if (*l == '#' || *l == 0) | 335 | continue; |
| 336 | continue; | 336 | |
| 337 | - | ||
| 338 | +#ifdef HAVE_MSFORMAT | 337 | +#ifdef HAVE_MSFORMAT |
| 339 | k = sscanf(l, "%ms %ms %ms %ms", &name, &device, &password, &options); | 338 | k = sscanf(l, "%ms %ms %ms %ms", &name, &device, &password, &options); |
| 340 | +#else | 339 | +#else |
| 341 | + name = malloc(257); | 340 | + name = malloc(257); |
| 342 | + device = malloc(257); | 341 | + device = malloc(257); |
| 343 | + password = malloc(257); | 342 | + password = malloc(257); |
| 344 | + options = malloc(257); | 343 | + options = malloc(257); |
| 345 | + k = sscanf(l, "%256s %256s %256s %256s", name, device, password, options); | 344 | + k = sscanf(l, "%256s %256s %256s %256s", name, device, password, options); |
| 346 | +#endif /* HAVE_MSFORMAT */ | 345 | +#endif /* HAVE_MSFORMAT */ |
| 347 | if (k < 2 || k > 4) { | 346 | + |
| 348 | log_error("Failed to parse /etc/crypttab:%u, ignoring.", n); | 347 | if (k < 2 || k > 4) { |
| 349 | r = EXIT_FAILURE; | 348 | log_error("Failed to parse /etc/crypttab:%u, ignoring.", n); |
| 349 | r = EXIT_FAILURE; | ||
diff --git a/meta/recipes-core/systemd/systemd/udev-linkage.patch b/meta/recipes-core/systemd/systemd/udev-linkage.patch deleted file mode 100644 index a0d9b4c876..0000000000 --- a/meta/recipes-core/systemd/systemd/udev-linkage.patch +++ /dev/null | |||
| @@ -1,62 +0,0 @@ | |||
| 1 | Don't cause libudev to link against libsystemd-daemon. | ||
| 2 | |||
| 3 | Upstream-Status: Backport | ||
| 4 | Signed-off-by: Ross Burton <ross.burton@intel.com> | ||
| 5 | |||
| 6 | From 8ee37c2bed1d452d566abf85b0cdf732b7ca029a Mon Sep 17 00:00:00 2001 | ||
| 7 | From: Kay Sievers <kay@vrfy.org> | ||
| 8 | Date: Thu, 7 Feb 2013 13:47:46 +0100 | ||
| 9 | Subject: [PATCH] build-sys: at least for now, never link libudev against | ||
| 10 | systemd's shared libraries | ||
| 11 | |||
| 12 | --- | ||
| 13 | Makefile.am | 12 +++++++++--- | ||
| 14 | 1 file changed, 9 insertions(+), 3 deletions(-) | ||
| 15 | |||
| 16 | diff --git a/Makefile.am b/Makefile.am | ||
| 17 | index 474110a..0e6c88f 100644 | ||
| 18 | --- a/Makefile.am | ||
| 19 | +++ b/Makefile.am | ||
| 20 | @@ -811,8 +811,6 @@ libsystemd_shared_la_SOURCES = \ | ||
| 21 | src/shared/calendarspec.c \ | ||
| 22 | src/shared/calendarspec.h | ||
| 23 | |||
| 24 | -libsystemd_shared_la_LIBADD = libsystemd-daemon.la | ||
| 25 | - | ||
| 26 | #------------------------------------------------------------------------------- | ||
| 27 | noinst_LTLIBRARIES += \ | ||
| 28 | libsystemd-dbus.la | ||
| 29 | @@ -1662,6 +1660,9 @@ systemd_tty_ask_password_agent_LDADD = \ | ||
| 30 | libsystemd_daemon_la_SOURCES = \ | ||
| 31 | src/libsystemd-daemon/sd-daemon.c | ||
| 32 | |||
| 33 | +libsystemd_daemon_internal_la_SOURCES = \ | ||
| 34 | + $(libsystemd_daemon_la_SOURCES) | ||
| 35 | + | ||
| 36 | libsystemd_daemon_la_CFLAGS = \ | ||
| 37 | $(AM_CFLAGS) \ | ||
| 38 | -fvisibility=hidden \ | ||
| 39 | @@ -1689,6 +1690,9 @@ UNINSTALL_EXEC_HOOKS += libsystemd-daemon-uninstall-hook | ||
| 40 | lib_LTLIBRARIES += \ | ||
| 41 | libsystemd-daemon.la | ||
| 42 | |||
| 43 | +noinst_LTLIBRARIES += \ | ||
| 44 | + libsystemd-daemon-internal.la | ||
| 45 | + | ||
| 46 | pkgconfiglib_DATA += \ | ||
| 47 | src/libsystemd-daemon/libsystemd-daemon.pc | ||
| 48 | |||
| 49 | @@ -1768,7 +1772,9 @@ libudev_la_LDFLAGS = \ | ||
| 50 | -Wl,--version-script=$(top_srcdir)/src/libudev/libudev.sym | ||
| 51 | |||
| 52 | libudev_la_LIBADD = \ | ||
| 53 | - libsystemd-shared.la | ||
| 54 | + libsystemd-shared.la \ | ||
| 55 | + libsystemd-daemon-internal.la \ | ||
| 56 | + libsystemd-id128-internal.la | ||
| 57 | |||
| 58 | pkgconfiglib_DATA += \ | ||
| 59 | src/libudev/libudev.pc | ||
| 60 | -- | ||
| 61 | 1.7.10.4 | ||
| 62 | |||
diff --git a/meta/recipes-core/systemd/systemd_197.bb b/meta/recipes-core/systemd/systemd_198.bb index 5ba3a2348a..6a8db512ca 100644 --- a/meta/recipes-core/systemd/systemd_197.bb +++ b/meta/recipes-core/systemd/systemd_198.bb | |||
| @@ -9,7 +9,6 @@ LIC_FILES_CHKSUM = "file://LICENSE.GPL2;md5=751419260aa954499f7abaabaa882bbe \ | |||
| 9 | PROVIDES = "udev" | 9 | PROVIDES = "udev" |
| 10 | 10 | ||
| 11 | PE = "1" | 11 | PE = "1" |
| 12 | PR = "r4" | ||
| 13 | 12 | ||
| 14 | DEPENDS = "kmod docbook-sgml-dtd-4.1-native intltool-native gperf-native acl readline dbus libcap libcgroup tcp-wrappers glib-2.0" | 13 | DEPENDS = "kmod docbook-sgml-dtd-4.1-native intltool-native gperf-native acl readline dbus libcap libcgroup tcp-wrappers glib-2.0" |
| 15 | DEPENDS += "${@base_contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}" | 14 | DEPENDS += "${@base_contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}" |
| @@ -24,12 +23,10 @@ SRC_URI = "http://www.freedesktop.org/software/systemd/systemd-${PV}.tar.xz \ | |||
| 24 | file://var-run.conf \ | 23 | file://var-run.conf \ |
| 25 | ${UCLIBCPATCHES} \ | 24 | ${UCLIBCPATCHES} \ |
| 26 | file://00-create-volatile.conf \ | 25 | file://00-create-volatile.conf \ |
| 27 | file://0001-systemd-analyze-rewrite-in-C.patch \ | ||
| 28 | file://udev-linkage.patch \ | ||
| 29 | file://init \ | 26 | file://init \ |
| 30 | " | 27 | " |
| 31 | SRC_URI[md5sum] = "56a860dceadfafe59f40141eb5223743" | 28 | SRC_URI[md5sum] = "26a75e2a310f8c1c1ea9ec26ddb171c5" |
| 32 | SRC_URI[sha256sum] = "e6857ea21ae24d7056e7b0f4c2aaaba73b8bf57025b8949c0a8af0c1bc9774b5" | 29 | SRC_URI[sha256sum] = "444492355e5ff0ad99e0691ecaff1081ee8d45901580f47ba8b74e56107c71bf" |
| 33 | 30 | ||
| 34 | UCLIBCPATCHES = "" | 31 | UCLIBCPATCHES = "" |
| 35 | UCLIBCPATCHES_libc-uclibc = "file://systemd-pam-configure-check-uclibc.patch \ | 32 | UCLIBCPATCHES_libc-uclibc = "file://systemd-pam-configure-check-uclibc.patch \ |
| @@ -138,6 +135,7 @@ CONFFILES_${PN} = "${sysconfdir}/systemd/journald.conf \ | |||
| 138 | ${sysconfdir}/systemd/user.conf" | 135 | ${sysconfdir}/systemd/user.conf" |
| 139 | 136 | ||
| 140 | FILES_${PN} = " ${base_bindir}/* \ | 137 | FILES_${PN} = " ${base_bindir}/* \ |
| 138 | ${datadir}/bash-completion \ | ||
| 141 | ${datadir}/dbus-1/services \ | 139 | ${datadir}/dbus-1/services \ |
| 142 | ${datadir}/dbus-1/system-services \ | 140 | ${datadir}/dbus-1/system-services \ |
| 143 | ${datadir}/polkit-1 \ | 141 | ${datadir}/polkit-1 \ |
| @@ -162,6 +160,8 @@ FILES_${PN} = " ${base_bindir}/* \ | |||
| 162 | ${bindir}/localectl \ | 160 | ${bindir}/localectl \ |
| 163 | ${bindir}/hostnamectl \ | 161 | ${bindir}/hostnamectl \ |
| 164 | ${bindir}/timedatectl \ | 162 | ${bindir}/timedatectl \ |
| 163 | ${bindir}/bootctl \ | ||
| 164 | ${bindir}/kernel-install \ | ||
| 165 | ${exec_prefix}/lib/tmpfiles.d/*.conf \ | 165 | ${exec_prefix}/lib/tmpfiles.d/*.conf \ |
| 166 | ${exec_prefix}/lib/systemd \ | 166 | ${exec_prefix}/lib/systemd \ |
| 167 | ${exec_prefix}/lib/binfmt.d \ | 167 | ${exec_prefix}/lib/binfmt.d \ |
