aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Luke <chrisy@flirble.org>2016-06-01 19:25:49 -0400
committerChris Luke <chris_luke@cable.comcast.com>2016-06-01 23:51:25 +0000
commit079d86e8c8181aa5d7b5e8cd928b93fcd10d9e2c (patch)
treefd62f102872dc43f243a4d58046452351614f53c
parent16c75df7976003305f57885639cbc4df4a6a12cf (diff)
VPP-105 Map API SHM uid/gid name to number
When providing uid or gid for the API SHM, if non-numeric values are given look them up in the local system user database and if found use the values discovered. Change-Id: I95152f58646643bc44d2af4cbad6338901935c69 Signed-off-by: Chris Luke <chrisy@flirble.org>
-rw-r--r--vpp/api/api.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/vpp/api/api.c b/vpp/api/api.c
index 6c387a38369..fb3351e4772 100644
--- a/vpp/api/api.c
+++ b/vpp/api/api.c
@@ -30,6 +30,9 @@
#include <time.h>
#include <fcntl.h>
#include <string.h>
+#include <pwd.h>
+#include <grp.h>
+
#include <vppinfra/clib.h>
#include <vppinfra/vec.h>
#include <vppinfra/hash.h>
@@ -6300,11 +6303,16 @@ vpe_api_init (vlib_main_t *vm)
VLIB_INIT_FUNCTION(vpe_api_init);
+
static clib_error_t *
api_segment_config (vlib_main_t * vm, unformat_input_t * input)
{
u8 * chroot_path;
- int uid, gid;
+ int uid, gid, rv;
+ char *s, buf[128];
+ struct passwd _pw, *pw;
+ struct group _grp, *grp;
+ clib_error_t *e;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
@@ -6317,6 +6325,50 @@ api_segment_config (vlib_main_t * vm, unformat_input_t * input)
vl_set_memory_uid (uid);
else if (unformat (input, "gid %d", &gid))
vl_set_memory_gid (gid);
+ else if (unformat (input, "uid %s", &s))
+ {
+ /* lookup the username */
+ pw = NULL;
+ rv = getpwnam_r(s, &_pw, buf, sizeof(buf), &pw);
+ if (rv < 0)
+ {
+ e = clib_error_return_code(0, rv,
+ CLIB_ERROR_ERRNO_VALID | CLIB_ERROR_FATAL,
+ "cannot fetch username %s", s);
+ vec_free (s);
+ return e;
+ }
+ if (pw == NULL)
+ {
+ e = clib_error_return_fatal(0, "username %s does not exist", s);
+ vec_free (s);
+ return e;
+ }
+ vec_free (s);
+ vl_set_memory_uid (pw->pw_uid);
+ }
+ else if (unformat (input, "gid %s", &s))
+ {
+ /* lookup the group name */
+ grp = NULL;
+ rv = getgrnam_r(s, &_grp, buf, sizeof(buf), &grp);
+ if (rv != 0)
+ {
+ e = clib_error_return_code(0, rv,
+ CLIB_ERROR_ERRNO_VALID | CLIB_ERROR_FATAL,
+ "cannot fetch group %s", s);
+ vec_free (s);
+ return e;
+ }
+ if (grp == NULL)
+ {
+ e = clib_error_return_fatal(0, "group %s does not exist", s);
+ vec_free (s);
+ return e;
+ }
+ vec_free (s);
+ vl_set_memory_gid (grp->gr_gid);
+ }
else
return clib_error_return (0, "unknown input `%U'",
format_unformat_error, input);