The patch is applied optionally only to uclibc builds Also move the mkostemp replacement patch to uclibc only list
Not perfect yet but gets us going on uclibc Signed-off-by: Khem Raj <raj.k...@gmail.com> --- .../systemd/systemd/format-replace-m-uclibc.patch | 402 ++++++++++++++++++++ meta-oe/recipes-core/systemd/systemd_git.bb | 8 +- 2 files changed, 408 insertions(+), 2 deletions(-) create mode 100644 meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch diff --git a/meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch b/meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch new file mode 100644 index 0000000..3b9ed31 --- /dev/null +++ b/meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch @@ -0,0 +1,402 @@ +Patch from Henning. %m is a glibc only thing. For uclibc we need to do it +differently. So we use static strings instead of mallocing them and free'ing + +I dont know if upstream systemd have plans to make systemd work on non +glibc system libraries if not then this patch would not make sense for +upstream + +Signed-off-by: Khem Raj <raj.k...@gmail.com> + +Index: git/src/mount-setup.c +=================================================================== +--- git.orig/src/mount-setup.c 2011-07-03 08:24:43.892018457 -0700 ++++ git/src/mount-setup.c 2011-07-03 08:35:23.592956700 -0700 +@@ -147,10 +147,11 @@ + + for (;;) { + MountPoint p; +- char *controller, *where; ++ char controller[30]; ++ char *where; + int enabled = false; + +- if (fscanf(f, "%ms %*i %*i %i", &controller, &enabled) != 2) { ++ if (fscanf(f, "%29s %*i %*i %i", controller, &enabled) != 2) { + + if (feof(f)) + break; +@@ -161,12 +162,10 @@ + } + + if (!enabled) { +- free(controller); + continue; + } + + if (asprintf(&where, "/sys/fs/cgroup/%s", controller) < 0) { +- free(controller); + r = -ENOMEM; + goto finish; + } +@@ -180,7 +179,6 @@ + p.fatal = false; + + r = mount_one(&p); +- free(controller); + free(where); + + if (r < 0) +Index: git/src/socket-util.c +=================================================================== +--- git.orig/src/socket-util.c 2011-07-03 08:24:43.892018457 -0700 ++++ git/src/socket-util.c 2011-07-03 08:25:38.242098176 -0700 +@@ -192,7 +192,7 @@ + int socket_address_parse_netlink(SocketAddress *a, const char *s) { + int family; + unsigned group = 0; +- char* sfamily = NULL; ++ char sfamily[50]; + assert(a); + assert(s); + +@@ -200,17 +200,14 @@ + a->type = SOCK_RAW; + + errno = 0; +- if (sscanf(s, "%ms %u", &sfamily, &group) < 1) ++ if (sscanf(s, "%49s %u", &sfamily, &group) < 1) + return errno ? -errno : -EINVAL; + + if ((family = netlink_family_from_string(sfamily)) < 0) + if (safe_atoi(sfamily, &family) < 0) { +- free(sfamily); + return -EINVAL; + } + +- free(sfamily); +- + a->sockaddr.nl.nl_family = AF_NETLINK; + a->sockaddr.nl.nl_groups = group; + +Index: git/src/cryptsetup-generator.c +=================================================================== +--- git.orig/src/cryptsetup-generator.c 2011-07-03 08:24:43.892018457 -0700 ++++ git/src/cryptsetup-generator.c 2011-07-03 08:25:38.252098188 -0700 +@@ -260,7 +260,7 @@ + + for (;;) { + char line[LINE_MAX], *l; +- char *name = NULL, *device = NULL, *password = NULL, *options = NULL; ++ char name[50], device[50], password[50], options[50] = NULL; + int k; + + if (!(fgets(line, sizeof(line), f))) +@@ -272,7 +272,7 @@ + if (*l == '#' || *l == 0) + continue; + +- if ((k = sscanf(l, "%ms %ms %ms %ms", &name, &device, &password, &options)) < 2 || k > 4) { ++ if ((k = sscanf(l, "%s %s %s %s", &name, &device, &password, &options)) < 2 || k > 4) { + log_error("Failed to parse /etc/crypttab:%u, ignoring.", n); + r = EXIT_FAILURE; + goto next; +@@ -281,11 +281,7 @@ + if (create_disk(name, device, password, options) < 0) + r = EXIT_FAILURE; + +- next: +- free(name); +- free(device); +- free(password); +- free(options); ++ next:; + } + + finish: +Index: git/src/swap.c +=================================================================== +--- git.orig/src/swap.c 2011-07-03 08:24:43.892018457 -0700 ++++ git/src/swap.c 2011-07-03 08:34:20.512864178 -0700 +@@ -1043,11 +1043,12 @@ + (void) fscanf(m->proc_swaps, "%*s %*s %*s %*s %*s\n"); + + for (i = 1;; i++) { +- char *dev = NULL, *d; ++ char *d; ++ char dev[20]; + int prio = 0, k; + + if ((k = fscanf(m->proc_swaps, +- "%ms " /* device/file */ ++ "%19s " /* device/file */ + "%*s " /* type of swap */ + "%*s " /* swap size */ + "%*s " /* used */ +@@ -1058,12 +1059,10 @@ + break; + + log_warning("Failed to parse /proc/swaps:%u.", i); +- free(dev); + continue; + } + + d = cunescape(dev); +- free(dev); + + if (!d) + return -ENOMEM; +Index: git/src/tmpfiles.c +=================================================================== +--- git.orig/src/tmpfiles.c 2011-07-03 08:24:43.892018457 -0700 ++++ git/src/tmpfiles.c 2011-07-03 08:25:38.272098222 -0700 +@@ -66,7 +66,7 @@ + typedef struct Item { + char type; + +- char *path; ++ char path[50]; + uid_t uid; + gid_t gid; + mode_t mode; +@@ -619,7 +619,6 @@ + static void item_free(Item *i) { + assert(i); + +- free(i->path); + free(i); + } + +@@ -654,7 +653,7 @@ + + static int parse_line(const char *fname, unsigned line, const char *buffer) { + Item *i, *existing; +- char *mode = NULL, *user = NULL, *group = NULL, *age = NULL; ++ char mode[50], user[50], group[50], age[50]; + Hashmap *h; + int r; + +@@ -669,17 +668,17 @@ + + if (sscanf(buffer, + "%c " +- "%ms " +- "%ms " +- "%ms " +- "%ms " +- "%ms", ++ "%s " ++ "%s " ++ "%s " ++ "%s " ++ "%s", + &i->type, + &i->path, +- &mode, +- &user, +- &group, +- &age) < 2) { ++ mode, ++ user, ++ group, ++ age) < 2) { + log_error("[%s:%u] Syntax error.", fname, line); + r = -EIO; + goto finish; +@@ -793,11 +792,6 @@ + r = 0; + + finish: +- free(user); +- free(group); +- free(mode); +- free(age); +- + if (i) + item_free(i); + +Index: git/src/mount.c +=================================================================== +--- git.orig/src/mount.c 2011-07-03 08:24:43.892018457 -0700 ++++ git/src/mount.c 2011-07-03 08:33:43.112809328 -0700 +@@ -24,6 +24,7 @@ + #include <mntent.h> + #include <sys/epoll.h> + #include <signal.h> ++#include <string.h> + + #include "unit.h" + #include "mount.h" +@@ -1555,7 +1556,13 @@ + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { + int r = 0; + unsigned i; +- char *device, *path, *options, *options2, *fstype, *d, *p, *o; ++ char *d, *p, *o; ++ char device[50]; ++ char path[50]; ++ char options[50]; ++ char options2[50]; ++ char fstype[50]; ++ + + assert(m); + +@@ -1564,26 +1571,26 @@ + for (i = 1;; i++) { + int k; + +- device = path = options = options2 = fstype = d = p = o = NULL; ++ d = p = o = NULL; + + if ((k = fscanf(m->proc_self_mountinfo, + "%*s " /* (1) mount id */ + "%*s " /* (2) parent id */ + "%*s " /* (3) major:minor */ + "%*s " /* (4) root */ +- "%ms " /* (5) mount point */ +- "%ms" /* (6) mount options */ ++ "%49s " /* (5) mount point */ ++ "%49s" /* (6) mount options */ + "%*[^-]" /* (7) optional fields */ + "- " /* (8) separator */ +- "%ms " /* (9) file system type */ +- "%ms" /* (10) mount source */ +- "%ms" /* (11) mount options 2 */ ++ "%49s " /* (9) file system type */ ++ "%49s" /* (10) mount source */ ++ "%49s" /* (11) mount options 2 */ + "%*[^\n]", /* some rubbish at the end */ +- &path, +- &options, +- &fstype, +- &device, +- &options2)) != 5) { ++ path, ++ options, ++ fstype, ++ device, ++ options2)) != 5) { + + if (k == EOF) + break; +@@ -1607,22 +1614,12 @@ + r = k; + + clean_up: +- free(device); +- free(path); +- free(options); +- free(options2); +- free(fstype); + free(d); + free(p); + free(o); + } + + finish: +- free(device); +- free(path); +- free(options); +- free(options2); +- free(fstype); + free(d); + free(p); + free(o); +Index: git/src/umount.c +=================================================================== +--- git.orig/src/umount.c 2011-07-03 08:24:43.892018457 -0700 ++++ git/src/umount.c 2011-07-03 08:33:06.732755969 -0700 +@@ -60,7 +60,9 @@ + + static int mount_points_list_get(MountPoint **head) { + FILE *proc_self_mountinfo; +- char *path, *p; ++ char *p; ++ char path[50]; ++ + unsigned int i; + int r; + +@@ -72,17 +74,17 @@ + for (i = 1;; i++) { + int k; + MountPoint *m; +- char *root; ++ char root[50]; + bool skip_ro; + +- path = p = NULL; ++ p = NULL; + + if ((k = fscanf(proc_self_mountinfo, + "%*s " /* (1) mount id */ + "%*s " /* (2) parent id */ + "%*s " /* (3) major:minor */ +- "%ms " /* (4) root */ +- "%ms " /* (5) mount point */ ++ "%49s " /* (4) root */ ++ "%49s " /* (5) mount point */ + "%*s" /* (6) mount options */ + "%*[^-]" /* (7) optional fields */ + "- " /* (8) separator */ +@@ -90,24 +92,21 @@ + "%*s" /* (10) mount source */ + "%*s" /* (11) mount options 2 */ + "%*[^\n]", /* some rubbish at the end */ +- &root, +- &path)) != 2) { ++ root, ++ path)) != 2) { + if (k == EOF) + break; + + log_warning("Failed to parse /proc/self/mountinfo:%u.", i); + +- free(path); + continue; + } + + /* If we encounter a bind mount, don't try to remount + * the source dir too early */ + skip_ro = !streq(root, "/"); +- free(root); + + p = cunescape(path); +- free(path); + + if (!p) { + r = -ENOMEM; +@@ -152,28 +151,28 @@ + + for (i = 2;; i++) { + MountPoint *swap; +- char *dev = NULL, *d; ++ char *d; ++ char dev[50]; ++ + int k; + + if ((k = fscanf(proc_swaps, +- "%ms " /* device/file */ ++ "%50s " /* device/file */ + "%*s " /* type of swap */ + "%*s " /* swap size */ + "%*s " /* used */ + "%*s\n", /* priority */ +- &dev)) != 1) { ++ dev)) != 1) { + + if (k == EOF) + break; + + log_warning("Failed to parse /proc/swaps:%u.", i); + +- free(dev); + continue; + } + + if (endswith(dev, "(deleted)")) { +- free(dev); + continue; + } + diff --git a/meta-oe/recipes-core/systemd/systemd_git.bb b/meta-oe/recipes-core/systemd/systemd_git.bb index 66cc831..ebb8e7f 100644 --- a/meta-oe/recipes-core/systemd/systemd_git.bb +++ b/meta-oe/recipes-core/systemd/systemd_git.bb @@ -15,7 +15,7 @@ inherit gitpkgv PKGV = "v${GITPKGVTAG}" PV = "git" -PR = "r7" +PR = "r8" inherit autotools vala @@ -23,9 +23,13 @@ SRCREV = "ef3a24de028efe885db1303b4843aba5ffd0f531" SRC_URI = "git://anongit.freedesktop.org/systemd;protocol=git \ file://0001-systemd-disable-xml-file-stuff-and-introspection.patch \ - file://paper-over-mkostemp.patch \ file://use-nonet-for-docbook.patch \ + ${UCLIBCPATCHES} \ " +UCLIBCPATCHES = "" +UCLIBCPATCHES_libc-uclibc = "file://paper-over-mkostemp.patch \ + file://format-replace-m-uclibc.patch \ + " S = "${WORKDIR}/git" -- 1.7.4.1 _______________________________________________ Openembedded-devel mailing list Openembedded-devel@lists.openembedded.org http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-devel