Example #1
0
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));
    }

}
Example #2
0
/**
 * 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;
        }
    }
}