netlink: Make nl_sock_transact() discard reply if 'replyp' is null.
authorBen Pfaff <blp@nicira.com>
Wed, 19 May 2010 21:13:23 +0000 (14:13 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 17 Jun 2010 17:30:18 +0000 (10:30 -0700)
Sometimes only the success or failure return value is interesting, not the
details of the reply, so this simplifies some callers.

lib/netlink.c
vswitchd/proc-net-compat.c

index 91e5ccd86c2c20b56e41705354048d9620f2b6c3..5f26feb49997d2dedf96e6f70d27825675972fd9 100644 (file)
@@ -341,9 +341,12 @@ try_again:
 }
 
 /* Sends 'request' to the kernel via 'sock' and waits for a response.  If
- * successful, stores the reply into '*replyp' and returns 0.  The caller is
- * responsible for destroying the reply with ofpbuf_delete().  On failure,
- * returns a positive errno value and stores a null pointer into '*replyp'.
+ * successful, returns 0.  On failure, returns a positive errno value.
+ *
+ * If 'replyp' is nonnull, then on success '*replyp' is set to the kernel's
+ * reply, which the caller is responsible for freeing with ofpbuf_delete(), and
+ * on failure '*replyp' is set to NULL.  If 'replyp' is null, then the kernel's
+ * reply, if any, is discarded.
  *
  * nlmsg_len in 'msg' will be finalized to match msg->size, and nlmsg_pid will
  * be set to 'sock''s pid, before the message is sent.  NLM_F_ACK will be set
@@ -386,7 +389,9 @@ nl_sock_transact(struct nl_sock *sock,
     struct ofpbuf *reply;
     int retval;
 
-    *replyp = NULL;
+    if (replyp) {
+        *replyp = NULL;
+    }
 
     /* Ensure that we get a reply even if this message doesn't ordinarily call
      * for one. */
@@ -425,7 +430,11 @@ recv:
         return retval != EAGAIN ? retval : EPROTO;
     }
 
-    *replyp = reply;
+    if (replyp) {
+        *replyp = reply;
+    } else {
+        ofpbuf_delete(reply);
+    }
     return 0;
 }
 
index 72eb7be317f7b7b72f80d18e7315a4b0dda4789f..106a7c3f55e78b8840c919fd927236b0da051f70 100644 (file)
@@ -72,7 +72,7 @@ proc_net_compat_init(void)
 static int
 set_proc_file(const char *dir, const char *file, const char *data)
 {
-    struct ofpbuf request, *reply;
+    struct ofpbuf request;
     int retval;
 
     ofpbuf_init(&request, 0);
@@ -84,9 +84,8 @@ set_proc_file(const char *dir, const char *file, const char *data)
         nl_msg_put_string(&request, BRC_GENL_A_PROC_DATA, data);
     }
 
-    retval = nl_sock_transact(brc_sock, &request, &reply);
+    retval = nl_sock_transact(brc_sock, &request, NULL);
     ofpbuf_uninit(&request);
-    ofpbuf_delete(reply);
     if (retval) {
         VLOG_WARN_RL(&rl, "failed to %s /proc/%s/%s (%s)",
                      data ? "update" : "remove", dir, file, strerror(retval));