Unix - вывести номер жесткой ссылки со статом и изменить формат ctime на выходе (реализация команды ls и его параметров) - PullRequest
0 голосов
/ 15 ноября 2018

Во-первых, спасибо за ваше время, моя проблема в том, что я пытаюсь реализовать команду ls с максимальным количеством флагов, таких как (ls -laRt ...).Я понимаю структуру stat и все функции time / ctime / strftime, но когда я хочу напечатать их в моем выводе, они дают мне большое число, поэтому я нашел, как преобразовать метку времени st_mtime с ctime, но я хочу получить результат в "Месяц День Час: Минуты, как (ls -lRt) формат без использования strftime, возможно, или я должен реализовать эту функцию тоже?И второй вопрос, для моего количества жестких ссылок, как я могу преобразовать результат печати на моем выходе что-то вроде "-77452048" в "реальный" результат?

Это мой главный, я начинающийтак что я открыт для всех критиков, спасибо U!

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <err.h>
#include <sys/stat.h>
#include <string.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <stdint.h>

int main (int argc, char **argv)
{
    DIR *dir;
    struct dirent *d;
    struct stat s;
    char chemin[256];
    struct passwd *p;
    p = getpwuid(geteuid()); 
    struct group *grp; 
    grp = getgrgid(getgrnam(".")); 

    if (argc != 2)
    {
        perror("Filename\n");
        exit(-1);
    }

    if ((dir=opendir(argv[1])) == NULL)
    {
        perror("opendir error");
        exit(-1);
    }

    while ((d = readdir(dir)) != 0)
    {
        if(!strcmp (d->d_name, "."))
        {
            continue;
        }
        if(!strcmp (d->d_name, ".."))
        {
            continue;
        }
        strcpy (chemin, argv[1]);
        strcat (chemin, "/");
        strcat (chemin, d->d_name);
        if (!stat(chemin, &s))
        {
            printf((S_ISDIR(s.st_mode))  ? "d" : "-");
            printf((s.st_mode & S_IRUSR) ? "r" : "-");
            printf((s.st_mode & S_IWUSR) ? "w" : "-");
            printf((s.st_mode & S_IXUSR) ? "x" : "-");
            printf((s.st_mode & S_IRGRP) ? "r" : "-");
            printf((s.st_mode & S_IWGRP) ? "w" : "-");
            printf((s.st_mode & S_IXGRP) ? "x" : "-");
            printf((s.st_mode & S_IROTH) ? "r" : "-");
            printf((s.st_mode & S_IWOTH) ? "w" : "-");
            printf((s.st_mode & S_IXOTH) ? "x" : "-");
        } else
        {
            perror("Erreur dans stat");
        }
        printf(" ");
        printf("%d", &s.st_nlink);
        printf(" ");
        printf("%s", p->pw_name);
        printf(" ");
        printf("%s", grp->gr_name);
        printf(" ");
        printf("%d", &s.st_mtime);
        printf(" ");
        printf("%9jd", (intmax_t)s.st_size);
        printf(" ");
        printf("%s ", d->d_name);
        printf("\n");
    }
    closedir(dir);
}
...