diff options
author | Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp> | 2009-06-26 14:50:31 +0900 |
---|---|---|
committer | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2009-06-29 16:47:32 +0530 |
commit | 2d10aa26dc974ab2f838bc170a7ff1608f0cf8a6 (patch) | |
tree | 56e3cd8345be6116169cc0d5fcecbf8617a854e6 /src | |
parent | b6777528cc8ce46ce4d1ef888d62f2c5c5f27275 (diff) | |
download | libcg-2d10aa26dc974ab2f838bc170a7ff1608f0cf8a6.tar.gz libcg-2d10aa26dc974ab2f838bc170a7ff1608f0cf8a6.tar.xz libcg-2d10aa26dc974ab2f838bc170a7ff1608f0cf8a6.zip |
Cleanup: Separate the netlink method to cgre_receive_netlink_msg().
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/daemon/cgrulesengd.c | 86 |
1 files changed, 49 insertions, 37 deletions
diff --git a/src/daemon/cgrulesengd.c b/src/daemon/cgrulesengd.c index 0eacbbc..c83532d 100644 --- a/src/daemon/cgrulesengd.c +++ b/src/daemon/cgrulesengd.c @@ -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: |