]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
man: recommend %m over strerror()
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 7 Oct 2022 14:19:21 +0000 (16:19 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 11 Oct 2022 14:59:00 +0000 (16:59 +0200)
The need to set errno is very very ugly, but at least it is thread-safe and
works correctly. Using strerror() is likely to be wrong, so let's not recommend
that. People who do a lot of logging would provide use some wrapper that sets
errno like we do, so nudge people towards %m.

I tested that all the separate .c files compile cleanly.

man/journal-enumerate-fields.c
man/journal-iterate-foreach.c
man/journal-iterate-unique.c
man/journal-iterate-wait.c
man/journal-stream-fd.c
man/print-unit-path.c
man/sd_bus_new.xml
man/sd_device_ref.xml
man/sd_event_new.xml
man/sd_login_monitor_new.xml

index 8a357854400bb78042f2735140986fd789a0e08e..f4b6b7b0785812afca2573f59d6e2d81c3420571 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: CC0-1.0 */
 
+#include <errno.h>
 #include <stdio.h>
-#include <string.h>
 #include <systemd/sd-journal.h>
 
 int main(int argc, char *argv[]) {
@@ -11,7 +11,8 @@ int main(int argc, char *argv[]) {
 
   r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
   if (r < 0) {
-    fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
+    errno = -r;
+    fprintf(stderr, "Failed to open journal: %m\n");
     return 1;
   }
   SD_JOURNAL_FOREACH_FIELD(j, field)
index ae53d467edd08e95bd91a4e9711841f0b2659e6f..363101d5ba1e2922060f0b9acda9266d9a921c12 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: CC0-1.0 */
 
+#include <errno.h>
 #include <stdio.h>
-#include <string.h>
 #include <systemd/sd-journal.h>
 
 int main(int argc, char *argv[]) {
@@ -9,7 +9,8 @@ int main(int argc, char *argv[]) {
   sd_journal *j;
   r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
   if (r < 0) {
-    fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
+    errno = -r;
+    fprintf(stderr, "Failed to open journal: %m\n");
     return 1;
   }
   SD_JOURNAL_FOREACH(j) {
@@ -18,7 +19,8 @@ int main(int argc, char *argv[]) {
 
     r = sd_journal_get_data(j, "MESSAGE", (const void **)&d, &l);
     if (r < 0) {
-      fprintf(stderr, "Failed to read message field: %s\n", strerror(-r));
+      errno = -r;
+      fprintf(stderr, "Failed to read message field: %m\n");
       continue;
     }
 
index e9f273c6e505ffd0088af6487e24e8e05878355a..ac0c638032f29089c5b796db4405d80953da8eac 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: CC0-1.0 */
 
+#include <errno.h>
 #include <stdio.h>
-#include <string.h>
 #include <systemd/sd-journal.h>
 
 int main(int argc, char *argv[]) {
@@ -12,12 +12,14 @@ int main(int argc, char *argv[]) {
 
   r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
   if (r < 0) {
-    fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
+    errno = -r;
+    fprintf(stderr, "Failed to open journal: %m\n");
     return 1;
   }
   r = sd_journal_query_unique(j, "_SYSTEMD_UNIT");
   if (r < 0) {
-    fprintf(stderr, "Failed to query journal: %s\n", strerror(-r));
+    errno = -r;
+    fprintf(stderr, "Failed to query journal: %m\n");
     return 1;
   }
   SD_JOURNAL_FOREACH_UNIQUE(j, d, l)
index 2b6d8a0fa8301d97af8a98ce86a88759f33b7612..60b3459a18ca5760695aa46f11c94989c652ad41 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: CC0-1.0 */
 
+#include <errno.h>
 #include <stdio.h>
-#include <string.h>
 #include <systemd/sd-journal.h>
 
 int main(int argc, char *argv[]) {
@@ -9,7 +9,8 @@ int main(int argc, char *argv[]) {
   sd_journal *j;
   r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
   if (r < 0) {
-    fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
+    errno = -r;
+    fprintf(stderr, "Failed to open journal: %m\n");
     return 1;
   }
   for (;;)  {
@@ -17,21 +18,24 @@ int main(int argc, char *argv[]) {
     size_t l;
     r = sd_journal_next(j);
     if (r < 0) {
-      fprintf(stderr, "Failed to iterate to next entry: %s\n", strerror(-r));
+      errno = -r;
+      fprintf(stderr, "Failed to iterate to next entry: %m\n");
       break;
     }
     if (r == 0) {
       /* Reached the end, let's wait for changes, and try again */
       r = sd_journal_wait(j, (uint64_t) -1);
       if (r < 0) {
-        fprintf(stderr, "Failed to wait for changes: %s\n", strerror(-r));
+        errno = -r;
+        fprintf(stderr, "Failed to wait for changes: %m\n");
         break;
       }
       continue;
     }
     r = sd_journal_get_data(j, "MESSAGE", &d, &l);
     if (r < 0) {
-      fprintf(stderr, "Failed to read message field: %s\n", strerror(-r));
+      errno = -r;
+      fprintf(stderr, "Failed to read message field: %m\n");
       continue;
     }
     printf("%.*s\n", (int) l, (const char*) d);
index 6bc5582189299f5c4f01289c57ebf55c1c506a36..d59aa14c13b174ac6f2289d81f9e4bf804316a23 100644 (file)
@@ -1,8 +1,8 @@
 /* SPDX-License-Identifier: CC0-1.0 */
 
+#include <errno.h>
 #include <syslog.h>
 #include <stdio.h>
-#include <string.h>
 #include <unistd.h>
 #include <systemd/sd-journal.h>
 #include <systemd/sd-daemon.h>
@@ -12,7 +12,8 @@ int main(int argc, char *argv[]) {
   FILE *log;
   fd = sd_journal_stream_fd("test", LOG_INFO, 1);
   if (fd < 0) {
-    fprintf(stderr, "Failed to create stream fd: %s\n", strerror(-fd));
+    errno = -fd;
+    fprintf(stderr, "Failed to create stream fd: %m\n");
     return 1;
   }
   log = fdopen(fd, "w");
index 41a21aab5274c51d18d61c6a18522571ca64c7b8..ff52fd28cd25040b8f51a0d029adca067dc7de82 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: CC0-1.0 */
 
+#include <errno.h>
 #include <stdio.h>
-#include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
 
@@ -21,7 +21,8 @@
 #define MEMBER      "GetUnitByPID"
 
 static int log_error(int error, const char *message) {
-  fprintf(stderr, "%s: %s\n", message, strerror(-error));
+  errno = -error;
+  fprintf(stderr, "%s: %m\n", message);
   return error;
 }
 
index 41964640b6673caa8b9783a9e7d555e42d83ba33..b45106168c58a974e1fe9487bdb63ddf7aa45040 100644 (file)
   int r;
   …
   r = sd_bus_default(&amp;bus);
-  if (r &lt; 0)
-    fprintf(stderr, "Failed to allocate bus: %s\n", strerror(-r));
+  if (r &lt; 0) {
+    errno = -r;
+    fprintf(stderr, "Failed to allocate bus: %m\n");
+  }
   …
 }</programlisting>
 
index c2ba6b15711c943f07f8d91265de9e69ed61e320..2b8512a57288e31c9f3228f482c5787804a5f52d 100644 (file)
   int r;
   …
   r = sd_device_new_from_syspath(&amp;device, "…");
-  if (r &lt; 0)
-    fprintf(stderr, "Failed to allocate device: %s\n", strerror(-r));
+  if (r &lt; 0) {
+    errno = -r;
+    fprintf(stderr, "Failed to allocate device: %m\n");
+  }
   …
 }</programlisting>
 
index 352137ec098fe8236fb20a111fa48bfac1b48b81..8a105a764b7119585b5ec872e614060fdc9fa3eb 100644 (file)
         int r;
         …
         r = sd_event_default(&amp;event);
-        if (r &lt; 0)
-                fprintf(stderr, "Failed to allocate event loop: %s\n", strerror(-r));
+        if (r &lt; 0) {
+          errno = -r;
+          fprintf(stderr, "Failed to allocate event loop: %m\n");
+        }
         …
 }</programlisting>
 
index 081796249d0a3680751ef9515f280e6b8f6f6270..8118121281c391c29c9a6edcb419cc6dd5a1cf0c 100644 (file)
   int r;
   …
   r = sd_login_monitor_new(NULL, &amp;m);
-  if (r &lt; 0)
-    fprintf(stderr, "Failed to allocate login monitor object: %s\n", strerror(-r));
+  if (r &lt; 0) {
+    errno = -r;
+    fprintf(stderr, "Failed to allocate login monitor object: %m\n");
+  }
   …
 }</programlisting>