#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define MAXLINE 256

#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);
  }
  
  // TODO
  int n = fork();
  if (n < 0) {
      perror("fork");
      exit(1);
  } else if (n == 0) { // child process
      execl("./validate", "validate", user_id, password, NULL);
      perror("execl");
      exit(1);
  } else { // parent process
      int status;
      pid_t child_pid = wait(&status);
      if (child_pid == -1) {
          perror("wait");
          exit(1);
      }
      
      if (WIFEXITED(status)) {
          int child_status = WEXITSTATUS(status);
          if (child_status == 0) {
              printf(SUCCESS);
          } else if (child_status == 2) {
              printf(INVALID);
          } else if (child_status == 3) {
              printf(NO_USER);
          }
      }
  }
  

  return 0;
}
Your task is to complete checkpasswd.c, which reads a user id and password from stdin, creates a new process to run the validate program, sends it the user id and password, and prints a message to stdout reporting whether the validation is successful.

Your program should use the exit status of the validate program to determine which of the three following messages to print:

"Password verified" if the user id and password match.
"Invalid password" if the user id exists, but the password does not match.
"No such user" if the user id is not recognized
The exact messages are given in the starter code as defined constants.

The only case that should be handled directly in checkpasswd is the case where either the userid or password are too long.  This is to prevent sending the wrong number of bytes to validate.

Note that in the given password file pass.txt, the "killerwhales:swim" has a user id that is too large, and "monkeys:eatcoconuts" has a password that is too long. The examples are expected to fail, but the other cases should work correctly.