mayapour | Bonjour,
J'ai besoin de conseils pour les listes chainées.
Mon programme fait ce que je veux, c'est à dire sauvegarde dans un fichier du login, pass et shell entré (option a) et liste (option l) ou efface (option d) (avec cryptage du mot de passe).
Mais voilà, je souhaiterai qu'il ne sauvegarde pas dans un fichier mais dans une liste chainée (donc en mémoire dynamique).
J'ai tenté de remplacer la structure ci dessous par quelque chose comme :
typedef struct Element{
int val;
struct Element *next;
}Element; Mais j'ai trop d'erreurs.
Des idées ?
Code :
- struct my_passwd
- {
- char pw_name[255]; /* user name */
- char pw_passwd[255]; /* password */
- char pw_shell[64]; /* default shell */
- } ;
- int woptions(int ac,char ***av)
- {
- int option2return;
- option2return=getopt(ac, *av,"adl" );
- if(getopt(ac,*av,"adl" ) != -1)
- {
- printf("my_passwd: usage -[adl] [file]\n" );
- exit(EXIT_FAILURE);
- }
- else
- return option2return;
- }
- int ajoututilisateur(char *fichier)
- {
- struct my_passwd pwd;
- int fd;
- MD5_CTX ctx;
- memset(&pwd, 0,sizeof(pwd));
- printf("Username: " );
- scanf("%s",pwd.pw_name);
- printf("Password: " );
- scanf("%s",pwd.pw_passwd);
- MD5Init(&ctx);
- MD5Update(&ctx,pwd.pw_passwd,strlen(pwd.pw_passwd));
- MD5End(&ctx,pwd.pw_passwd);
- printf("Shell: " );
- scanf("%s",pwd.pw_shell);
- if((fd = open(fichier, O_RDWR|O_APPEND)) == -1)
- {
- perror("my_passwd" );
- exit(EXIT_FAILURE);
- }
- if((write(fd, &pwd, sizeof(pwd))) == -1)
- {
- perror("my_passwd" );
- exit(EXIT_FAILURE);
- }
- close(fd);
- return 1;
- }
- int effaceutilisateur(char *fichier)
- {
- struct my_passwd pwd;
- int fd;
- int userexist=0;
- char *nom;
- int taille;
- int totalsize=0;
- nom=malloc(sizeof(char *));
- memset(&pwd, 0,sizeof(pwd));
- printf("Username: " );
- scanf("%s",nom);
- if((fd = open(fichier, O_RDWR)) == -1)
- {
- perror("my_passwd" );
- exit(EXIT_FAILURE);
- }
- while((taille=read(fd,&pwd,sizeof(pwd))) != 0)
- {
- totalsize += taille;
- if(strcmp(nom,pwd.pw_name) == 0)
- {
- while((taille=read(fd,&pwd,sizeof(pwd))) != 0)
- {
- lseek(fd,(totalsize-sizeof(pwd)),SEEK_SET);
- if((write(fd, &pwd, sizeof(pwd))) == -1)
- {
- perror("my_passwd" );
- exit(EXIT_FAILURE);
- }
- totalsize += taille;
- lseek(fd,totalsize,SEEK_SET);
- }
- userexist=1;
- }
- }
- close(fd);
- if(userexist==0)
- {
- printf("my_passwd: unknown user %s\n",nom);
- }
- else
- truncate(fichier,totalsize-sizeof(pwd));
- return 1;
- }
- int listeutilisateur(char *fichier)
- {
- struct my_passwd pwd;
- int fd;
- char *nom;
- memset(&pwd, 0,sizeof(pwd));
- if((fd = open(fichier, O_RDWR)) == -1)
- {
- perror("my_passwd" );
- exit(EXIT_FAILURE);
- }
- while((read(fd,&pwd,sizeof(pwd))) != 0)
- {
- printf("Username: %s\n",pwd.pw_name);
- printf("Password: %s\n",pwd.pw_passwd);
- printf("Shell: %s\n\n",pwd.pw_shell);
- }
- close(fd);
- return 1;
- }
- int nbrconf(int ac)
- {
- if(ac!=3)
- {
- printf("my_passwd: usage -[adl] [file]\n" );
- exit(EXIT_FAILURE);
- }
- else
- return 1;
- }
- int fichierlu(char *fichier)
- {
- struct stat s_sb;
- if(lstat(fichier,&s_sb) != 0)
- {
- perror("my_passwd" );
- exit(EXIT_FAILURE);
- }
- else
- {
- if(!S_ISREG(s_sb.st_mode))
- {
- printf("my_passwd: need a file\n" );
- printf("my_passwd: usage -[adl] [file]\n" );
- }
- else
- return 1;
- }
- }
- void priseoption(int choixoption, char *fichier)
- {
- switch (choixoption)
- {
- case 'a':
- ajoututilisateur(fichier);
- break;
- case 'd':
- effaceutilisateur(fichier);
- break;
- case 'l':
- listeutilisateur(fichier);
- break;
- }
- }
- int main(int ac, char **av)
- {
- int choixoption;
- extern int opterr;
- opterr=0;
- nbrconf(ac);
- choixoption=woptions(ac,&av);
- fichierlu(av[2]);
- priseoption(choixoption,av[2]);
- }
|
MERCI par avance Message édité par mayapour le 23-06-2006 à 16:17:58
|