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?