IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Programmation de la commande who en C


Sujet :

Linux

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 1
    Par défaut Programmation de la commande who en C
    Bonjour,
    je dois reprogrammer la commande who et je rencontre diverse probleme notamment, au niveau de la compatibilte linux(unbuntu 9.04)/unix(pc-bsd). Mais aussi des problemes
    d affichage.

    Probleme d affichage ubuntu
    pour pouvoir recoder la fonction je parcours les fichiers utmp et wtmp(voir man).
    je dois afficher le nom du user(ut_user), le nom du peripherique tty, la date et l adresse ip. mais pour l ip j arrive pas l afficher car de type int32 quel format puis-je tiliser pour l affichage?
    il m est interdit d utilise atime, ctime ou tout autre fonction dans le genre pr l affichage, j ai pensee a ecrire une fonction pour ca, mais en regardant le man utmp j ai la structure struct ut_tv pour m aider mais je sais pas comment m y prendre.
    je vous montre deja le code de ma fonction qui n affiche seulement que le ut_user et le ut_line(tty);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    int	who(char *file)
    {
      struct	utmp *ut;
      int	       	     nb_read;                                                           
      int		     fd;
      int		     i;                                                         
      fd = open(file, O_RDONLY);
      if (fd == -1)
        {
          my_putstr("error opening file\n");
          exit (-1);
          }
      i = 0;
      while((nb_read = read(fd, ut, sizeof(*ut))) > 0)
     
        {
          printf("%s %s\n", ut->ut_name, ut->ut_line);      
        }
    }
     
    int	main(char ac, char **av)
    {
      who("/var/run/utmp");
      return(0);
    }
    A l execution j ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    reboot ~
    runlevel ~
    LOGIN tty5
    LOGIN tty4
    LOGIN tty2
    LOGIN tty3
    LOGIN tty6
    LOGIN tty1
    serialp tty7
    serialp pts/0
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    serialp  tty7         2009-06-17 18:08 (:0)
    serialp  pts/0        2009-06-17 20:27 (:0.0)
    comment parcourir mon fichier et recuperer que les utilsateur connecter comme le fait la commande who. sous pc-bsd par exple les parties LOGIN sont remplaces par un grand espace vide ensuite suivent les utlisateurs connectes avant et/ou apres les esapces.

    vos conseils, commentaires et suggestions seront les biensvenu.
    desole d avoir ete long mais je ne suis qu un simple debutant.

    PS: je n ai pas tellement aborde la question de pc-bsd mais il suivra peut etre apres resolution de ce pobleme mais elle debatera plus au niveau de la compatibilte systeme.

    Bien a vous

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut
    Bonsoir,

    J'ai déjà eu l'occasion de reprogrammer la commando who, mais en Perl !

    Je te montre mon code, à toi de trouver l'équivalent en C, c'est tout simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/local/bin/perl -w
     
    use strict;
     
    open FILE, '/var/run/utmp' or die $!;
     
    while (read(FILE, my $buffer, 44) > 0) {
        my ($line, $name, $hostname, $time) = unpack("Z8 Z16 Z16 i", $buffer);
        next unless $name;
        printf "%s\t%s\t%s", $name, $line, scalar localtime $time;
        printf " (%s)", $hostname if $hostname;
        print "\n";
    }
    L'affichage est tout simplement parfait (Uniquement compatible sur FreeBSD 5.5-RELEASE-p14)

    (p4p4rr0t@cobra 1043)./who.pl
    toto ttyp0 Wed Jun 17 22:39:55 2009 (XXX.XXX.XXX.XXX)
    tata ttyp1 Wed Jun 17 22:40:51 2009 (:0.0)
    tata ttyp2 Wed Jun 17 22:58:12 2009 (:0.0)
    p4p4rr0t ttyp3 Wed Jun 17 23:21:32 2009 (my-domaine)
    titi ttyp4 Wed Jun 17 16:04:25 2009 (my-domaine)
    tata :0 Wed Jun 17 22:40:49 2009
    Cdlt,

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par theserial_p Voir le message
    mais pour l ip j arrive pas l afficher car de type int32 quel format puis-je tiliser pour l affichage?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <stdint.h>
    #include <inttypes.h>
     
    int32_t ip = 123456;
    printf("%" PRId32 "\n", ip);

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Plutot que de parser ces fichiers a la main, pourquoi ne pas utiliser les fonctions prevues pour ce faire, comme getutxent() ?

    Extrait du man :
    getutxent()
    The getutxent() function reads in the next entry from a
    utmpx database. If the database is not already open, it
    opens it. If it reaches the end of the database, it fails.
    Sinon, ne pas utiliser utmp, mais utmpx :
    The utmp and wtmp database files are obsolete and are no
    longer present on the system. They have been superseded by
    the extended database contained in the utmpx and wtmpx data-
    base files. See utmpx(4).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/03/2009, 17h59
  2. Commande who en C
    Par CARNIBAL dans le forum Linux
    Réponses: 5
    Dernier message: 29/01/2009, 16h06
  3. probleme de programmation de la commande locate
    Par louve_garoute dans le forum C
    Réponses: 8
    Dernier message: 29/05/2006, 22h24
  4. programmer un panier / commande
    Par ddeee dans le forum ASP
    Réponses: 8
    Dernier message: 16/02/2006, 14h33
  5. Réponses: 7
    Dernier message: 22/09/2005, 10h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo