diff options
Diffstat (limited to 'xlators/nfs')
-rw-r--r-- | xlators/nfs/server/src/mount3.c | 84 |
1 files changed, 66 insertions, 18 deletions
diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c index cb8b9a1af2f..580f92af4b7 100644 --- a/xlators/nfs/server/src/mount3.c +++ b/xlators/nfs/server/src/mount3.c @@ -2632,27 +2632,75 @@ mnt3_xlchildren_to_exports (rpcsvc_t *svc, struct mount3_state *ms) } strcpy (elist->ex_dir, ent->expname); - addrstr = rpcsvc_volume_allowed (svc->options, - ent->vol->name); - elist->ex_groups = GF_CALLOC (1, sizeof (struct groupnode), - gf_nfs_mt_groupnode); - if (!elist->ex_groups) { - gf_msg (GF_MNT, GF_LOG_ERROR, ENOMEM, - NFS_MSG_NO_MEMORY, "Memory allocation failed"); - goto free_list; - } - /*This check has to be done after checking - * elist->ex_groups allocation check to avoid resource leak; - */ - if (addrstr) - addrstr = gf_strdup (addrstr); - else + addrstr = rpcsvc_volume_allowed (svc->options, ent->vol->name); + if (addrstr) { + /* create a groupnode per allowed client */ + char *pos = NULL; + char *addr = NULL; + char *addrs = NULL; + struct groupnode *group = NULL; + struct groupnode *prev_group = NULL; + + /* strtok_r() modifies the string, dup it */ + addrs = gf_strdup (addrstr); + if (!addrs) + goto free_list; + + while (1) { + /* only pass addrs on the 1st call */ + addr = strtok_r (group ? NULL : addrs, ",", + &pos); + if (addr == NULL) + /* no mode clients */ + break; + + group = GF_CALLOC (1, sizeof (struct groupnode), + gf_nfs_mt_groupnode); + if (!group) { + gf_msg (GF_MNT, GF_LOG_ERROR, ENOMEM, + NFS_MSG_NO_MEMORY, "Memory " + "allocation failed"); + GF_FREE (addrs); + goto free_list; + } + + group->gr_name = gf_strdup (addr); + if (!group->gr_name) { + gf_msg (GF_MNT, GF_LOG_ERROR, ENOMEM, + NFS_MSG_NO_MEMORY, "Memory " + "allocation failed"); + GF_FREE (group); + GF_FREE (addrs); + goto free_list; + } + + /* chain the groups together */ + if (!elist->ex_groups) + elist->ex_groups = group; + else + prev_group->gr_next = group; + prev_group = group; + } + + GF_FREE (addrs); + } else { + elist->ex_groups = GF_CALLOC (1, + sizeof (struct groupnode), + gf_nfs_mt_groupnode); + if (!elist->ex_groups) { + gf_msg (GF_MNT, GF_LOG_ERROR, ENOMEM, + NFS_MSG_NO_MEMORY, "Memory allocation " + "failed"); + goto free_list; + } + addrstr = gf_strdup ("No Access"); + if (!addrstr) + goto free_list; - if (!addrstr) { - goto free_list; + elist->ex_groups->gr_name = addrstr; } - elist->ex_groups->gr_name = addrstr; + if (prev) { prev->ex_next = elist; prev = elist; |