Print this page
NEX-1767 ls is unable to display SIDs
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>

*** 21,30 **** --- 21,32 ---- /* * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, Joyent, Inc. All rights reserved. * Copyright 2015 Gary Mills + * + * Copyright 2016 Nexenta Systems, Inc. All rights reserved. */ /* * Copyright 2017 Jason King. All rights reserved. * Use is subject to license terms.
*** 228,237 **** --- 230,240 ---- static int quantn = 64; /* allocation growth quantum */ static struct lbuf *nxtlbf; /* ptr to next lbuf to be assigned */ static struct lbuf **flist; /* ptr to list of lbuf pointers */ static struct lbuf *gstat(char *, int, struct ditem *); + static char *get_sid_name(uid_t, boolean_t, boolean_t); static char *getname(uid_t); static char *getgroup(gid_t); static char *makename(char *, char *); static void pentry(struct lbuf *); static void column(void);
*** 774,789 **** --- 777,794 ---- lflg = 0; #endif continue; case 'n': nflg++; + if (nflg == 1) { lflg++; statreq++; Cflg = 0; xflg = 0; mflg = 0; atflg = 0; + } continue; case 'o': oflg++; lflg++; statreq++;
*** 1239,1248 **** --- 1244,1254 ---- * print one output entry; * if uid/gid is not found in the appropriate * file(passwd/group), then print uid/gid instead of * user/group name; */ + #define DUMP_EPHEMERAL(x) printf("%-8lu ", (ulong_t)(x)) static void pentry(struct lbuf *ap) { struct lbuf *p; char *dmark = ""; /* Used if -p or -F option active */
*** 1268,1277 **** --- 1274,1285 ---- (p->lblocks < 10000) ? "%4lld " : "%lld ", (p->ltype != 'b' && p->ltype != 'c') ? p->lblocks : 0LL); } if (lflg) { + boolean_t res; + (void) putchar(p->ltype); curcol++; pmode(p->lflags); /* ACL: additional access mode flag */
*** 1278,1300 **** (void) putchar(p->acl); curcol++; curcol += printf("%3lu ", (ulong_t)p->lnl); if (oflg) { ! if (!nflg) { cp = getname(p->luid); curcol += printf("%-8s ", cp); ! } else ! curcol += printf("%-8lu ", (ulong_t)p->luid); } if (gflg) { ! if (!nflg) { cp = getgroup(p->lgid); curcol += printf("%-8s ", cp); ! } else ! curcol += printf("%-8lu ", (ulong_t)p->lgid); } if (p->ltype == 'b' || p->ltype == 'c') { curcol += printf("%3u, %2u", (uint_t)major((dev_t)p->lsize), (uint_t)minor((dev_t)p->lsize)); } else if (hflg) { --- 1286,1342 ---- (void) putchar(p->acl); curcol++; curcol += printf("%3lu ", (ulong_t)p->lnl); if (oflg) { ! boolean_t usr = B_TRUE; ! ! if (nflg == 0) { /* -n not specified; resolve */ ! if (p->luid > MAXUID) { ! res = B_FALSE; ! cp = get_sid_name(p->luid, usr, res); ! } else { cp = getname(p->luid); + } curcol += printf("%-8s ", cp); ! ! } else if (nflg == 1) { /* -n specified; force SID's */ ! if (p->luid > MAXUID) { ! res = B_TRUE; ! ! cp = get_sid_name(p->luid, usr, res); ! curcol += printf("%-8s ", cp); ! } else { ! curcol += DUMP_EPHEMERAL(p->luid); } + } else /* -nn specified; force ephemerals */ + curcol += DUMP_EPHEMERAL(p->luid); + } if (gflg) { ! boolean_t usr = B_FALSE; ! ! if (nflg == 0) { /* -n not specified; resolve */ ! if (p->lgid > MAXUID) { ! res = B_FALSE; ! cp = get_sid_name(p->lgid, usr, res); ! } else { cp = getgroup(p->lgid); + } curcol += printf("%-8s ", cp); ! ! } else if (nflg == 1) { /* -n specified; force SID's */ ! if (p->lgid > MAXUID) { ! res = B_TRUE; ! ! cp = get_sid_name(p->lgid, usr, res); ! curcol += printf("%-8s ", cp); ! } else { ! curcol += DUMP_EPHEMERAL(p->lgid); } + } else /* -nn specified; force ephemerals */ + curcol += DUMP_EPHEMERAL(p->lgid); + } if (p->ltype == 'b' || p->ltype == 'c') { curcol += printf("%3u, %2u", (uint_t)major((dev_t)p->lsize), (uint_t)minor((dev_t)p->lsize)); } else if (hflg) {
*** 1424,1434 **** new_line(); } if (vflg) { new_line(); if (p->aclp) { ! acl_printacl(p->aclp, num_cols, Vflg); } } /* Free extended system attribute lists */ if (saflg || tmflg) free_sysattr(p); --- 1466,1482 ---- new_line(); } if (vflg) { new_line(); if (p->aclp) { ! int flgs = ACL_SID_FMT; ! ! flgs |= Vflg ? ACL_COMPACT_FMT : 0; ! flgs |= (nflg == 1) ? ACL_NORESOLVE : 0; ! flgs |= (nflg >= 2) ? ACL_EPHEMERAL : 0; ! ! acl_printacl(p->aclp, num_cols, flgs); } } /* Free extended system attribute lists */ if (saflg || tmflg) free_sysattr(p);
*** 2212,2221 **** --- 2260,2297 ---- *parent = c; c->val = val; return (c); } + /* + * SID MAX String Length: "http://stackoverflow.com/questions/1140528/" + */ + #define SID_STR_MAX 185 /* +1 for null char */ + static char * + get_sid_name(uid_t id, boolean_t user, boolean_t res) + { + static char *sid = NULL; + char *p = NULL; + + if (sid_string_by_id(id, user, &sid, res)) { + if ((p = getname(id)) == NULL) { + /* + * getname() already converts to ephemeral if id + * is not found in passwd or group file(s). This + * should be an extreme case. + */ + static char buf[SID_STR_MAX] = {'\0'}; + + (void) sprintf(buf, "%-8u", (int)id); + p = buf; + } + } else + p = sid; + + return (p); + } + /* * get name from cache, or passwd file for a given uid; * lastuid is set to uid. */ static char *