Home | History | Annotate | Line # | Download | only in util
      1 /*	$NetBSD: non_blocking.c,v 1.2 2025/02/25 19:15:52 christos Exp $	*/
      2 
      3 /*++
      4 /* NAME
      5 /*	non_blocking 3
      6 /* SUMMARY
      7 /*	set/clear non-blocking flag
      8 /* SYNOPSIS
      9 /*	#include <iostuff.h>
     10 /*
     11 /*	int	non_blocking(int fd, int on)
     12 /* DESCRIPTION
     13 /*	the \fInon_blocking\fR() function manipulates the non-blocking
     14 /*	flag for the specified open file, and returns the old setting.
     15 /*
     16 /*	Arguments:
     17 /* .IP fd
     18 /*	A file descriptor.
     19 /* .IP on
     20 /*	For non-blocking I/O, specify a non-zero value (or use the
     21 /*	NON_BLOCKING constant); for blocking I/O, specify zero
     22 /*	(or use the BLOCKING constant).
     23 /*
     24 /*	The result is non-zero when the non-blocking flag was enabled.
     25 /* DIAGNOSTICS
     26 /*	All errors are fatal.
     27 /* LICENSE
     28 /* .ad
     29 /* .fi
     30 /*	The Secure Mailer license must be distributed with this software.
     31 /* AUTHOR(S)
     32 /*	Wietse Venema
     33 /*	IBM T.J. Watson Research
     34 /*	P.O. Box 704
     35 /*	Yorktown Heights, NY 10598, USA
     36 /*--*/
     37 
     38 /* System interfaces. */
     39 
     40 #include "sys_defs.h"
     41 #include <fcntl.h>
     42 
     43 /* Utility library. */
     44 
     45 #include "msg.h"
     46 #include "iostuff.h"
     47 
     48 /* Backwards compatibility */
     49 #ifndef O_NONBLOCK
     50 #define PATTERN	FNDELAY
     51 #else
     52 #define PATTERN	O_NONBLOCK
     53 #endif
     54 
     55 /* non_blocking - set/clear non-blocking flag */
     56 
     57 int     non_blocking(int fd, int on)
     58 {
     59     int     flags;
     60 
     61     if ((flags = fcntl(fd, F_GETFL, 0)) < 0)
     62 	msg_fatal("fcntl: get flags: %m");
     63     if (fcntl(fd, F_SETFL, on ? flags | PATTERN : flags & ~PATTERN) < 0)
     64 	msg_fatal("fcntl: set non-blocking flag %s: %m", on ? "on" : "off");
     65     return ((flags & PATTERN) != 0);
     66 }
     67