1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <assert.h>
#include <pwd.h>
#include <grp.h>
#define FMT_TIME "%Y-%m-%d %T"
/* -ed- fonction privee (ajoute 'static') */
static int compar_size (const void *pt_a, const void *pt_b)
{
const struct stat *pt_sa = pt_a;
const struct stat *pt_sb = pt_b;
return pt_sa->st_size - pt_sb->st_size;
}
int main (int argc, char *argv[])
{
int mode;
char *patch = NULL;
/* -ed- non utilisees...
char date1[30];
char date2[30];
*/
char date3[30];
/* -ed-
int i;
int Max = argc - 1;
size_t est un meilleur type pour le indices et les nombres d'objets...
*/
size_t i;
size_t Max = argc - 1;
#if 0
printf ("argc=%d argv[1]='%s'\n", argc, argv[1]);
#endif
/* -ed- le tableau des statistiques. Ok. */
struct stat *sbuf = malloc (Max * sizeof *sbuf);
struct group * g;
struct passwd * p;
if (sbuf != NULL)
{
/* -ed-
int result = 0;
je prefere un identificateur plus 'concret'.
*/
int err = 0;
for (i = 0; !err && i < Max; i++)
{
/* -ed-
result = stat (argv[i], &sbuf[i]);
avec i qui commence a 0, c'est surement pas argv[i] !
*/
err = stat (argv[i + 1], sbuf + i);
}
if (!err)
{
qsort (sbuf, Max, sizeof *sbuf, compar_size);
/* -ed-
for (i = 1; i < Max; i++)
ben non, pas 1, sinon, tu sautes le 0...
*/
for (i = 0; i < Max; i++)
{
mode = sbuf[i].st_mode;
/* -ed-
patch = argv[i];
ben non, pas i, mais i+1...
*/
patch = argv[i + 1];
p = getpwuid (sbuf[i].st_uid) ;
g = getgrgid (sbuf[i].st_gid) ;
/* -ed-
strftime (date1, Max, FMT_TIME, gmtime (&sbuf[i].st_mtime));
strftime (date2, Max, FMT_TIME, gmtime (&sbuf[i].st_atime));
strftime (date3, Max, FMT_TIME, gmtime (&sbuf[i].st_ctime));
Pourquoi Max ? sizeof date1..3 est probablement ce que tu veux...
date1 et date2 ne sont jamais utilisees...
*/
strftime (date3, sizeof date3, FMT_TIME, gmtime (&sbuf[i].st_ctime));
if (S_ISDIR (mode))
{
if (p)
{
printf ("%-8s ",p->pw_name);
/*printf ("%d ",p->pw_uid);
printf ("%d ",p->pw_gid);*/
}
if (g) printf ("%-8s ",g->gr_name);
printf ("%10lu %s %15s\n", (unsigned long) sbuf[i].st_size, date3, patch);
}
if (S_ISREG (mode))
{
if (p)
{
printf ("%-8s ",p->pw_name);
/* printf ("%d ",p->pw_uid);
printf ("%d ",p->pw_gid);*/
}
if (g) printf ("%-8s ",g->gr_name);
printf ("%10lu %s %15s\n", (unsigned long) sbuf[i].st_size, date3, patch);
}
}
}
else
{
printf ("Problem getting information\n");
perror (argv[i + 1]);
}
free (sbuf), sbuf = NULL;
}
return 0;
} |
Partager