static inline void print_entry(const wagon_t *id, const attr_set_t * attrs) { #ifdef ATTR_INDEX_status if (prog_options.match_status) { if (ATTR_MASK_TEST(attrs, status) && (ATTR(attrs, status) != prog_options.status)) { /* no match -> no display */ return; } } #endif if (prog_options.ls) { const char * type; char date_str[128]; char mode_str[128]; char uname[LOGIN_NAME_MAX]; char gname[LOGIN_NAME_MAX]; struct passwd *passwd; struct group *group; #ifdef ATTR_INDEX_status const char * status_str = ""; /* add status after type */ if (ATTR_MASK_TEST(attrs, status) && (ATTR(attrs, status) != STATUS_UNKNOWN)) status_str = db_status2str(ATTR(attrs, status), 1); /* 1 for brief */ #define STATUS_FORMAT "%-10s" #define STATUS_VAL ,status_str #else #define STATUS_FORMAT "" #define STATUS_VAL #endif /* type2char */ if (!ATTR_MASK_TEST(attrs, type)) type = "?"; else type = type2char(ATTR(attrs, type)); memset(mode_str, 0, sizeof(mode_str)); mode_string(ATTR(attrs, mode), mode_str); if (!ATTR_MASK_TEST(attrs, last_mod)) strcpy(date_str, ""); else { time_t tt; struct tm stm; tt = ATTR(attrs, last_mod); strftime(date_str, 128, "%Y/%m/%d %T", localtime_r(&tt, &stm)); } /* UID/GID to username/group. */ passwd = GetPwUid(ATTR(attrs, uid)); if (passwd) sprintf(uname, "%-10s", passwd->pw_name); else sprintf(uname, "%10u", ATTR(attrs, uid)); group = GetGrGid(ATTR(attrs, gid)); if (group) sprintf(gname, "%-10s", group->gr_name); else sprintf(gname, "%10u", ATTR(attrs, gid)); if (ATTR_MASK_TEST(attrs, type) && !strcmp(ATTR(attrs, type), STR_TYPE_LINK) && ATTR_MASK_TEST(attrs, link)) /* display: id, type, mode, nlink, (status,) owner, group, size, mtime, path -> link */ printf(DFID" %-4s %s %3u "STATUS_FORMAT"%-10s %-10s %15"PRIu64" %20s %s -> %s\n", PFID(&id->id), type, mode_str, ATTR(attrs, nlink) STATUS_VAL, uname, gname, ATTR(attrs, size), date_str, id->fullname, ATTR(attrs,link)); else /* display all: id, type, mode, nlink, (status,) owner, group, size, mtime, path */ printf(DFID" %-4s %s %3u "STATUS_FORMAT"%-10s %-10s %15"PRIu64" %20s %s\n", PFID(&id->id), type, mode_str, ATTR(attrs, nlink) STATUS_VAL, uname, gname, ATTR(attrs, size), date_str, id->fullname); } else if (prog_options.lsstat) { /* In the worst case scenario, each character will be escaped * to '\xXX'; so the string can be up to 4 time the name * length. */ char escaped_name[4*RBH_NAME_MAX+1]; /* Exclude any file with an uncomplete attributes. */ if ((attrs->attr_mask & LSSTAT_MASK) == LSSTAT_MASK) { printf("[%s,%u,%u,%zu,%lu,%lu,%lu]=%s\n", ATTR(attrs, type), ATTR(attrs, uid), ATTR(attrs, gid), ATTR(attrs, size), ATTR(attrs, ctime), ATTR(attrs, mtime), ATTR(attrs, atime), escape_name(id->fullname, escaped_name)); } else { printf("SKIPPED(%x,%x)=%s\n", attrs->attr_mask, LSSTAT_MASK, id->fullname); } } #ifdef _LUSTRE else if (prog_options.lsost) { char tmpbuf[24576]; FormatStripeList( tmpbuf, sizeof(tmpbuf)-1, &ATTR( attrs, stripe_items), FALSE); printf("%s\t%s\n", id->fullname, tmpbuf); } #endif else { /* just display name */ if (id->fullname) printf("%s\n", id->fullname); else printf(DFID"\n", PFID(&id->id)); } }
/** * Output the desired information for one file. */ void printf_entry(GArray *chunks, const wagon_t *id, const attr_set_t *attrs) { int i; for (i = 0; i < chunks->len; i++) { struct fchunk *chunk = &g_array_index(chunks, struct fchunk, i); const char *format = chunk->format->str; switch (chunk->directive) { case 0: #if __GNUC__ >= 7 /* * "format" below is constructed safely, ignore the warning. * Old GCC versions do not like these statements */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-security" #endif printf(format); #if __GNUC__ >= 7 #pragma GCC diagnostic pop #endif break; case 'A': printf_date(chunk, ATTR(attrs, last_access)); break; case 'b': printf(format, ATTR(attrs, blocks)); break; case 'C': printf_date(chunk, ATTR(attrs, last_mdchange)); break; case 'd': printf(format, ATTR(attrs, depth)); break; case 'f': printf(format, ATTR(attrs, name)); break; case 'g': if (global_config.uid_gid_as_numbers) printf(format, ATTR(attrs, gid).num); else printf(format, ATTR(attrs, gid).txt); break; case 'm': printf(format, ATTR(attrs, mode)); break; case 'M': { char mode_str[10]; /* mask + final '\0' */ mode_str[9] = 0; mode_string(ATTR(attrs, mode), mode_str); printf(format, mode_str); } break; case 'n': printf(format, ATTR(attrs, nlink)); break; case 'p': if (prog_options.escaped) printf(format, escape_name(id->fullname)); else printf(format, id->fullname); break; case 's': printf(format, ATTR(attrs, size)); break; case 'T': printf_date(chunk, ATTR(attrs, last_mod)); break; case 'u': if (global_config.uid_gid_as_numbers) printf(format, ATTR(attrs, uid).num); else printf(format, ATTR(attrs, uid).txt); break; case 'Y': { const char *type; if (!ATTR_MASK_TEST(attrs, type)) type = "?"; else type = type2char(ATTR(attrs, type)); printf(format, type); } break; case 'y': { char type; if (!ATTR_MASK_TEST(attrs, type)) type = '?'; else type = type2onechar(ATTR(attrs, type)); printf(format, type); } break; case 'z': printf(format, 0); break; case 'R': /* Robinhood specifiers */ switch (chunk->sub_directive) { case 'C': printf_date(chunk, ATTR(attrs, creation_time)); break; case 'c': printf(format, class_format(ATTR_MASK_TEST(attrs, fileclass) ? ATTR(attrs, fileclass) : NULL)); break; case 'f': { char fid_str[RBH_FID_LEN]; sprintf(fid_str, DFID_NOBRACE, PFID(&id->id)); printf(format, fid_str); } break; case 'm': if (ATTR_MASK_INFO_TEST(attrs, chunk->smi, chunk->rel_sm_info_index)) { switch (chunk->def->db_type) { case DB_UINT: printf(format, *(unsigned int *)SMI_INFO(attrs, chunk->smi, chunk-> rel_sm_info_index)); break; case DB_INT: printf(format, *(int *)SMI_INFO(attrs, chunk->smi, chunk->rel_sm_info_index)); break; case DB_BOOL: printf(format, *(bool *)SMI_INFO(attrs, chunk->smi, chunk->rel_sm_info_index)); break; case DB_TEXT: printf(format, SMI_INFO(attrs, chunk->smi, chunk->rel_sm_info_index)); break; default: break; } } else { switch (chunk->def->db_type) { case DB_UINT: case DB_INT: printf(format, 0); break; case DB_TEXT: printf(format, "[n/a]"); break; default: break; } } break; #ifdef _LUSTRE case 'o': if (ATTR_MASK_TEST(attrs, stripe_items) && (ATTR(attrs, stripe_items).count > 0)) { GString *osts = g_string_new(""); append_stripe_list(osts, &ATTR(attrs, stripe_items), true); printf(format, osts->str); g_string_free(osts, TRUE); } break; case 'p': { char fid_str[RBH_FID_LEN]; sprintf(fid_str, DFID_NOBRACE, PFID(&ATTR(attrs, parent_id))); printf(format, fid_str); break; } #endif case SUB_DIRECTIVE_STATUS: { unsigned int smi_index = chunk->smi->smi_index; if (ATTR_MASK_STATUS_TEST(attrs, smi_index)) printf(format, STATUS_ATTR(attrs, smi_index)); else printf(format, "[n/a]"); break; } } break; } } }