]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
Cleanup: Separate the netlink method to cgre_receive_netlink_msg().
authorKen'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
Fri, 26 Jun 2009 05:50:31 +0000 (14:50 +0900)
committerDhaval Giani <dhaval@linux.vnet.ibm.com>
Mon, 29 Jun 2009 11:17:32 +0000 (16:47 +0530)
Hi,

Changelog of v6:
================
 * No change.

Changelog of v5:
================
 * No change.

Changelog of v4:
================
 * Remove unused parameter "cn_hdr" from cgre_receive_netlink_msg().

Changelog of v3:
================
 * No change.

Changelog of v2:
================
 * New patch.

Description:
============
This patch separates the netlink method for the readability, because
the later patch [PATCH 6/9] adds "unix domain socket" handling method
around the netlink method.

Thanks
Ken'ichi Ohmichi

Signed-off-by: Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
src/daemon/cgrulesengd.c

index 0eacbbc10ffe881285f729978b45d8962e7bdcf1..c83532dbeadfdf452b8649e8afe789ebf5bc8594 100644 (file)
@@ -393,17 +393,61 @@ int cgre_handle_msg(struct cn_msg *cn_hdr)
        return ret;
 }
 
+int cgre_receive_netlink_msg(int sk_nl)
+{
+       char buff[BUFF_SIZE];
+       size_t recv_len;
+       struct sockaddr_nl from_nla;
+       socklen_t from_nla_len;
+       struct nlmsghdr *nlh;
+       struct sockaddr_nl kern_nla;
+       struct cn_msg *cn_hdr;
+
+       kern_nla.nl_family = AF_NETLINK;
+       kern_nla.nl_groups = CN_IDX_PROC;
+       kern_nla.nl_pid = 1;
+       kern_nla.nl_pad = 0;
+
+       memset(buff, 0, sizeof(buff));
+       from_nla_len = sizeof(from_nla);
+       memcpy(&from_nla, &kern_nla, sizeof(from_nla));
+       recv_len = recvfrom(sk_nl, buff, sizeof(buff), 0,
+               (struct sockaddr *)&from_nla, &from_nla_len);
+       if (recv_len == ENOBUFS) {
+               flog(LOG_ERR, "ERROR: NETLINK BUFFER FULL, MESSAGE DROPPED!");
+               return 0;
+       }
+       if (recv_len < 1)
+               return 0;
+
+       nlh = (struct nlmsghdr *)buff;
+       while (NLMSG_OK(nlh, recv_len)) {
+               cn_hdr = NLMSG_DATA(nlh);
+               if (nlh->nlmsg_type == NLMSG_NOOP) {
+                       nlh = NLMSG_NEXT(nlh, recv_len);
+                       continue;
+               }
+               if ((nlh->nlmsg_type == NLMSG_ERROR) ||
+                               (nlh->nlmsg_type == NLMSG_OVERRUN))
+                       break;
+               if (cgre_handle_msg(cn_hdr) < 0)
+                       return 1;
+               if (nlh->nlmsg_type == NLMSG_DONE)
+                       break;
+               nlh = NLMSG_NEXT(nlh, recv_len);
+       }
+       return 0;
+}
+
 int cgre_create_netlink_socket_process_msg()
 {
        int sk_nl;
-       struct sockaddr_nl my_nla, kern_nla, from_nla;
-       socklen_t from_nla_len;
+       struct sockaddr_nl my_nla;
        char buff[BUFF_SIZE];
        int rc = -1;
        struct nlmsghdr *nl_hdr;
        struct cn_msg *cn_hdr;
        enum proc_cn_mcast_op *mcop_msg;
-       size_t recv_len = 0;
 
        /*
         * Create an endpoint for communication. Use the kernel user
@@ -422,11 +466,6 @@ int cgre_create_netlink_socket_process_msg()
        my_nla.nl_pid = getpid();
        my_nla.nl_pad = 0;
 
-       kern_nla.nl_family = AF_NETLINK;
-       kern_nla.nl_groups = CN_IDX_PROC;
-       kern_nla.nl_pid = 1;
-       kern_nla.nl_pad = 0;
-
        if (bind(sk_nl, (struct sockaddr *)&my_nla, sizeof(my_nla)) < 0) {
                cgroup_dbg("binding sk_nl error");
                goto close_and_exit;
@@ -461,35 +500,8 @@ int cgre_create_netlink_socket_process_msg()
        cgroup_dbg("sent\n");
 
        for(;;) {
-               memset(buff, 0, sizeof(buff));
-               from_nla_len = sizeof(from_nla);
-               struct nlmsghdr *nlh = (struct nlmsghdr*)buff;
-               memcpy(&from_nla, &kern_nla, sizeof(from_nla));
-               recv_len = recvfrom(sk_nl, buff, BUFF_SIZE, 0,
-               (struct sockaddr*)&from_nla, &from_nla_len);
-               if (recv_len == ENOBUFS) {
-                       flog(LOG_ERR, "ERROR: NETLINK BUFFER FULL, MESSAGE "
-                                       "DROPPED!");
-                       continue;
-               }
-               if (recv_len < 1)
-                       continue;
-               while (NLMSG_OK(nlh, recv_len)) {
-                       cn_hdr = NLMSG_DATA(nlh);
-                       if (nlh->nlmsg_type == NLMSG_NOOP) {
-                               nlh = NLMSG_NEXT(nlh, recv_len);
-                               continue;
-                       }
-                       if ((nlh->nlmsg_type == NLMSG_ERROR) ||
-                                       (nlh->nlmsg_type == NLMSG_OVERRUN))
-                               break;
-                       if(cgre_handle_msg(cn_hdr) < 0) {
-                               goto close_and_exit;
-                       }
-                       if (nlh->nlmsg_type == NLMSG_DONE)
-                               break;
-                       nlh = NLMSG_NEXT(nlh, recv_len);
-               }
+               if (cgre_receive_netlink_msg(sk_nl))
+                       break;
        }
 
 close_and_exit: