Re: [systemd-devel] [RFC 22/25] support POSIX strerror_r returning int

2014-10-24 Thread Lennart Poettering
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

2014-10-05 Thread Zbigniew Jędrzejewski-Szmek
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

2014-09-18 Thread Emil Renner Berthing
---
 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