Pipes and passwd programm problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I would like to interface with passwd program in Debian Linux using pipes to be able to change password from a C program.

Problem is in reading output from passwd program.

I have observed interesting behavior with passwd program.

---------------------------

[nikola@host][~]$ passwd
Changing password for zip
(current) UNIX password:
[ENTER]
passwd: Authentication failure
[nikola@host][~]$


[nikola@host][~]$ passwd 1> /dev/null
(current) UNIX password:
[ENTER]
passwd: Authentication failure
[nikola@host][~]$


[nikola@host][~]$ passwd 2> /dev/null
Changing password for zip
[ENTER]
[nikola@host][~]$


---------------------------

Program is using both STDOUT and STDERR for output.


program.c
---------------------------

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

#define BSIZE 500

int read_chars(FILE *rstream){
       char ch;

       while(!feof(rstream)){
               ch = fgetc(rstream);
               printf("%c",ch);
       }

       fflush(NULL);

       return 0;
}


int main(int argc, char **argv){


       int rfds[2];
       int stdout_wfds[2];
       int stderr_wfds[2];

       pid_t pid;


       if(argc < 3){
               fprintf(stderr,"Error: In argument count\n");
               exit(1);
       }


       pipe(rfds);
       pipe(stdout_wfds);
       pipe(stderr_wfds);


       pid = fork();
       if( pid == 0 ){ // child
               close(rfds[1]);
               close(stdout_wfds[0]);
               close(stderr_wfds[0]);


               dup2(rfds[0],STDIN_FILENO);
               dup2(stdout_wfds[1],STDOUT_FILENO);
               dup2(stderr_wfds[1],STDERR_FILENO);

               execlp("passwd","passwd",0);

       } else { // parent

               FILE *rstream_out,*rstream_err,*wstream;
               char buffer[BSIZE];

               wstream = fdopen(rfds[1],"w");
               rstream_out = fdopen(stdout_wfds[0],"r");
               rstream_err = fdopen(stderr_wfds[0],"r");


               // PROBLEM !!!!!!!!!!!!!!!!!!!
               // this is supposed to read 2 lines of passwd output
               // but seems it doesn't work
               read_chars(rstream_out);
               read_chars(rstream_err);


               close(rfds[1]);
               close(stdout_wfds[0]);
               close(stderr_wfds[0]);

               waitpid(pid,NULL,0);
       }

       return 0;
}

---------------------------


tnx in advance.
Nikola.


-
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux