fakeidentd: avoid extra fcntl calls
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 14 Jan 2007 12:31:26 +0000 (12:31 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 14 Jan 2007 12:31:26 +0000 (12:31 -0000)
networking/isrv_identd.c

index 30f9a7a..3891039 100644 (file)
@@ -41,11 +41,13 @@ static int do_rd(int fd, void **paramp)
 {
        identd_buf_t *buf = *paramp;
        char *cur, *p;
+       int retval = 0; /* session is ok (so far) */
        int sz;
 
        cur = buf->buf + buf->pos;
 
-       fcntl(fd, F_SETFL, buf->fd_flag);
+       if (buf->fd_flag & O_NONBLOCK)
+               fcntl(fd, F_SETFL, buf->fd_flag);
        sz = safe_read(fd, cur, sizeof(buf->buf) - buf->pos);
 
        if (sz < 0) {
@@ -59,18 +61,18 @@ static int do_rd(int fd, void **paramp)
        p = strpbrk(cur, "\r\n");
        if (p)
                *p = '\0';
-       if (p || !sz || buf->pos == sizeof(buf->buf)) {
-               /* fd is still in nonblocking mode - we never block here */
-               fdprintf(fd, "%s : USERID : UNIX : %s\r\n", buf->buf, bogouser);
-               goto term;
-       }
- ok:
-       fcntl(fd, F_SETFL, buf->fd_flag & ~O_NONBLOCK);
-       return 0;
+       if (!p && sz && buf->pos <= sizeof(buf->buf))
+               goto ok;
+       /* Terminate session. If we are in server mode, then
+        * fd is still in nonblocking mode - we never block here */
+       fdprintf(fd, "%s : USERID : UNIX : %s\r\n", buf->buf, bogouser);
  term:
-       fcntl(fd, F_SETFL, buf->fd_flag & ~O_NONBLOCK);
        free(buf);
-       return 1;
+       retval = 1; /* terminate */
+ ok:
+       if (buf->fd_flag & O_NONBLOCK)
+               fcntl(fd, F_SETFL, buf->fd_flag & ~O_NONBLOCK);
+       return retval;
 }
 
 static int do_timeout(void **paramp)