=?ISO-8859-1?Q?Re=3A_Programaci=F3n_correcta=2E_Como_modificar_?=
=?ISO-8859-1?Q?=2Fetc=2Fpasswd=2F_adecuadamente=2E?=
Salvador Ortiz Garcia
sog@msg.com.mx
Mon, 9 Feb 1998 21:36:17 -0600 (CST)
On Mon, 9 Feb 1998, Roberto Jimeno wrote:
>
> ¿Cual es la manera _correcta_ de que un programa lea o escriba
> en /etc/passwd?
>
Segun yo, la manera correcta tiene más que ver con _cómo_ lo hacen las
utilerias del sistema (passwd, chfn, chsh, etc), y hacerlo en forma
compatible.
Sale rollo (y metodo):
0. Todo lo que sigue se hace como 'root' (euid = 0)
1. Te preparas para ignorar (SIG_IGN) las señales ALRM, HUP, INT, QUIT,
TERM, TSTP, TTOU. (para evitar que alguien te gane la carrera)
2. oldmask = umask(0);
3. open("/etc/ptmptmp", O_WRONLY|O_CREAT|O_EXCL, 0644)
4. link("/etc/ptmptmp", "/etc/ptmp") (Aquí esta la magia, creas un pseudo
lock)
5. Si falla la apertura o la liga, es que alguien está actualizando el
archivo (haces lo que gustes, generalmente pedir al usuario se tome un
café).
6. unlink("/etc/ptmptmp")
7. umask(oldmask)
8. chown("/etc/ptmp", 0, 0)
9. open("/etc/passwd", O_RDONLY)
10. Lees /etc/passwd completo (a memoria por el metodo que quieras, se
recomienda 'getpwent(3)' y compañia.)
11. Cambias imagen en memoria.
12. Escribes tu imagen completa en /etc/ptmptmp (ojo, el archivo lo
borraste, pero no lo cerraste, asi que no problemo!), se recomienda usar
putpwent(3) (nota: lamentablemente esta funcion no existe en perl!).
13. close("/etc/ptmptmp");
14. close("/etc/passwd");
13. unlink("/etc/passwd.OLD") (si no existe no importa)
14. link("/etc/passwd","/etc/passwd.OLD") (Aqui estas generando un
respaldo)
15. rename("/etc/ptmp","/etc/passwd"); (Esta función es atómica asi que
el sistema nunca se queda volando y al cambiar el nombre se desbloquea el
pseudo lock de las otras utilerias.)
16. exit(0);
Para convencerte de que lo de arriba es lo _correcto_, prueba:
# touch /etc/ptmp
# chfn -h <el telefono de tu casa>
....
# rm /etc/ptmp
Si tienes dudas, con gusto!.
Saludos.
Salvador Ortiz G.