man/examples: use strerror() instead of %m
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 2 Apr 2024 18:40:05 +0000 (03:40 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 3 Apr 2024 08:58:35 +0000 (17:58 +0900)
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/logcontrol-example.c
man/print-unit-path-call-method.c
man/print-unit-path.c
man/sd_bus_error-example.c
man/sd_bus_service_reconnect.c
man/vtable-example.c

index bb0931970a66ecd367375746976251f094cd4d51..3d35b00178651449d10219a3887a0dd29e7cf54c 100644 (file)
@@ -11,8 +11,7 @@ int main(int argc, char *argv[]) {
 
   r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
   if (r < 0) {
-    errno = -r;
-    fprintf(stderr, "Failed to open journal: %m\n");
+    fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
     return 1;
   }
   SD_JOURNAL_FOREACH_FIELD(j, field)
index 381b50f9ceb0e1149a1acd72dbe3acd1a8aabb7f..9c0fa0eaf13258a65299afb06726bd5ddd509d52 100644 (file)
@@ -7,10 +7,10 @@
 int main(int argc, char *argv[]) {
   int r;
   sd_journal *j;
+
   r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
   if (r < 0) {
-    errno = -r;
-    fprintf(stderr, "Failed to open journal: %m\n");
+    fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
     return 1;
   }
   SD_JOURNAL_FOREACH(j) {
@@ -19,8 +19,7 @@ int main(int argc, char *argv[]) {
 
     r = sd_journal_get_data(j, "MESSAGE", (const void **)&d, &l);
     if (r < 0) {
-      errno = -r;
-      fprintf(stderr, "Failed to read message field: %m\n");
+      fprintf(stderr, "Failed to read message field: %s\n", strerror(-r));
       continue;
     }
 
index 5fe98b36b75d20571acd9e32164dd4a88f959d26..f44303d75cdfb99d2e61a0535af51cfd0b1e873d 100644 (file)
@@ -12,14 +12,12 @@ int main(int argc, char *argv[]) {
 
   r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
   if (r < 0) {
-    errno = -r;
-    fprintf(stderr, "Failed to open journal: %m\n");
+    fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
     return 1;
   }
   r = sd_journal_query_unique(j, "_SYSTEMD_UNIT");
   if (r < 0) {
-    errno = -r;
-    fprintf(stderr, "Failed to query journal: %m\n");
+    fprintf(stderr, "Failed to query journal: %s\n", strerror(-r));
     return 1;
   }
   SD_JOURNAL_FOREACH_UNIQUE(j, d, l)
index ac4b60b8e9bb9a4016e594186e519656ab7491ea..69d3cccb34af97c19b7365c97cee506d44b3e7ff 100644 (file)
@@ -7,39 +7,38 @@
 int main(int argc, char *argv[]) {
   int r;
   sd_journal *j;
+
   r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
   if (r < 0) {
-    errno = -r;
-    fprintf(stderr, "Failed to open journal: %m\n");
+    fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
     return 1;
   }
+
   for (;;)  {
     const void *d;
     size_t l;
     r = sd_journal_next(j);
     if (r < 0) {
-      errno = -r;
-      fprintf(stderr, "Failed to iterate to next entry: %m\n");
+      fprintf(stderr, "Failed to iterate to next entry: %s\n", strerror(-r));
       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) {
-        errno = -r;
-        fprintf(stderr, "Failed to wait for changes: %m\n");
+        fprintf(stderr, "Failed to wait for changes: %s\n", strerror(-r));
         break;
       }
       continue;
     }
     r = sd_journal_get_data(j, "MESSAGE", &d, &l);
     if (r < 0) {
-      errno = -r;
-      fprintf(stderr, "Failed to read message field: %m\n");
+      fprintf(stderr, "Failed to read message field: %s\n", strerror(-r));
       continue;
     }
     printf("%.*s\n", (int) l, (const char*) d);
   }
+
   sd_journal_close(j);
   return 0;
 }
index 8aad5ff8c66e0c3a733acdcf37f40797e22ba64b..c70d7986b2915ddb8d069aeae776fd4ffedc770b 100644 (file)
 int main(int argc, char *argv[]) {
   int fd;
   FILE *log;
+
   fd = sd_journal_stream_fd("test", LOG_INFO, 1);
   if (fd < 0) {
-    errno = -fd;
-    fprintf(stderr, "Failed to create stream fd: %m\n");
+    fprintf(stderr, "Failed to create stream fd: %s\n", strerror(-fd));
     return 1;
   }
+
   log = fdopen(fd, "w");
   if (!log) {
-    fprintf(stderr, "Failed to create file object: %m\n");
+    fprintf(stderr, "Failed to create file object: %s\n", strerror(errno));
     close(fd);
     return 1;
   }
index c199ec7a0f2b1c33d57924c63f785d4052aae238..8c45369fc3b39b77add379244675b64da8fc4957 100644 (file)
 
 #define _cleanup_(f) __attribute__((cleanup(f)))
 
-#define check(log_level, x) ({                  \
-  int _r = (x);                                 \
-  errno = _r < 0 ? -_r : 0;                     \
-  sd_journal_print((log_level), #x ": %m");     \
-  if (_r < 0)                                   \
-    return EXIT_FAILURE;                        \
-  })
+static int log_error(int log_level, int error, const char *str) {
+  sd_journal_print(log_level, "%s failed: %s", str, strerror(-error));
+  return error;
+}
 
 typedef enum LogTarget {
   LOG_TARGET_JOURNAL,
@@ -193,6 +190,7 @@ int main(int argc, char **argv) {
     .log_target = LOG_TARGET_JOURNAL,
     .syslog_identifier = "example",
   };
+  int r;
 
   /* https://man7.org/linux/man-pages/man3/setlogmask.3.html
    * Programs using syslog() instead of sd_journal can use this API to cut logs
@@ -203,37 +201,49 @@ int main(int argc, char **argv) {
   /* Acquire a connection to the bus, letting the library work out the details.
    * https://www.freedesktop.org/software/systemd/man/sd_bus_default.html
    */
-  check(o.log_level, sd_bus_default(&bus));
+  r = sd_bus_default(&bus);
+  if (r < 0)
+    return log_error(o.log_level, r, "sd_bus_default()");
 
   /* Publish an interface on the bus, specifying our well-known object access
    * path and public interface name.
    * https://www.freedesktop.org/software/systemd/man/sd_bus_add_object.html
    * https://dbus.freedesktop.org/doc/dbus-tutorial.html
    */
-  check(o.log_level, sd_bus_add_object_vtable(bus, NULL,
-                                              "/org/freedesktop/LogControl1",
-                                              "org.freedesktop.LogControl1",
-                                              vtable,
-                                              &o));
+  r = sd_bus_add_object_vtable(bus, NULL,
+                               "/org/freedesktop/LogControl1",
+                               "org.freedesktop.LogControl1",
+                               vtable,
+                               &o);
+  if (r < 0)
+    return log_error(o.log_level, r, "sd_bus_add_object_vtable()");
 
   /* By default the service is assigned an ephemeral name. Also add a fixed
    * one, so that clients know whom to call.
    * https://www.freedesktop.org/software/systemd/man/sd_bus_request_name.html
    */
-  check(o.log_level, sd_bus_request_name(bus, "org.freedesktop.Example", 0));
+  r = sd_bus_request_name(bus, "org.freedesktop.Example", 0);
+  if (r < 0)
+    return log_error(o.log_level, r, "sd_bus_request_name()");
 
   for (;;) {
     /* https://www.freedesktop.org/software/systemd/man/sd_bus_wait.html
      */
-    check(o.log_level, sd_bus_wait(bus, UINT64_MAX));
+    r = sd_bus_wait(bus, UINT64_MAX);
+    if (r < 0)
+      return log_error(o.log_level, r, "sd_bus_wait()");
     /* https://www.freedesktop.org/software/systemd/man/sd_bus_process.html
      */
-    check(o.log_level, sd_bus_process(bus, NULL));
+    r = sd_bus_process(bus, NULL);
+    if (r < 0)
+      return log_error(o.log_level, r, "sd_bus_process()");
   }
 
   /* https://www.freedesktop.org/software/systemd/man/sd_bus_release_name.html
    */
-  check(o.log_level, sd_bus_release_name(bus, "org.freedesktop.Example"));
+  r = sd_bus_release_name(bus, "org.freedesktop.Example");
+  if (r < 0)
+    return log_error(o.log_level, r, "sd_bus_release_name()");
 
   return 0;
 }
index f73dd073f9871a60ccee5c2d40c1698e08a6f269..15e8d3f51b29ca832b718b6636b26ce3da4f8421 100644 (file)
@@ -21,8 +21,7 @@
 #define MEMBER      "GetUnitByPID"
 
 static int log_error(int error, const char *message) {
-  errno = -error;
-  fprintf(stderr, "%s: %m\n", message);
+  fprintf(stderr, "%s: %s\n", message, strerror(-error));
   return error;
 }
 
index 0b89318736aeb5060235d5100be2fd062ac6f726..737244feb0d4841e2abd73da9bb93946baa4dde5 100644 (file)
@@ -21,8 +21,7 @@
 #define MEMBER      "GetUnitByPID"
 
 static int log_error(int error, const char *message) {
-  errno = -error;
-  fprintf(stderr, "%s: %m\n", message);
+  fprintf(stderr, "%s: %s\n", message, strerror(-error));
   return error;
 }
 
index 9b162eb6cc355eada1368c1e821878a8355255e5..0f70a629f314e782e1cc8255c6eaa6a2e1befe7f 100644 (file)
@@ -14,5 +14,5 @@ int writer_with_negative_errno_return(int fd, sd_bus_error *error) {
 
   /* On error, initialize the error structure, and also propagate the errno
    * value that write(2) set for us. */
-  return sd_bus_error_set_errnof(error, errno, "Failed to write to fd %i: %m", fd);
+  return sd_bus_error_set_errnof(error, errno, "Failed to write to fd %i: %s", fd, strerror(errno));
 }
index c0818689f29be9d754dbe3091c0856d47e592f16..fc7c3b1a724a29924350f2882f5f20512151e6c6 100644 (file)
 
 #define _cleanup_(f) __attribute__((cleanup(f)))
 
-#define check(x) ({                             \
-  int _r = (x);                                 \
-  errno = _r < 0 ? -_r : 0;                     \
-  printf(#x ": %m\n");                          \
-  if (_r < 0)                                   \
-    return EXIT_FAILURE;                        \
-  })
+static int log_error(int r, const char *str) {
+  fprintf(stderr, "%s failed: %s\n", str, strerror(-r));
+  return r;
+}
 
 typedef struct object {
   const char *example;
@@ -90,13 +87,24 @@ static const sd_bus_vtable vtable[] = {
 static int setup(object *o);
 
 static int on_disconnect(sd_bus_message *message, void *userdata, sd_bus_error *ret_error) {
-  check(setup((object *)userdata));
-  return 0;
+  int r;
+
+  r = setup((object *)userdata);
+  if (r < 0) {
+    object *o = userdata;
+    r = sd_event_exit(*o->event, r);
+    if (r < 0)
+      return log_error(r, "sd_event_exit()");
+  }
+
+  return 1;
 }
 
 /* Ensure the event loop exits with a clear error if acquiring the well-known
  * service name fails */
 static int request_name_callback(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
+  int r;
+
   if (!sd_bus_message_is_method_error(m, NULL))
     return 1;
 
@@ -105,21 +113,27 @@ static int request_name_callback(sd_bus_message *m, void *userdata, sd_bus_error
   if (sd_bus_error_has_names(error, SD_BUS_ERROR_TIMEOUT, SD_BUS_ERROR_NO_REPLY))
     return 1; /* The bus is not available, try again later */
 
-  printf("Failed to request name: %s\n", error->message);
+  fprintf(stderr, "Failed to request name: %s\n", error->message);
   object *o = userdata;
-  check(sd_event_exit(*o->event, -sd_bus_error_get_errno(error)));
+  r = sd_event_exit(*o->event, -sd_bus_error_get_errno(error));
+  if (r < 0)
+    return log_error(r, "sd_event_exit()");
 
   return 1;
 }
 
 static int setup(object *o) {
+  int r;
+
   /* If we are reconnecting, then the bus object needs to be closed, detached
    * from the event loop and recreated.
    * https://www.freedesktop.org/software/systemd/man/sd_bus_detach_event.html
    * https://www.freedesktop.org/software/systemd/man/sd_bus_close_unref.html
    */
   if (*o->bus) {
-    check(sd_bus_detach_event(*o->bus));
+    r = sd_bus_detach_event(*o->bus);
+    if (r < 0)
+      return log_error(r, "sd_bus_detach_event()");
     *o->bus = sd_bus_close_unref(*o->bus);
   }
 
@@ -135,55 +149,75 @@ static int setup(object *o) {
    * https://www.freedesktop.org/software/systemd/man/sd_bus_set_connected_signal.html
    * https://www.freedesktop.org/software/systemd/man/sd_bus_start.html
    */
-  check(sd_bus_new(o->bus));
-  check(sd_bus_set_address(*o->bus, "unix:path=/run/dbus/system_bus_socket"));
-  check(sd_bus_set_bus_client(*o->bus, 1));
-  check(sd_bus_negotiate_creds(*o->bus, 1, SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_EFFECTIVE_CAPS));
-  check(sd_bus_set_watch_bind(*o->bus, 1));
-  check(sd_bus_start(*o->bus));
+  r = sd_bus_new(o->bus);
+  if (r < 0)
+    return log_error(r, "sd_bus_new()");
+  r = sd_bus_set_address(*o->bus, "unix:path=/run/dbus/system_bus_socket");
+  if (r < 0)
+    return log_error(r, "sd_bus_set_address()");
+  r = sd_bus_set_bus_client(*o->bus, 1);
+  if (r < 0)
+    return log_error(r, "sd_bus_set_bus_client()");
+  r = sd_bus_negotiate_creds(*o->bus, 1, SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_EFFECTIVE_CAPS);
+  if (r < 0)
+    return log_error(r, "sd_bus_negotiate_creds()");
+  r = sd_bus_set_watch_bind(*o->bus, 1);
+  if (r < 0)
+    return log_error(r, "sd_bus_set_watch_bind()");
+  r = sd_bus_start(*o->bus);
+  if (r < 0)
+    return log_error(r, "sd_bus_start()");
 
   /* Publish an interface on the bus, specifying our well-known object access
    * path and public interface name.
    * https://www.freedesktop.org/software/systemd/man/sd_bus_add_object.html
    * https://dbus.freedesktop.org/doc/dbus-tutorial.html
    */
-  check(sd_bus_add_object_vtable(*o->bus,
-                                 NULL,
-                                 "/org/freedesktop/ReconnectExample",
-                                 "org.freedesktop.ReconnectExample",
-                                 vtable,
-                                 o));
+  r = sd_bus_add_object_vtable(*o->bus,
+                               NULL,
+                               "/org/freedesktop/ReconnectExample",
+                               "org.freedesktop.ReconnectExample",
+                               vtable,
+                               o);
+  if (r < 0)
+    return log_error(r, "sd_bus_add_object_vtable()");
   /* By default the service is only assigned an ephemeral name. Also add a
    * well-known one, so that clients know whom to call. This needs to be
    * asynchronous, as D-Bus might not be yet available. The callback will check
    * whether the error is expected or not, in case it fails.
    * https://www.freedesktop.org/software/systemd/man/sd_bus_request_name.html
    */
-  check(sd_bus_request_name_async(*o->bus,
-                                  NULL,
-                                  "org.freedesktop.ReconnectExample",
-                                  0,
-                                  request_name_callback,
-                                  o));
+  r = sd_bus_request_name_async(*o->bus,
+                                NULL,
+                                "org.freedesktop.ReconnectExample",
+                                0,
+                                request_name_callback,
+                                o);
+  if (r < 0)
+    return log_error(r, "sd_bus_request_name_async()");
   /* When D-Bus is disconnected this callback will be invoked, which will set up
    * the connection again. This needs to be asynchronous, as D-Bus might not yet
    * be available.
    * https://www.freedesktop.org/software/systemd/man/sd_bus_match_signal_async.html
    */
-  check(sd_bus_match_signal_async(*o->bus,
-                                  NULL,
-                                  "org.freedesktop.DBus.Local",
-                                  NULL,
-                                  "org.freedesktop.DBus.Local",
-                                  "Disconnected",
-                                  on_disconnect,
-                                  NULL,
-                                  o));
+  r = sd_bus_match_signal_async(*o->bus,
+                                NULL,
+                                "org.freedesktop.DBus.Local",
+                                NULL,
+                                "org.freedesktop.DBus.Local",
+                                "Disconnected",
+                                on_disconnect,
+                                NULL,
+                                o);
+  if (r < 0)
+    return log_error(r, "sd_bus_match_signal_async()");
   /* Attach the bus object to the event loop so that calls and signals are
    * processed.
    * https://www.freedesktop.org/software/systemd/man/sd_bus_attach_event.html
    */
-  check(sd_bus_attach_event(*o->bus, *o->event, 0));
+  r = sd_bus_attach_event(*o->bus, *o->event, 0);
+  if (r < 0)
+    return log_error(r, "sd_bus_attach_event()");
 
   return 0;
 }
@@ -199,28 +233,42 @@ int main(int argc, char **argv) {
     .bus = &bus,
     .event = &event,
   };
+  int r;
 
   /* Create an event loop data structure, with default parameters.
    * https://www.freedesktop.org/software/systemd/man/sd_event_default.html
    */
-  check(sd_event_default(&event));
+  r = sd_event_default(&event);
+  if (r < 0)
+    return log_error(r, "sd_event_default()");
 
   /* By default the event loop will terminate when all sources have disappeared,
    * so we have to keep it 'occupied'. Register signal handling to do so.
    * https://www.freedesktop.org/software/systemd/man/sd_event_add_signal.html
    */
-  check(sd_event_add_signal(event, NULL, SIGINT|SD_EVENT_SIGNAL_PROCMASK, NULL, NULL));
-  check(sd_event_add_signal(event, NULL, SIGTERM|SD_EVENT_SIGNAL_PROCMASK, NULL, NULL));
+  r = sd_event_add_signal(event, NULL, SIGINT|SD_EVENT_SIGNAL_PROCMASK, NULL, NULL);
+  if (r < 0)
+    return log_error(r, "sd_event_add_signal(SIGINT)");
+
+  r = sd_event_add_signal(event, NULL, SIGTERM|SD_EVENT_SIGNAL_PROCMASK, NULL, NULL);
+  if (r < 0)
+    return log_error(r, "sd_event_add_signal(SIGTERM)");
 
-  check(setup(&o));
+  r = setup(&o);
+  if (r < 0)
+    return EXIT_FAILURE;
 
   /* Enter the main loop, it will exit only on sigint/sigterm.
    * https://www.freedesktop.org/software/systemd/man/sd_event_loop.html
    */
-  check(sd_event_loop(event));
+  r = sd_event_loop(event);
+  if (r < 0)
+    return log_error(r, "sd_event_loop()");
 
   /* https://www.freedesktop.org/software/systemd/man/sd_bus_release_name.html */
-  check(sd_bus_release_name(bus, "org.freedesktop.ReconnectExample"));
+  r = sd_bus_release_name(bus, "org.freedesktop.ReconnectExample");
+  if (r < 0)
+    return log_error(r, "sd_bus_release_name()");
 
   return 0;
 }
index e3346a80211432557c6824a0a0b4c1ddc7308489..417ee0ccf13a17fa5d51b4a4f8f97c5409cade76 100644 (file)
@@ -9,20 +9,14 @@
 
 #define _cleanup_(f) __attribute__((cleanup(f)))
 
-#define check(x) ({                             \
-  int r = (x);                                  \
-  errno = r < 0 ? -r : 0;                       \
-  printf(#x ": %m\n");                          \
-  if (r < 0)                                    \
-    return EXIT_FAILURE;                        \
-  })
-
 typedef struct object {
   char *name;
   uint32_t number;
 } object;
 
 static int method(sd_bus_message *m, void *userdata, sd_bus_error *error) {
+  int r;
+
   printf("Got called with userdata=%p\n", userdata);
 
   if (sd_bus_message_is_method_call(m,
@@ -31,8 +25,17 @@ static int method(sd_bus_message *m, void *userdata, sd_bus_error *error) {
     return 1;
 
   const char *string;
-  check(sd_bus_message_read(m, "s", &string));
-  check(sd_bus_reply_method_return(m, "s", string));
+  r = sd_bus_message_read(m, "s", &string);
+  if (r < 0) {
+    fprintf(stderr, "sd_bus_message_read() failed: %s\n", strerror(-r));
+    return 0;
+  }
+
+  r = sd_bus_reply_method_return(m, "s", string);
+  if (r < 0) {
+    fprintf(stderr, "sd_bus_reply_method_return() failed: %s\n", strerror(-r));
+    return 0;
+  }
 
   return 1;
 }
@@ -84,28 +87,55 @@ static const sd_bus_vtable vtable[] = {
 
 int main(int argc, char **argv) {
   _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+  int r;
 
   sd_bus_default(&bus);
 
   object object = { .number = 666 };
-  check((object.name = strdup("name")) != NULL);
+  object.name = strdup("name");
+  if (!object.name) {
+    fprintf(stderr, "OOM\n");
+    return EXIT_FAILURE;
+  }
 
-  check(sd_bus_add_object_vtable(bus, NULL,
-                                 "/org/freedesktop/systemd/VtableExample",
-                                 "org.freedesktop.systemd.VtableExample",
-                                 vtable,
-                                 &object));
+  r = sd_bus_add_object_vtable(bus, NULL,
+                               "/org/freedesktop/systemd/VtableExample",
+                               "org.freedesktop.systemd.VtableExample",
+                               vtable,
+                               &object);
+  if (r < 0) {
+    fprintf(stderr, "sd_bus_add_object_vtable() failed: %s\n", strerror(-r));
+    return EXIT_FAILURE;
+  }
 
-  check(sd_bus_request_name(bus,
-                            "org.freedesktop.systemd.VtableExample",
-                            0));
+  r = sd_bus_request_name(bus,
+                          "org.freedesktop.systemd.VtableExample",
+                          0);
+  if (r < 0) {
+    fprintf(stderr, "sd_bus_request_name() failed: %s\n", strerror(-r));
+    return EXIT_FAILURE;
+  }
 
   for (;;) {
-    check(sd_bus_wait(bus, UINT64_MAX));
-    check(sd_bus_process(bus, NULL));
+    r = sd_bus_wait(bus, UINT64_MAX);
+    if (r < 0) {
+      fprintf(stderr, "sd_bus_wait() failed: %s\n", strerror(-r));
+      return EXIT_FAILURE;
+    }
+
+    r = sd_bus_process(bus, NULL);
+    if (r < 0) {
+      fprintf(stderr, "sd_bus_process() failed: %s\n", strerror(-r));
+      return EXIT_FAILURE;
+    }
+  }
+
+  r = sd_bus_release_name(bus, "org.freedesktop.systemd.VtableExample");
+  if (r < 0) {
+    fprintf(stderr, "sd_bus_release_name() failed: %s\n", strerror(-r));
+    return EXIT_FAILURE;
   }
 
-  check(sd_bus_release_name(bus, "org.freedesktop.systemd.VtableExample"));
   free(object.name);
 
   return 0;