Re: [systemd-devel] [RFC 22/25] support POSIX strerror_r returning int
On Thu, 18.09.14 15:24, Emil Renner Berthing (syst...@esmil.dk) wrote: > --- > configure.ac | 2 ++ > src/journal/journal-send.c| 36 +++- > src/libsystemd/sd-bus/bus-error.c | 14 +- > 3 files changed, 42 insertions(+), 10 deletions(-) > > diff --git a/configure.ac b/configure.ac > index 9cd4c05..3f17833 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -336,6 +336,8 @@ AC_CHECK_DECLS([IFLA_MACVLAN_FLAGS, > #include > ]]) > > +AC_FUNC_STRERROR_R I'd be willing to merge a patch that switches our code to make use of the POSIX version of strerror_r(), instead of the GNU one. Not sure though whether the headers allow that without giving up all of the GNU apis... Lennart -- Lennart Poettering, Red Hat ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] [RFC 22/25] support POSIX strerror_r returning int
Why do you define both posix_strerror_r and gnu_strerror_r? Isn't it enough to define the second one for compatibility purposes? Zbyszek On Thu, Sep 18, 2014 at 03:24:58PM +0200, Emil Renner Berthing wrote: > --- > configure.ac | 2 ++ > src/journal/journal-send.c| 36 +++- > src/libsystemd/sd-bus/bus-error.c | 14 +- > 3 files changed, 42 insertions(+), 10 deletions(-) > > diff --git a/configure.ac b/configure.ac > index 9cd4c05..3f17833 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -336,6 +336,8 @@ AC_CHECK_DECLS([IFLA_MACVLAN_FLAGS, > #include > ]]) > > +AC_FUNC_STRERROR_R > + > # This makes sure pkg.m4 is available. > m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install > pkg-config]) > > diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c > index 9ca4a0b..62b40b2 100644 > --- a/src/journal/journal-send.c > +++ b/src/journal/journal-send.c > @@ -341,6 +341,29 @@ _public_ int sd_journal_sendv(const struct iovec *iov, > int n) { > return 0; > } > > +#ifdef STRERROR_R_CHAR_P > +static int posix_strerror_r(int errnum, char *buf, size_t buflen) { > +char *res; > + > +errno = 0; > +res = strerror_r(errnum, buf, buflen); > +if (errno) > +return errno; > + > +if (res != buf) { > +size_t len = strlen(res)+1; > + > +if (len > buflen) > +return ERANGE; > + > +memmove(buf, res, len); > +} > +return 0; > +} > +#else > +#define posix_strerror_r strerror_r > +#endif > + > static int fill_iovec_perror_and_send(const char *message, int skip, struct > iovec iov[]) { > PROTECT_ERRNO; > size_t n, k; > @@ -350,16 +373,11 @@ static int fill_iovec_perror_and_send(const char > *message, int skip, struct iove > > for (;;) { > char buffer[n]; > -char* j; > +int ret = posix_strerror_r(_saved_errno_, buffer + 8 + k, n > - 8 - k); > > -errno = 0; > -j = strerror_r(_saved_errno_, buffer + 8 + k, n - 8 - k); > -if (errno == 0) { > +if (ret == 0) { > char error[6 + 10 + 1]; /* for a 32bit value */ > > -if (j != buffer + 8 + k) > -memmove(buffer + 8 + k, j, strlen(j)+1); > - > memcpy(buffer, "MESSAGE=", 8); > > if (k > 0) { > @@ -377,8 +395,8 @@ static int fill_iovec_perror_and_send(const char > *message, int skip, struct iove > return sd_journal_sendv(iov, skip + 3); > } > > -if (errno != ERANGE) > -return -errno; > +if (ret != ERANGE) > +return -ret; > > n *= 2; > } > diff --git a/src/libsystemd/sd-bus/bus-error.c > b/src/libsystemd/sd-bus/bus-error.c > index c2e41fb..14bbaca 100644 > --- a/src/libsystemd/sd-bus/bus-error.c > +++ b/src/libsystemd/sd-bus/bus-error.c > @@ -291,6 +291,18 @@ _public_ int sd_bus_error_get_errno(const sd_bus_error* > e) { > return bus_error_name_to_errno(e->name); > } > > +#ifdef STRERROR_R_CHAR_P > +#define gnu_strerror_r strerror_r > +#else > +static char *gnu_strerror_r(int errnum, char *buf, size_t buflen) { > +int ret = strerror_r(errnum, buf, buflen); > + > +if (ret) > +errno = ret; > +return buf; > +} > +#endif > + > static void bus_error_strerror(sd_bus_error *e, int error) { > size_t k = 64; > char *m; > @@ -305,7 +317,7 @@ static void bus_error_strerror(sd_bus_error *e, int > error) { > return; > > errno = 0; > -x = strerror_r(error, m, k); > +x = gnu_strerror_r(error, m, k); > if (errno == ERANGE || strlen(x) >= k - 1) { > free(m); > k *= 2; > -- > 2.1.0 > > ___ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/systemd-devel > ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel
[systemd-devel] [RFC 22/25] support POSIX strerror_r returning int
--- configure.ac | 2 ++ src/journal/journal-send.c| 36 +++- src/libsystemd/sd-bus/bus-error.c | 14 +- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index 9cd4c05..3f17833 100644 --- a/configure.ac +++ b/configure.ac @@ -336,6 +336,8 @@ AC_CHECK_DECLS([IFLA_MACVLAN_FLAGS, #include ]]) +AC_FUNC_STRERROR_R + # This makes sure pkg.m4 is available. m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-config]) diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c index 9ca4a0b..62b40b2 100644 --- a/src/journal/journal-send.c +++ b/src/journal/journal-send.c @@ -341,6 +341,29 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) { return 0; } +#ifdef STRERROR_R_CHAR_P +static int posix_strerror_r(int errnum, char *buf, size_t buflen) { +char *res; + +errno = 0; +res = strerror_r(errnum, buf, buflen); +if (errno) +return errno; + +if (res != buf) { +size_t len = strlen(res)+1; + +if (len > buflen) +return ERANGE; + +memmove(buf, res, len); +} +return 0; +} +#else +#define posix_strerror_r strerror_r +#endif + static int fill_iovec_perror_and_send(const char *message, int skip, struct iovec iov[]) { PROTECT_ERRNO; size_t n, k; @@ -350,16 +373,11 @@ static int fill_iovec_perror_and_send(const char *message, int skip, struct iove for (;;) { char buffer[n]; -char* j; +int ret = posix_strerror_r(_saved_errno_, buffer + 8 + k, n - 8 - k); -errno = 0; -j = strerror_r(_saved_errno_, buffer + 8 + k, n - 8 - k); -if (errno == 0) { +if (ret == 0) { char error[6 + 10 + 1]; /* for a 32bit value */ -if (j != buffer + 8 + k) -memmove(buffer + 8 + k, j, strlen(j)+1); - memcpy(buffer, "MESSAGE=", 8); if (k > 0) { @@ -377,8 +395,8 @@ static int fill_iovec_perror_and_send(const char *message, int skip, struct iove return sd_journal_sendv(iov, skip + 3); } -if (errno != ERANGE) -return -errno; +if (ret != ERANGE) +return -ret; n *= 2; } diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c index c2e41fb..14bbaca 100644 --- a/src/libsystemd/sd-bus/bus-error.c +++ b/src/libsystemd/sd-bus/bus-error.c @@ -291,6 +291,18 @@ _public_ int sd_bus_error_get_errno(const sd_bus_error* e) { return bus_error_name_to_errno(e->name); } +#ifdef STRERROR_R_CHAR_P +#define gnu_strerror_r strerror_r +#else +static char *gnu_strerror_r(int errnum, char *buf, size_t buflen) { +int ret = strerror_r(errnum, buf, buflen); + +if (ret) +errno = ret; +return buf; +} +#endif + static void bus_error_strerror(sd_bus_error *e, int error) { size_t k = 64; char *m; @@ -305,7 +317,7 @@ static void bus_error_strerror(sd_bus_error *e, int error) { return; errno = 0; -x = strerror_r(error, m, k); +x = gnu_strerror_r(error, m, k); if (errno == ERANGE || strlen(x) >= k - 1) { free(m); k *= 2; -- 2.1.0 ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel