Calling a script with a setuid set
Check for errors in stat, setuid, fork, and execvp, to name a few.  If the exec fails in the child you should call exit.
Do you really want the p in execvp?  This is not guaranteed to be the same as the argv[1] you just stat-ed.  If argv[1] is ls your stat will look for a file at ./ls and it will likely find the program in /bin.  I would use execve and either do that PATH lookup yourself or simply omit that part and require the user to specify a full path for something in PATH (eg. /bin/ls instead of just ls).
The stat + observe state + exec thing is a race condition.  Another process can change the attributes on the file in that timing window.  This may or may not be important to you.  Given that this is a security-ish program I would say it may very well be.
Instead of returning 0, you might want to return the child process's exit code (which you can get with waitpid.)  You might also want to return nonzero when the functions I mention in #1 fail.  This way a shell script or something calling you programmatically can determine success or failure.