why is read returning 0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define MAXLINE 256
#define MAX_PASSWORD 10

#define SUCCESS "Password verified\n"
#define INVALID "Invalid password\n"
#define NO_USER "No such user\n"

int main(void) {
  char user_id[MAXLINE];
  char password[MAXLINE];

  /* The user will type in a user name on one line followed by a password 
     on the next.
     DO NOT add any prompts.  The only output of this program will be one 
	 of the messages defined above.
     Please read the comments in validate carefully
   */

  if(fgets(user_id, MAXLINE, stdin) == NULL) {
      perror("fgets");
      exit(1);
  }
  if(fgets(password, MAXLINE, stdin) == NULL) {
      perror("fgets");
      exit(1);
  }
  
  int status;
  int fd[2];
  pipe(fd);

  pid_t ret = fork();
  if (ret < 0) {
    perror("fork");
    exit(1);
  }
  else if (ret > 0) {
    close(fd[0]);
    if (write(fd[1], user_id, MAX_PASSWORD) == -1 ) {
      perror("write to pipe");
    }
    if (write(fd[1], password, MAX_PASSWORD) == -1 ) {
      perror("write to pipe");
    }
    close(fd[1]);
    
    if ((ret = wait(&status)) == -1) {
    perror("wait");
    exit(1);
    }

    if (WIFEXITED(status)) {
      int exit_status = WEXITSTATUS(status);

      if (exit_status == 0) {
        printf(SUCCESS);
      }
      else if (exit_status == 2) {
        printf(INVALID);
      }
      else if (exit_status == 3){
        printf(NO_USER);
      }
    }
  }
  else {
    close(fd[1]);
    dup2(fd[0], fileno(stdin));
    read(fd[0], user_id, MAX_PASSWORD);
    read(fd[0], password, MAX_PASSWORD);
    close(fd[0]);   
    execl("./validate", "validate", user_id, password, NULL);
  }

  return 0;
}