forma correcta de ejecutar programas setuid en C

Tengo un proceso con permisos 4750. Existen dos usuarios en mi sistema Linux. El usuario root y el usuario appz. El proceso hereda los permisos de un administrador de procesos que se ejecuta como usuario "appz".

Tengo dos rutinas básicas:

void do_root (void)
{
        int status;
        status = seteuid (euid);
        if (status < 0) { 
        exit (status);
        }    
}

/* undo root permissions */
void undo_root (void)
{
int status;
        status = seteuid (ruid);
        if (status < 0) { 
                exit (status);
        }
        status = setuid(ruid);
        if (status < 0) { 
                exit (status);
        }
}

Mi flujo es el siguiente:

int main() {
 undo_root();
 do some stuff;
 do_root();
 bind( port 80); //needs root perm
 undo_root();
 while(1) {

    accept commads()
    if ( commands needs root user access)
    {
       do_root();
       execute();
       undo_root();

    }

 }

Como puede ver, quiero ejecutar algunos comandos como root. Estoy tratando de eliminar los permisos temporalmente y si las tareas necesitan acceso de root, envuelvo el comando entre una llamada do_root y undo_root.

Sin embargo, parece que mi programa no funciona.

¿Cuál es la forma canónica de hacerlo?

Respuestas a la pregunta(6)

Su respuesta a la pregunta