Implementation of system() function in Linux using fork() , exec() and waitpid() system calls
I think the biggest mistake is the return after the exec.  If you reach that point, and return, you have returned to the calling function in the subprocess.  Use exit() instead.  Note that the value you pass to exit should come out in wstatus.  Note also, if execle returns, it must have failed, so don't even both checking the status.  (For this to happen, the path must be invalid.  Change it for testing, and set it back afterwards.)

The use of execle() is a mistake.  You didn't pass an environment.  Use execl() instead.

You have at least one case where you return -1 without having set errno.  Set errno.  (Many cases, something else has already set errno for you.)

One other thing that can bite you:  If the caller has made another subprocess, and it terminates while you are waiting for your subprocess, you will return the result of the wrong subprocess.  To fix this, pass the pid as the first parameter to waitpid().

As a style issue, I would recommend moving wstatus completely into the last block.  And nothing should ever come out of the compound if statement.

As a personal style point: I tend to use switch to test for -1, 0, or other.  if statements work equally well.