• STATISTIQUES
  • Il y a eu un total de 0 membres et 41802 visiteurs sur le site dans les dernières 24h pour un total de 41 802 personnes!
    Membres: 2 605
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Le site du zero
    Découvrez gratuitement la programmation (C, C++, PHP, MySQL, XHTML, CSS...), Linux, le Mapping, la modé...
    Programmation
    [FR] Microcontest
    Cryptographie: 7, Mathématiques: 8, Image Son Vidéo: 5, Intelligence artificielle: 3, Réseau: 2, Divers: 7, Phy...
    Challenges
    [FR] NewbieContest
    Nous vous proposons une série de challenges regroupant plusieurs domaines allant de l'exploitation de fail...
    Hacking
    [FR] PHP France
    Pour tout savoir sur le PHP, en français. Vous trouverez des tutoriels, des exemples, des astuces, toute la do...
    Hacking
    [EN] Hack this site
    Basic: 11, Realistic: 17, Application: 18, Programming: 12, Extbasic: 14, Javascript: 7, Stego: 17
    Challenges
    [EN] Reddit
    Subreddit dédié à la sécurité informatique.
    Hacking
    [EN] wechall
    Pour les gens n'étant pas familiers avec les sites de challenges, un site de challenges est un site propos...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C] My_ls
01-05-2013, 21h29
Message : #1
Darmo Hors ligne
Newbie
*



Messages : 22
Sujets : 3
Points: 6
Inscription : Mar 2013
[C] My_ls
Plop!
Comme promis, voici mon my_ls (ne vous étonnez pas de la syntaxe, c'est celle d'Epitech):
my_ls.h :
Code :
#ifndef        MY_LS_H
#define        MY_LS_H
#include    <dirent.h>
#include    <sys/types.h>
#include    <sys/stat.h>
#include    <unistd.h>
#include    <stdlib.h>
#include    <stdio.h>
#include    <grp.h>
#include    <pwd.h>
#include    <time.h>
#include    <string.h>

struct        opt
{
  int        opt_l;
  int        opt_R;
  int        opt_d;
  int        opt_r;
  int        opt_t;
};

void        check_opt(struct opt *opts, int i, int j, char *argv[]);
int        count_dir(char *argv[]);
int        count_files(char path[]);
void        directory(char dir[], struct opt options);
int        *getargs(char *argv[], struct opt *opts, int ok);
char        *getpath(char dirname[], char path[]);
size_t        get_mtime(char filename[]);
size_t        get_size(char **path__of_files, int nb_files, char path[]); //stat.c
void            init_struct(struct opt *opt);
int        is_dir(char path[]);
int        my_ls(int *path, char *argv[],struct opt options, int i);
void        my_ls_end(char **file_index, char path[], int nb_files, struct opt options);
int        my_lsNoDir(char *argv[], struct opt options);
char            *my_strcat(char *dest, char *src);
int        my_strcmp(const char *s1, const char *s2);
char            *my_strcpy(char *dest, const char *src);
char        *my_strdup(const char *s);
void        print_file_right(struct stat *status);
void        print_stat(char filename[]);
void        recursive(char path[], struct opt options);
void        recursive_end(char **path_of_dir, int nb_file, struct opt options);
void        recursive_print(char path[], struct opt options, char **path_of_dir, char **files);
char        **rempl_index(char path[], int nb_files);
char        **rempl_index_path(char path[], int nb_files);
void        sort_tab(char **tab, int n, struct opt options);
#endif

main.c :
Code :
#include        "my_ls.h"

int             main (int argc, char **argv)
{
  int           nb_dir;
  int           n;
  int           i;
  int           *tab = NULL;
  struct opt    options;

  i = 0;
  nb_dir = count_dir(argv);
  init_struct(&options);
  tab = getargs(argv, &options, nb_dir);
  if (nb_dir == -1)
    my_lsNoDir(argv, options);
  else
    my_ls(tab, argv, options, i);
  return (0);
}

int             my_ls(int *path, char *argv[], struct opt options, int i)
{
  int           path_num;
  char          **file_index;
  int        nb_files;

  while (path[i] != '\0')
    {
      path_num = path[i];
      nb_files = count_files(argv[path_num]);
      if (check_dir_exist(argv[path_num]) != -1)
    {
      if (options.opt_d == 1)
        directory(argv[path_num], options);
      else
        {
          file_index = rempl_index(argv[path_num], nb_files);
          sort_tab(file_index, nb_files, options);
          if (options.opt_R == 1)
        recursive(argv[path_num], options);
          else
        my_ls_end(file_index, argv[path_num], nb_files, options);
        }
    }
      i++;
    }
  return (0);
}
    
int             my_lsNoDir(char *argv[], struct opt options)
{
  char          **file_index;
  int           nb_files;

  nb_files = count_files(".");
  if (options.opt_d == 1)
    directory(".", options);
  else
    {
      file_index = rempl_index(".", nb_files);
      sort_tab(file_index, nb_files, options);
      if (options.opt_R == 1)
    recursive(".", options);
      else
    my_ls_end(file_index, ".",  nb_files, options);
    }
  return (0);
}

void        my_ls_end(char **file_index, char path[], int nb_files, struct opt options)
{
  int        i;
  char        **path_of_files;

  i = 0;
  path_of_files = rempl_index_path(path, nb_files);
  sort_tab(path_of_files, nb_files, options);
  if (options.opt_t == 1)
    {
      sort_tab_mtime(path_of_files, nb_files);
      sort_tab_mtime(file_index, nb_files);
    }
  if (options.opt_l == 1)
    my_printf("Total: %d", get_size(path_of_files, nb_files, path));
  while (i < nb_files)
    {
      if (options.opt_l == 1)
    print_stat(path_of_files[i]);
      my_printf("%s\n", file_index[i]);
      i++;
    }
}
args.c :
Code :
#include    "my_ls.h"

int        *getargs(char *argv[], struct opt *opts, int ok)
{
  int        i;
  int        j;
  int        n;
  int        *path;

  n = 0;
  i = 1;
  j = 0;
  path = NULL;
  if (ok != -1) {
    if ((path = calloc(ok, sizeof (int))) == NULL)
      exit(0);
  }
  while (argv[i] != '\0') {
    if (argv[i][j] == '-') {
      while (argv[i][j] != '\0') {
    j++;
    if (argv[i][j] == 'l')
      opts->opt_l = 1;
    if (argv[i][j] == 'R')
      opts->opt_R = 1;
    if (argv[i][j] == 'd')
      opts->opt_d = 1;
    if (argv[i][j] == 'r')
      opts->opt_r = 1;
    if (argv[i][j] == 't')
      opts->opt_t = 1;
      }
    }
    else if (ok != -1 || ok != 0) {
      path[n] = i;
      n++;
      ok--;
    }
    j = 0;
    i++;
  }
  return (path);
}

count.c :
Code :
#include    "my_ls.h"

int        count_dir(char *argv[])
{
  int        n;
  int        i;
  
  i = 1;
  n = 0;
  while (argv[i] != '\0')
    {
      if (argv[i][0] != '-')
    n++;
      i++;
    }
  if (n == 0)
    return (-1);
  else
    return (n);
}

int        count_files(char path[])
{
  DIR        *dir;
  struct dirent *entry;
  int        i;

  i = 0;
  dir = opendir(path);
  while ((entry = readdir(dir)) != NULL)
    if (entry->d_name[0] != '.')
      i++;
  return (i);
}

directory.c :
Code :
#include    "my_ls.h"

void        directory(char dir[], struct opt options)
{
  if (options.opt_l == 1)
    print_stat(dir);
  my_printf("%s\n", dir);
}

int        check_dir_exist(char directory[])
{
  DIR        *dir;
  
  if ((dir = opendir(directory)) == NULL)
    {
      my_printf("my_ls: impossible d'acceder a %s: Aucun fichier ou dossier de ce type", directory);
      return (-1);
    }
  else
    return (0);
}

index.c :
Code :
#include    "my_ls.h"

char        **rempl_index(char path[], int nb_files)
{
  DIR        *dir;
  struct dirent *entry;
  int        i;
  char        **tab;

  tab = NULL;
  i = 0;
  tab = calloc(nb_files, sizeof(char *));
  dir = opendir(path);
  while ((entry = readdir(dir)) != NULL)
    {
      if (entry->d_name[0] != '.') {
    tab[i] = strdup(entry->d_name);
    i++;
      }
    }
  closedir(dir);
  return (tab);
}

char            **rempl_index_path(char path[], int nb_files)
{
  DIR           *dir;
  struct dirent *entry;
  int           i;
  char          **tab;

  tab = NULL;
  i = 0;
  tab = calloc(nb_files, sizeof(char *));
  if ((dir = opendir(path)) == NULL)
    perror("my_ls");
  while ((entry = readdir(dir)) != NULL)
    {
      if (entry->d_name[0] != '.') {
    tab[i] = getpath(entry->d_name, path);
        i++;
      }
    }
  closedir(dir);
  return (tab);
}

init.c :
Code :
#include    "my_ls.h"

void        init_struct(struct opt *opt)
{
  opt->opt_l = 0;
  opt->opt_R = 0;
  opt->opt_r = 0;
  opt->opt_d = 0;
  opt->opt_t = 0;
}

recursive.c :
Code :
#include    "my_ls.h"

void        recursive(char path[], struct opt options)
{
  int        i;
  char        **files;
  int        nb_files;
  char        **path_of_dir;
  
  i = 0;
  nb_files = count_files(path);
  files = rempl_index(path, nb_files);
  path_of_dir = rempl_index_path(path, nb_files);
  sort_tab_mtime(path_of_dir, nb_files, options);
  if (options.opt_t == 1)
    sort_tab_mtime(files, nb_files, options);
  else
    sort_tab(files, nb_files, options);
  recursive_print(path, options, path_of_dir, files);
  nb_files = count_files(path);
  recursive_end(path_of_dir, nb_files, options);
}

void        recursive_end(char **path_of_dir, int nb_files, struct opt options)
{
  int        i;

  i = 0;
  while (i < nb_files)
    {
      if (is_dir(path_of_dir[i]) == 1)
    recursive(path_of_dir[i], options);
      i++;
    }
}
int        is_dir(char path[])
{
  struct stat    status;

  stat(path, &status);
  if (S_ISDIR(status.st_mode))
    return (1);
  else
    return (0);
}

char        *getpath(char dirname[], char path[])
{
  char        *dirpath;
  int        size;
  int        i;
  
  i = 0;
  dirpath = NULL;
  i = my_strlen(path);
  size = i;
  size = size + my_strlen(dirname);
  dirpath = calloc(size, sizeof(char*));
  my_strcat(dirpath, path);
  if (dirpath[i-1] != '/')
    dirpath[i] = '/';
  i++;
  my_strcat(dirpath, dirname);
  return (dirpath);
}

void        recursive_print(char path[], struct opt options, char **path_of_dir, char **files)
{
  int        i;
  
  i = 0;
  my_printf("\n%s:\n", path);
  while (i < (count_files(path)))
    {
      if(options.opt_l == 1)
    {
      print_stat(path_of_dir[i]);
      my_printf("%s\n", files[i]);
    }
      else
    my_printf("%s\n", files[i]);
      i++;
    }
}

sort.c :
Code :
#include    "my_ls.h"

void        sort_tab(char **tab, int n, struct opt options)
{
  int        i;
  int        j;
  char        *temp;

  i = 0;
  while (i < n)
    {
      j = 0;
      while (j < n)
    {
      if ((options.opt_r) ? (my_strcmp(tab[i], tab[j]) > 0) : (my_strcmp(tab[i], tab[j]) < 0))
        {
          temp = tab[i];
          tab[i] = tab[j];
          tab[j] = temp;
          }
      j++;
    }
      i++;
    }
}

void        sort_tab_mtime(char **tab, int n, struct opt options)
{
  int           i;
  int           j;
  char          *temp;
  int        r;

  r = options.opt_l;
  i = 0;
  while (i < n)
    {
      j = 0;
      while (j < n)
        {
          if ((r) ? (get_mtime(tab[i]) > get_mtime(tab[j])) : (get_mtime(tab[i]) < get_mtime(tab[j])))
            {
              temp = tab[i];
              tab[i] = tab[j];
              tab[j] = temp;
        }
          j++;
    }
      i++;
    }
}

size_t        get_mtime(char filename[])
{
  struct stat    status;
  stat(filename, &status);
  return (status.st_mtime);
}

stat.c :
Code :
#include    "my_ls.h"

void        print_stat(char filename[])
{
  struct stat    status;
  struct passwd    *pwuid;
  struct group    *grp;
  char        *tab;
  int        i;

  i = 0;
  if (stat(filename, &status) == -1)
    perror("stat");
  else
    {
      print_file_right(&status);
      if ((pwuid = getpwuid(status.st_uid)) == NULL)
    perror("getpwuid");
      else
    {
      my_printf(" %s", pwuid->pw_name);
      grp = getgrgid(status.st_gid);
      my_printf(" %s", grp->gr_name);
      my_printf(" %d", status.st_size);
      tab = ctime(&(status.st_mtime));
      while (tab[i] != '\0')
        i++;
      tab[i-1] = '\0';          //Enlever ce foutu '\n' que ctime met à la fin de la chaine
      my_printf(" %s ", tab);
    }
    }
}

void        print_file_right(struct stat *status)
{
  my_printf(S_ISDIR(status->st_mode) ? "d" : "-");
  my_printf(status->st_mode & S_IRUSR ? "r" : "-");
  my_printf(status->st_mode & S_IWUSR ? "w" : "-");
  my_printf(status->st_mode & S_IXUSR ? "x" : "-");
  my_printf(status->st_mode & S_IRGRP ? "r" : "-");
  my_printf(status->st_mode & S_IWGRP ? "w" : "-");
  my_printf(status->st_mode & S_IXGRP ? "x" : "-");
  my_printf(status->st_mode & S_IROTH ? "r" : "-");
  my_printf(status->st_mode & S_IWOTH ? "w" : "-");
  my_printf(status->st_mode & S_IXOTH ? "x" : "-");
}

size_t        get_size(char **path_of_files, int nb_files, char path[])
{
  struct stat    status;
  int        i;
  size_t    total;
  size_t    tot;
  
  
  total = 0;
  i = 0;
  while (i < nb_files)
    {
      stat(path_of_files[i], &status);
      total += status.st_size;
      i++;
    }
  stat(path, &status);
  total += status.st_size;
  tot = total / 966;
  return (tot);
}

Voilà Smile
Les critiques et les conseils sont les bienvenus :p
+1 (0) -1 (0) Répondre
01-05-2013, 21h40 (Modification du message : 01-05-2013, 21h40 par fr0g.)
Message : #2
fr0g Hors ligne
NTEuNDI2MzcsLTEuNzc4NDg4
*****



Messages : 348
Sujets : 22
Points: 56
Inscription : Aug 2011
RE: [C] My_ls
Cool de le partager, (plus complet que le mien :') )
+1 (0) -1 (0) Répondre
01-05-2013, 22h16
Message : #3
Darmo Hors ligne
Newbie
*



Messages : 22
Sujets : 3
Points: 6
Inscription : Mar 2013
RE: [C] My_ls
Peut-être, mais il reste des trucs à améliorer comme le tris alphabétique (problême avec les noms contenant des majuscules) :p
+1 (0) -1 (0) Répondre
01-05-2013, 22h59
Message : #4
Dobry Hors ligne
Tueur de lamouz
*



Messages : 206
Sujets : 25
Points: 73
Inscription : Aug 2011
RE: [C] My_ls
Pas eu le temps de regarder, mais j'aurais jamais pensé qu'un LS soit aussi complexe !
Merci du partage !
Aestuārium Erudītiōnis

There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
+1 (0) -1 (0) Répondre
01-05-2013, 23h02
Message : #5
Darmo Hors ligne
Newbie
*



Messages : 22
Sujets : 3
Points: 6
Inscription : Mar 2013
RE: [C] My_ls
Le code est pas tellement complexe (enfin j'arrive à lire mon code, je ne sais pas si il est clair pour les autres), mais long, enfin c'est que mon deuxième projet qui fait + de 200 lignes quoi Tongue
+1 (0) -1 (0) Répondre
01-05-2013, 23h03
Message : #6
Trivial Hors ligne
Membre actif
*



Messages : 223
Sujets : 10
Points: 29
Inscription : Aug 2011
RE: [C] My_ls
Merci du partage bro Smile

(Même si je l'ai déjà chopé sur ton vps o_Q)
Citation :manger informatique, dormir informatique, chier informatique sans jamais avoir l'impression que ça nous accable ou que c'est relou, c'est ça être passionné - j0rn
+1 (0) -1 (0) Répondre
01-05-2013, 23h05
Message : #7
Darmo Hors ligne
Newbie
*



Messages : 22
Sujets : 3
Points: 6
Inscription : Mar 2013
RE: [C] My_ls
LEECHER! :')
+1 (0) -1 (0) Répondre
01-05-2013, 23h05 (Modification du message : 01-05-2013, 23h05 par Kiwazaru.)
Message : #8
Kiwazaru Hors ligne
Padawan d'un super escargot
*



Messages : 284
Sujets : 26
Points: 139
Inscription : Mar 2012
RE: [C] My_ls
"Pas eu le temps de regarder, mais j'aurais jamais pensé qu'un LS soit aussi complexe !
Merci du partage ! "

Faut pas se fier aux apparences Smile

Si tu regardes le code, tu vas voir la doc des fonctions dont tu ne connais pas l'utilité, tu comprends le principe de LS et puis ça coule de source :p
Toucher au Kernel, c'est un peut comme se shooter au LSD, on pense pouvoir tout faire mais ça finit souvent mal.
+1 (0) -1 (0) Répondre
01-05-2013, 23h07
Message : #9
Darmo Hors ligne
Newbie
*



Messages : 22
Sujets : 3
Points: 6
Inscription : Mar 2013
RE: [C] My_ls
Sinon des avis sur le code? Smile Les trucs à améliorer, à rendre plus clair?
+1 (0) -1 (0) Répondre
01-05-2013, 23h12
Message : #10
Kiwazaru Hors ligne
Padawan d'un super escargot
*



Messages : 284
Sujets : 26
Points: 139
Inscription : Mar 2012
RE: [C] My_ls
Personnellement je lirais le code demain, j'ai eu ma dose d'info today (installation de Linux à maintes et maintes reprises sans succès :'( ).
Toucher au Kernel, c'est un peut comme se shooter au LSD, on pense pouvoir tout faire mais ça finit souvent mal.
+1 (0) -1 (0) Répondre
02-05-2013, 00h51
Message : #11
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
RE: [C] My_ls
Moi j'ai remarquer des fautes de normes! :p
+1 (0) -1 (0) Répondre
02-05-2013, 07h48
Message : #12
Sh4dows Hors ligne
Tweetos
*



Messages : 293
Sujets : 5
Points: 49
Inscription : Dec 2012
RE: [C] My_ls
Citation :Moi j'ai remarquer des fautes de normes! Tongue
Tu n'es pas le seul Wink
Faites ce que je dis et non ce que je fais !
+1 (0) -1 (0) Répondre
02-05-2013, 18h09
Message : #13
Darmo Hors ligne
Newbie
*



Messages : 22
Sujets : 3
Points: 6
Inscription : Mar 2013
RE: [C] My_ls
Erf, la norme :p quoi comme fautes? Smile
+1 (0) -1 (0) Répondre
02-05-2013, 20h19 (Modification du message : 02-05-2013, 20h26 par Sh4dows.)
Message : #14
Sh4dows Hors ligne
Tweetos
*



Messages : 293
Sujets : 5
Points: 49
Inscription : Dec 2012
RE: [C] My_ls
Alors les define déjà c'est pas comme ça :
Code C :

#define        MY_LS_H
 

Mais comme ça :
Code C :

# define       _MY_LS_H_
 

Ensuite les includes dans les headers, tu c'est pas interdit mais a chaque fois on te dis que c'est dégeulasse !
Dans la fonction main tu initialises en même temps que tu déclares (peut être ailleurs aussi..) :
Code C :
  int           *tab = NULL;


Pas d'espace en fin de ligne, les noms des variables (déclaration) doivent être alignés avec
celui des fonctions.
Code :
char        **rempl_index(char path[], int nb_files)
{
  DIR        *dir;
  struct dirent *entry;
  int        i;
  char        **tab;
// ...

Maximum 25 lignes par fonction et 4 (ou 5 ; j'ai un doute là) fonctions par fichier !
J'ai du en oublié, si j'passe une moulinette tu prends chère Big Grin

De toute manière ça vaut 1 ça car il manque les headers dans tes fichiers Tongue

Sinon tu veux aller à Epitech ?

EDIT : Faut pas de majuscule dans les noms de fonction ^^
Faites ce que je dis et non ce que je fais !
+1 (0) -1 (0) Répondre
02-05-2013, 20h29
Message : #15
Darmo Hors ligne
Newbie
*



Messages : 22
Sujets : 3
Points: 6
Inscription : Mar 2013
RE: [C] My_ls
Oula! :p Heureusement que je suis pas à Epitech, je me serais fais tapé dessus! ^^
Le coup de l'initialisation de **tab = NULL; c'est une erreur bête, j'y fais gaffe d'habitude :/
J'aimerais bien y aller, mais c'est une école très cher, je préfère avoir des retours sur l'école 42 qui va ouvrir cette année, et qui elle, est gratuite :p
En tout cas merci d'avoir pris le temps de lire mon code Wink
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut