From owner-p4-projects@FreeBSD.ORG Wed Jul 29 18:28:55 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4FC001065670; Wed, 29 Jul 2009 18:28:55 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D32C41065677 for ; Wed, 29 Jul 2009 18:28:54 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id C12FE8FC2F for ; Wed, 29 Jul 2009 18:28:54 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n6TISs7l009199 for ; Wed, 29 Jul 2009 18:28:54 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n6TISsor009197 for perforce@freebsd.org; Wed, 29 Jul 2009 18:28:54 GMT (envelope-from trasz@freebsd.org) Date: Wed, 29 Jul 2009 18:28:54 GMT Message-Id: <200907291828.n6TISsor009197@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Cc: Subject: PERFORCE change 166741 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Jul 2009 18:29:00 -0000 http://perforce.freebsd.org/chv.cgi?CH=166741 Change 166741 by trasz@trasz_victim on 2009/07/29 18:28:15 Resolve numeric ids back into user/group names. Affected files ... .. //depot/projects/soc2009/trasz_limits/usr.sbin/hrl/hrl.c#17 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/usr.sbin/hrl/hrl.c#17 (text+ko) ==== @@ -44,8 +44,6 @@ static void print_subject(int subject, id_t id) { - struct passwd *pwd; - struct group *grp; switch (subject) { case HRL_SUBJECT_PROCESS: @@ -124,18 +122,18 @@ * This routine replaces user/group name with numeric id. */ static char * -resolve_ids(char *str) +resolve_ids(char *rule) { id_t id; const char *subject, *textid, *rest; char *resolved; - subject = strsep(&str, ":"); - textid = strsep(&str, ":"); + subject = strsep(&rule, ":"); + textid = strsep(&rule, ":"); if (textid == NULL) - errx(1, "error in rule specification: no subject"); - if (str != NULL) - rest = str; + errx(1, "error in rule specification -- no subject"); + if (rule != NULL) + rest = rule; else rest = ""; @@ -160,9 +158,47 @@ if (resolved == NULL) err(1, "asprintf"); - fprintf(stderr, "resolved to '%s'\n", resolved); + return (resolved); +} + +/* + * Print rules, one per line, */ +static void +print_rules(char *rules) +{ + char *rule; + const char *subject, *textid, *rest; + id_t id; + struct passwd *pwd; + struct group *grp; + + while ((rule = strsep(&rules, ",")) != NULL) { + if (rule[0] == '\0') + break; /* XXX */ + subject = strsep(&rule, ":"); + textid = strsep(&rule, ":"); + if (textid == NULL) + errx(1, "rule passed from the kernel didn't contain subject"); + if (rule != NULL) + rest = rule; + else + rest = ""; + + /* Replace numerical user and group ids with names. */ + if (strcasecmp(subject, "user") == 0) { + id = parse_user(textid); + pwd = getpwuid(id); + if (pwd != NULL) + textid = pwd->pw_name; + } else if (strcasecmp(subject, "group") == 0) { + id = parse_group(textid); + grp = getgrgid(id); + if (grp != NULL) + textid = grp->gr_name; + } - return (resolved); + printf("%s:%s:%s\n", subject, textid, rest); + } } static void @@ -176,14 +212,11 @@ free(rule); } -/* - * Query the kernel about a resource usage and print it out. - */ static void show_limits(char *filter) { int error; - char *outbuf = NULL, *tmp; + char *outbuf = NULL; size_t outbuflen = BUFLEN_DEFAULT / 4; do { @@ -197,11 +230,8 @@ err(1, "hrl_get_limits"); } while (error && errno == EFBIG); - for (tmp = outbuf; *tmp != '\0'; tmp++) - if (*tmp == ',') - *tmp = '\n'; - - printf("Resource utilisation:\n%s\n", outbuf); + printf("Resource utilisation:\n"); + print_rules(outbuf); free(filter); free(outbuf); } @@ -254,7 +284,7 @@ show_rules(char *filter) { int error; - char *outbuf = NULL, *tmp; + char *outbuf = NULL; size_t filterlen, outbuflen = BUFLEN_DEFAULT / 4; if (filter != NULL) @@ -273,19 +303,8 @@ err(1, "hrl_get_rules"); } while (error && errno == EFBIG); - for (tmp = outbuf; *tmp != '\0'; tmp++) - if (*tmp == ',') - *tmp = '\n'; - - if (filter != NULL) - printf("Defined resource limits matching \"%s\":\n%s\n", filter, outbuf); - else - printf("Defined resource limits:\n%s\n", outbuf); - - /* - * XXX: Resolve numeric ID-s back to names. - */ - + printf("Defined resource limits:\n"); + print_rules(outbuf); free(outbuf); }