🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.os.linux.programacion
5 messages
5 total messages Started by Miguel Mon, 09 Jan 2006 16:17
file descriptor incorrecto
#1324
Author: Miguel
Date: Mon, 09 Jan 2006 16:17
38 lines
1951 bytes
hola,

estoy probando el siguiente c�digo y errno me dice al llamar a write que 
el fd no es correcto. �qu� estoy haciendo mal?

gracias

un saludo


int write_log(char *texto,char *strfile)
{
	struct tm *strtime;
	int fd;
	time_t clock;	
	char date[LEN_DATE];
	char buffer[LEN_LOG_LINE+LEN_DATE+1];
		
	/* abrimos el fichero para escritura y lo creamos si no existe */
	if((fd  = open(strfile,O_APPEND | O_CREAT, 0644))<0){
		printf("Error al crear el fichero de log\n");
		fflush(stdout);
		return ERROR;
	}

	time(&clock);
   	strtime=localtime(&clock);
	strftime(date,LEN_DATE,"%Y%m%d:%H%M%S ",strtime);
	strcat(buffer,date);
	strcat(buffer,texto);
	if(write(fd,buffer,strlen(buffer))<0){
		printf("Error al escribir el fichero de log\n");
		fflush(stdout);
		close(fd);
		return ERROR;
	}
	close(fd);
}
Re: file descriptor incorrecto
#1325
Author: Jorge S. de Lis
Date: Mon, 09 Jan 2006 19:27
37 lines
2355 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Miguel en es.comp.os.linux.programacion escribi�:

> 
> /* abrimos el fichero para escritura y lo creamos si no existe */
> if((fd  = open(strfile,O_APPEND | O_CREAT, 0644))<0){

Con esa sentencia no guarda nada en fd. En otros lenguajes como php por
ejemplo s�, pero en c no.

Debes hacer el open en otra sentencia y luego preguntar por fd, as�:

fd  = open(strfile,O_APPEND | O_CREAT, 0644);
if(fd<0){




-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)

iQIVAwUBQ8K5NKvCV+KC5A6ZAQJttQ/9HneOD9ss32ueyLb0dGOSOK/6uqqCKPqK
UjIuTzvq7gDTIscnlB3YkYB5wFt8nmcEN0DF9iGM5i/8+S6XDnfAKhnBmDvr7Zeb
AsHwl8O4v0gFzCZjqRXCl8vXklvs1tpQvpBQTGRBVoCMVACupVbEYc+lpTfEauF0
jP6VxfT3wrNWjNSMlub3g160xvUzbgtVKCnVqOFKfOTjzG4s6GZ7ObESK6uJ1yiP
RtyWTtndP/8N6cB5OTFYflcSgex1MXchIeEZHMOuIJzd8iZuCcUnYmpojX7sGIMD
aAavLrD85wf22PG3lbazH+ssN83hJeBau+yxO56rqeqWkmRSKRJvprWV7sJRijO9
/3co5D6y6me+eYjygSLP9dfwb2C+NQLeaWg3YiQ46bCBjneunvBeMK/1w4q3N6Xb
4DY56jRO4ZoyffPiqPf7iW59X27Jv0Ez1V/MilVIKHHIGlikFzEusc0mGuF3Y2Uv
xY/TVoEsSzZdjKWXvMJTsj4C4V3n6ngNYqPCrQ/zUyngI4BZ4GE8oU+qUPv8gwHf
THekbK7Pe/4gHzbCNTk6mHpLHm2yLUxwCnKWiNFOnL/KT/9nBXEaxz3sRWMtQIZs
dQJO+mxkdhw6iOduz8vX2KbuC3ZEnbaFHJw/Ik+M/kKaulKwvZ8MEiAEvwvdZnM6
4Gr/e6v8tgI=
=rNWA
-----END PGP SIGNATURE-----
Re: file descriptor incorrecto
#1326
Author: iarenaza
Date: Mon, 09 Jan 2006 21:38
43 lines
2567 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

>>>>> "Jorge" == Jorge S de Lis <gentakojima.antispam.quitar@gmail.com> writes:

    Jorge> Con esa sentencia no guarda nada en fd. En otros lenguajes
    Jorge> como php por ejemplo s�, pero en c no.

Me temo que est�s muy equivocado. En C _si_ asigna el valor a la
variable en cuesti�n. De hecho, PHP ha copiado ese comportamiento
directamente de C.

Lo que tiene bastante m�s pinta es de que se trata de un
desbordamiento de buffer cl�sico.

Haces un:

      strcat (buffer, date);

pero no has puesto un '\0' en el comienzo de buffer para que empiece a
concatenar de ah�. Por tanto, puede concatenar 'date' a partir de vete
a saber que direcci�n de memoria, y sobrescribir mientras tanto datos
de la pila y machacar variables locales (como fd, por ejemplo).

Haz un:

    buffer[0] = '\0';

antes del strcat de arriba y seguro que la cosa va mejor ;-)

Saludos. I�aki.

- -- 
  Get PGP/GPG Keys at  http://www.escomposlinux.org/iarenaza/pgpkey.php
  I use free software / Yo uso software libre
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/>

iD8DBQFDwtfWZXLnGT1HLgcRAm7fAJ0ZXmlimsBp+a1c498u5vcCio6NhwCgjzc4
UIGv4SB5vDZThoMq6DASNcU=
=/Oan
-----END PGP SIGNATURE-----
Re: file descriptor incorrecto
#1327
Author: Jorge S. de Lis
Date: Mon, 09 Jan 2006 21:44
33 lines
2430 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I�aki Arenaza en es.comp.os.linux.programacion escribi�:


> Me temo que est�s muy equivocado. En C _si_ asigna el valor a la
> variable en cuesti�n. De hecho, PHP ha copiado ese comportamiento
> directamente de C.
> 

Cu�nta raz�n tienes. Cre�a recordar que no lo hac�a, aunque lo he comprobado
y bueno... ante la evidencia :-). Siento la equivocaci�n. Gracias por
aclararlo.

Saludos.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)

iQIVAwUBQ8LZKqvCV+KC5A6ZAQJSOBAAv6ktTrwcez5a1WZJXzXJaknGST9VTEfo
edljyUYY7DUYxJVg9FuTp7qg6z+l7fm7PiMcVZTMj4oWvMPZBr/uual2vxy1f/Kw
soofs/KqeRraF9/DAjG72SfUVla/nlgGN1ZuZblpMZZw3R5L0tcQwjExhHA0ySWZ
0B6aBbPPZy5nXGPl5n2x2UjAIBAkpp1m+E5GSp1/kMYIVt+VT9h66b3ibWGzPzGo
R8JNFi0gospyxY1tR8negn33vOhY10ixEKpNyVsZ2RivWzooUE/RCm/nzvlcpCkV
hVcELMQh7Scn/+hlW6D2pRHdbLxwqb2Akq/vYmbYxWrHCSt5elVx8g1WLz9BQ9d4
+SwGxK1NM8JPPGTVmvyUuUkDZVcqchDc3ZlOoIbrvBr70GL+eXdW0+Rni77VlgXX
uJ1C9YjWXNtJXEB+zjwmQq3js5lxV4AZDRLvmBvXwMpL1eMR4wy0AvzyxHwARA2r
SMbiJrLp51bs3ciVkqJ3NFM8Ht9EE9sLueEnegPd5d5r3Dx+exvxYc9/yjzwaLba
NC8uKc2qWZxDbEfihNZ4rsjaOfd0Hu/JP9jKp8jA9boqsgrqRYukqR5ZGDPvLay8
VOV4lSnsPafc0Zs0x4C34PrZzH1XL6effxFh5Zg19qKOACTAq796UpZMurFUgGs2
NcgSUVq8Uws=
=YKKy
-----END PGP SIGNATURE-----
Re: file descriptor incorrecto
#1330
Author: Miguel
Date: Tue, 10 Jan 2006 15:38
35 lines
2280 bytes
El problema estaba en el open. Faltaba un O_WRONLY. La cosa ha quedado asli

int write_log(char *texto,char *strfile)
{
	struct tm *strtime;
	int fd;
	time_t clock;	
	char date[LEN_DATE];
	char *buffer;
		
	/* abrimos el fichero para escritura y lo creamos si no existe */
	if((fd  = open(strfile,O_WRONLY | O_APPEND | O_CREAT, 0644))<0){
		printf("Error al crear el fichero de log\n");
		perror("Error");
		fflush(stdout);
		return ERROR;
	}

	time(&clock);
   	strtime=localtime(&clock);
	strftime(date,LEN_DATE,"< %Y%m%d:%H%M%S > ",strtime);
	buffer = (char *)malloc((strlen(date)+strlen(texto)+1)*sizeof(char));
	buffer[0]=END;
	strcat(buffer,date);
	strcat(buffer,texto);
	buffer[(strlen(date)+strlen(texto))]=NEW_LINE;
	if(write(fd,buffer,strlen(buffer))<0){
		printf("Error al escribir el fichero de log\n");
		perror("Error");
		fflush(stdout);
		close(fd);
		return ERROR;
	}
	close(fd);
}
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads