poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/3] Take error as an argument rather than having it as return va


From: Egeyar Bagcioglu
Subject: [PATCH 1/3] Take error as an argument rather than having it as return value.
Date: Wed, 24 Feb 2021 23:03:32 +0100

2021-02-24  Egeyar Bagcioglu  <egeyar@gmail.com>

        * libpoke/ios-dev-file.c (ios_dev_file_handler_normalize): Take error
        as an argument rather than having it as return value.
        (ios_dev_file_open): Likewise.
        * libpoke/ios-dev-mem.c (ios_dev_mem_handler_normalize): Likewise.
        (ios_dev_mem_open): Likewise.
        * libpoke/ios-dev-nbd.c (ios_dev_nbd_handler_normalize): Likewise.
        (ios_dev_nbd_open): Likewise.
        * libpoke/ios-dev-stream.c (ios_dev_stream_handler_normalize):
        Likewise.
        (ios_dev_stream_open): Likewise.
        * libpoke/ios-dev.h (handler_normalize): Likewise.
        (open): Likewise.
        (IOS_FILE_HANDLER_NORMALIZE): Rename newhandler as new_handler.
        * ios.c (ios_open): Adjust calls to handler_normalize and open.
---
 ChangeLog                | 17 ++++++++++++
 libpoke/ios-dev-file.c   | 56 ++++++++++++++++++++++++++--------------
 libpoke/ios-dev-mem.c    | 40 ++++++++++++++++++----------
 libpoke/ios-dev-nbd.c    | 39 ++++++++++++++++------------
 libpoke/ios-dev-stream.c | 46 +++++++++++++++++++--------------
 libpoke/ios-dev.h        | 27 ++++++++++---------
 libpoke/ios.c            |  8 +++---
 7 files changed, 144 insertions(+), 89 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 93edebbf..ea3091c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2021-02-24  Egeyar Bagcioglu  <egeyar@gmail.com>
+
+       * libpoke/ios-dev-file.c (ios_dev_file_handler_normalize): Take error
+       as an argument rather than having it as return value.
+       (ios_dev_file_open): Likewise.
+       * libpoke/ios-dev-mem.c (ios_dev_mem_handler_normalize): Likewise.
+       (ios_dev_mem_open): Likewise.
+       * libpoke/ios-dev-nbd.c (ios_dev_nbd_handler_normalize): Likewise.
+       (ios_dev_nbd_open): Likewise.
+       * libpoke/ios-dev-stream.c (ios_dev_stream_handler_normalize):
+       Likewise.
+       (ios_dev_stream_open): Likewise.
+       * libpoke/ios-dev.h (handler_normalize): Likewise.
+       (open): Likewise.
+       (IOS_FILE_HANDLER_NORMALIZE): Rename newhandler as new_handler.
+       * ios.c (ios_open): Adjust calls to handler_normalize and open.
+
 2021-02-24  Egeyar  Bagcioglu  <egeyar@gmail.com>
 
        * libpoke/ios-dev-stream.c (ios_dev_stream_pread): Change internal
diff --git a/libpoke/ios-dev-file.c b/libpoke/ios-dev-file.c
index 35284541..5584ed37 100644
--- a/libpoke/ios-dev-file.c
+++ b/libpoke/ios-dev-file.c
@@ -46,23 +46,29 @@ ios_dev_file_get_if_name () {
   return "FILE";
 }
 
-static int
-ios_dev_file_handler_normalize (const char *handler, uint64_t flags, char 
**newhandler)
+static char *
+ios_dev_file_handler_normalize (const char *handler, uint64_t flags, int* 
error)
 {
-  IOS_FILE_HANDLER_NORMALIZE (handler, *newhandler);
+  char *new_handler = NULL;
+  IOS_FILE_HANDLER_NORMALIZE (handler, new_handler);
 
-  /* Every handler is accepted as a file handler.  */
-  if (*newhandler == NULL)
-    return IOD_ENOMEM;
-  else
-    return IOD_OK;
+  if (error)
+    {
+      if (new_handler == NULL)
+        *error = IOD_ENOMEM;
+      else
+        *error = IOD_OK;
+    }
+
+  return new_handler;
 }
 
-static int
-ios_dev_file_open (const char *handler, uint64_t flags, void **dev)
+static void *
+ios_dev_file_open (const char *handler, uint64_t flags, int *error)
 {
   struct ios_dev_file *fio = NULL;
   FILE *f;
+  int internal_error = IOD_ERROR;
   const char *mode;
   uint8_t flags_mode = flags & IOS_FLAGS_MODE;
 
@@ -78,7 +84,10 @@ ios_dev_file_open (const char *handler, uint64_t flags, void 
**dev)
       else if (flags_mode == (IOS_F_WRITE | IOS_F_CREATE | IOS_F_TRUNCATE))
         mode = "w+b";
       else
-          return IOD_EFLAGS;
+        {
+          internal_error = IOD_EFLAGS;
+          goto err;
+        }
 
       f = fopen (handler, mode);
     }
@@ -109,8 +118,9 @@ ios_dev_file_open (const char *handler, uint64_t flags, 
void **dev)
   fio->file = f;
   fio->flags = flags;
 
-  *dev = fio;
-  return IOD_OK;
+  if (error)
+    *error = IOD_OK;
+  return fio;
 
 err:
   if (fio)
@@ -120,13 +130,19 @@ err:
   if (f)
     fclose (f);
 
-  if (errno == ENOMEM)
-    return IOD_ENOMEM;
-  else if (errno == EINVAL)
-    return IOD_EINVAL;
-  /* Should never happen.  */
-  else
-    return IOD_ERROR;
+  if (error)
+    {
+      if (internal_error != IOD_ERROR)
+        *error = internal_error;
+      else if (errno == ENOMEM)
+        *error = IOD_ENOMEM;
+      else if (errno == EINVAL)
+        *error = IOD_EINVAL;
+      /* Should never happen.  */
+      else
+        *error = IOD_ERROR;
+    }
+  return NULL;
 }
 
 static int
diff --git a/libpoke/ios-dev-mem.c b/libpoke/ios-dev-mem.c
index 4263ca9b..9d853bda 100644
--- a/libpoke/ios-dev-mem.c
+++ b/libpoke/ios-dev-mem.c
@@ -40,38 +40,52 @@ ios_dev_mem_get_if_name () {
   return "MEMORY";
 }
 
-static int
-ios_dev_mem_handler_normalize (const char *handler, uint64_t flags, char 
**newhandler)
+static char *
+ios_dev_mem_handler_normalize (const char *handler, uint64_t flags, int *error)
 {
+  char *new_handler = NULL;
   if (handler[0] == '*' && handler[strlen (handler) - 1] == '*')
     {
-      *newhandler = strdup (handler);
-      if (*newhandler == NULL)
-        return IOD_ENOMEM;
+      new_handler = strdup (handler);
+      if (new_handler == NULL && error)
+        *error = IOD_ENOMEM;
     }
-  return IOD_OK;
+  if (error)
+    *error = IOD_OK;
+  return new_handler;
 }
 
-static int
-ios_dev_mem_open (const char *handler, uint64_t flags, void **dev)
+static void *
+ios_dev_mem_open (const char *handler, uint64_t flags, int *error)
 {
+  int internal_error = IOD_ERROR;
   struct ios_dev_mem *mio = malloc (sizeof (struct ios_dev_mem));
 
   if (!mio)
-    return IOD_ENOMEM;
+    {
+      internal_error = IOD_ENOMEM;
+      goto err;
+    }
 
   mio->pointer = calloc (MEM_STEP, 1);
   if (!mio->pointer)
     {
-      free (mio);
-      return IOD_ENOMEM;
+      internal_error = IOD_ENOMEM;
+      goto err;
     }
 
   mio->size = MEM_STEP;
   mio->flags = flags;
 
-  *dev = mio;
-  return IOD_OK;
+  if (error)
+    *error = IOD_OK;
+  return mio;
+
+err:
+  free (mio);
+  if (error)
+    *error = internal_error;
+  return NULL;
 }
 
 static int
diff --git a/libpoke/ios-dev-nbd.c b/libpoke/ios-dev-nbd.c
index 7d89b763..2ff65c39 100644
--- a/libpoke/ios-dev-nbd.c
+++ b/libpoke/ios-dev-nbd.c
@@ -49,32 +49,35 @@ ios_dev_nbd_get_if_name () {
   return "NBD";
 }
 
-static int
-ios_dev_nbd_handler_normalize (const char *handler, uint64_t flags, char 
**newhandler)
+static char *
+ios_dev_nbd_handler_normalize (const char *handler, uint64_t flags, int* error)
 {
+  char * new_handler = NULL;
   if (startswith (handler, "nbd://")
       || startswith (handler, "nbd+unix://"))
     {
-      *newhandler = strdup (handler);
-      if (*newhandler == NULL)
-        return IOD_ENOMEM;
+      new_handler = strdup (handler);
+      if (new_handler == NULL && error)
+        *error = IOD_ENOMEM;
     }
-  return IOD_OK;
+  if (error)
+    *error = IOD_OK;
+  return new_handler;
 }
 
-static int
-ios_dev_nbd_open (const char *handler, uint64_t flags, void **dev)
+static void *
+ios_dev_nbd_open (const char *handler, uint64_t flags, int *error)
 {
   struct ios_dev_nbd *nio = NULL;
   struct nbd_handle *nbd = NULL;
   uint8_t flags_mode = flags & IOS_FLAGS_MODE;
-  int err = IOD_ERROR;
+  int internal_error = IOD_ERROR;
   int64_t size;
 
   /* We don't permit truncation.  */
   if (flags_mode & IOS_F_TRUNCATE)
     {
-      err = IOD_EFLAGS;
+      internal_error = IOD_EFLAGS;
       goto err;
     }
 
@@ -88,7 +91,7 @@ ios_dev_nbd_open (const char *handler, uint64_t flags, void 
**dev)
 
   if (flags_mode & IOS_F_WRITE && nbd_is_read_only (nbd))
     {
-      err = IOD_EINVAL;
+      internal_error = IOD_EINVAL;
       goto err;
     }
   else if (flags_mode == 0)
@@ -105,14 +108,14 @@ ios_dev_nbd_open (const char *handler, uint64_t flags, 
void **dev)
   nio = malloc (sizeof *nio);
   if (!nio)
     {
-      err = IOD_ENOMEM;
+      internal_error = IOD_ENOMEM;
       goto err;
     }
 
   nio->uri = strdup (handler);
   if (!nio->uri)
     {
-      err = IOD_ENOMEM;
+      internal_error = IOD_ENOMEM;
       goto err;
     }
 
@@ -120,8 +123,9 @@ ios_dev_nbd_open (const char *handler, uint64_t flags, void 
**dev)
   nio->size = size;
   nio->flags = flags;
 
-  *dev = nio;
-  return IOD_OK;
+  if (error)
+    *error = IOD_OK;
+  return nio;
 
  err:
   /* Worth logging nbd_get_error ()?  */
@@ -130,8 +134,9 @@ ios_dev_nbd_open (const char *handler, uint64_t flags, void 
**dev)
   free (nio);
 
   nbd_close (nbd);
-
-  return err;
+  if (error)
+    *error = internal_error;
+  return NULL;
 }
 
 static int
diff --git a/libpoke/ios-dev-stream.c b/libpoke/ios-dev-stream.c
index 81f0489a..5184c388 100644
--- a/libpoke/ios-dev-stream.c
+++ b/libpoke/ios-dev-stream.c
@@ -51,39 +51,42 @@ ios_dev_stream_get_dev_if_name () {
   return "STREAM";
 }
 
-static int
-ios_dev_stream_handler_normalize (const char *handler, uint64_t flags, char 
**newhandler)
+static char *
+ios_dev_stream_handler_normalize (const char *handler, uint64_t flags, int 
*error)
 {
+  char *new_handler = NULL;
   /* TODO handle the case where strdup fails. */
   if (STREQ (handler, IOS_STDIN_HANDLER)
       || STREQ (handler, IOS_STDOUT_HANDLER)
       || STREQ (handler, IOS_STDERR_HANDLER))
     {
-      *newhandler = strdup (handler);
-      if (*newhandler == NULL)
-        return IOD_ENOMEM;
+      new_handler = strdup (handler);
+      if (new_handler == NULL && error)
+        *error = IOD_ENOMEM;
     }
-  return IOD_OK;
+  if (error)
+    *error = IOD_OK;
+  return new_handler;
 }
 
-static int
-ios_dev_stream_open (const char *handler, uint64_t flags, void **dev)
+static void *
+ios_dev_stream_open (const char *handler, uint64_t flags, int *error)
 {
   struct ios_dev_stream *sio;
-  int error = IOD_ERROR;
+  int internal_error = IOD_ERROR;
 
   sio = malloc (sizeof (struct ios_dev_stream));
   if (!sio)
     {
-      error = IOD_ENOMEM;
-      goto error;
+      internal_error = IOD_ENOMEM;
+      goto err;
     }
 
   sio->handler = strdup (handler);
   if (!sio->handler)
     {
-      error = IOD_ENOMEM;
-      goto error;
+      internal_error = IOD_ENOMEM;
+      goto err;
     }
 
   if (STREQ (handler, IOS_STDIN_HANDLER))
@@ -93,8 +96,8 @@ ios_dev_stream_open (const char *handler, uint64_t flags, 
void **dev)
       sio->buffer = ios_buffer_init ();
       if (!sio->buffer)
         {
-          error = IOD_ENOMEM;
-          goto error;
+          internal_error = IOD_ENOMEM;
+          goto err;
         }
     }
   else if (STREQ (handler, IOS_STDOUT_HANDLER))
@@ -110,17 +113,20 @@ ios_dev_stream_open (const char *handler, uint64_t flags, 
void **dev)
       sio->write_offset = 0;
     }
   else
-    goto error;
+    goto err;
 
-  *dev = sio;
-  return IOD_OK;
+  if (error)
+   *error = IOD_OK;
+  return sio;
 
-error:
+err:
   if (sio)
     free (sio->handler);
   free (sio);
 
-  return error;
+  if (error)
+    *error = internal_error;
+  return NULL;
 }
 
 static int
diff --git a/libpoke/ios-dev.h b/libpoke/ios-dev.h
index 127ae846..4fbbcc1a 100644
--- a/libpoke/ios-dev.h
+++ b/libpoke/ios-dev.h
@@ -53,21 +53,20 @@ struct ios_dev_if
   char *(*get_if_name) ();
 
   /* Determine whether the provided HANDLER is recognized as a valid
-     device spec by this backend, and if so, copy its normalized
-     form into newhandler (caller will free).  In case of error,
-     return the error code.  If not, return IOD_OK.  */
+     device spec by this backend, and if so, return its normalized
+     form (caller will free).  In case of error, return NULL.  This function
+     sets the ERROR to error code or to IOD_OK.  */
 
-  int (*handler_normalize) (const char *handler, uint64_t flags, char 
**newhandler);
+  char * (*handler_normalize) (const char *handler, uint64_t flags, int* 
error);
 
-  /* Open a device using the provided HANDLER.  Fill DEV with the opened
-     device, or return the error code.  Note that this function assumes that
-     HANDLER is recognized as a handler by the backend, i.e. HANDLER_P
-     returns 1 if HANDLER is passed to it.  */
+  /* Open a device using the provided HANDLER.  Return the opened
+     device, or NULL in case of errors.  Set the ERROR to error code or to
+     IOD_OK.  Note that this function assumes that HANDLER is recognized as a
+     handler by the backend.  */
 
-  int (*open) (const char *handler, uint64_t flags, void **dev);
+  void * (*open) (const char *handler, uint64_t flags, int *error);
 
   /* Close the given device.  Return 0 if there was an error during
-
      the operation, 1 otherwise.  */
 
   int (*close) (void *dev);
@@ -97,7 +96,7 @@ struct ios_dev_if
   int (*flush) (void *dev, ios_dev_off offset);
 };
 
-#define IOS_FILE_HANDLER_NORMALIZE(handler, newhandler)                 \
+#define IOS_FILE_HANDLER_NORMALIZE(handler, new_handler)                \
   do                                                                    \
     {                                                                   \
       /* File devices are special, in the sense that they accept any */ \
@@ -111,8 +110,8 @@ struct ios_dev_if
                                                                         \
       if (handler[0] == '/'                                             \
           || strspn (handler, safe) == strlen (handler))                \
-        (newhandler) = strdup ((handler));                              \
-      else if (asprintf (&(newhandler), "./%s", (handler)) == -1)       \
-        (newhandler) = NULL;                                            \
+        (new_handler) = strdup ((handler));                             \
+      else if (asprintf (&(new_handler), "./%s", (handler)) == -1)      \
+        (new_handler) = NULL;                                           \
     }                                                                   \
   while (0)
diff --git a/libpoke/ios.c b/libpoke/ios.c
index 7da34bcf..8db45f5b 100644
--- a/libpoke/ios.c
+++ b/libpoke/ios.c
@@ -130,8 +130,6 @@ ios_open (const char *handler, uint64_t flags, int set_cur)
   if (!io)
     return IOS_ENOMEM;
 
-  io->handler = NULL;
-  io->dev = NULL;
   io->next = NULL;
   io->bias = 0;
 
@@ -139,8 +137,8 @@ ios_open (const char *handler, uint64_t flags, int set_cur)
      handler.  */
   for (dev_if = ios_dev_ifs; *dev_if; ++dev_if)
     {
-      iod_error = (*dev_if)->handler_normalize (handler, flags, &io->handler);
-      if (iod_error)
+      io->handler = (*dev_if)->handler_normalize (handler, flags, &iod_error);
+      if (iod_error != IOD_OK)
         goto error;
       if (io->handler)
         break;
@@ -160,7 +158,7 @@ ios_open (const char *handler, uint64_t flags, int set_cur)
       }
 
   /* Open the device using the interface found above.  */
-  iod_error = io->dev_if->open (handler, flags, &io->dev);
+  io->dev = io->dev_if->open (handler, flags, &iod_error);
   if (iod_error || io->dev == NULL)
     goto error;
 
-- 
2.29.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]