commit - 628c6c962b1054de4c27304f53c4ac7c50c79a11
commit + 025342fe46ae504a08be8c642901ec7eb7c4fccb
blob - cd350a8d619700a2ca89034b5a05b132df6cba36
blob + ab975b31c7d97810e0fec421bee7e2259282a9c3
--- src/ngircd/conn.c
+++ src/ngircd/conn.c
} /* cb_Read_Resolver_Result */
+/**
+ * Write a "simple" (error) message to a socket.
+ * The message is sent without using the connection write buffers, without
+ * compression/encryption, and even without any error reporting. It is
+ * designed for error messages of e.g. New_Connection(). */
static void
-Simple_Message( int Sock, const char *Msg )
+Simple_Message(int Sock, const char *Msg)
{
char buf[COMMAND_LEN];
size_t len;
- /* Write "simple" message to socket, without using compression
- * or even the connection write buffers. Used e.g. for error
- * messages by New_Connection(). */
- assert( Sock > NONE );
- assert( Msg != NULL );
- strlcpy( buf, Msg, sizeof buf - 2);
- len = strlcat( buf, "\r\n", sizeof buf);
- (void)write(Sock, buf, len);
+ assert(Sock > NONE);
+ assert(Msg != NULL);
+
+ strlcpy(buf, Msg, sizeof buf - 2);
+ len = strlcat(buf, "\r\n", sizeof buf);
+ if (write(Sock, buf, len) < 0) {
+ /* Because this function most probably got called to log
+ * an error message, any write error is ignored here to
+ * avoid an endless loop. But casting the result of write()
+ * to "void" doesn't satisfy the GNU C code attribute
+ * "warn_unused_result" which is used by some versions of
+ * glibc (e.g. 2.11.1), therefore this silly error
+ * "handling" code here :-( */
+ return;
+ }
} /* Simple_Error */
blob - 82ba67c28a945c59a0c136afc4b9cf11af2e482d
blob + b951badb5b26ba5687ed00bb56c1b0e67694551d
--- src/ngircd/ngircd.c
+++ src/ngircd/ngircd.c
#else
setpgrp(0, getpid());
#endif
- chdir( "/" );
+ if (chdir( "/" ) != 0)
+ Log(LOG_ERR, "Can't change directory to '/': %s",
+ strerror(errno));
/* Detach stdin, stdout and stderr */
Setup_FDStreams( );