In this article I will present to you two useful functions that can be used whenever you want to enable or disable the non-blocking I/O mode of a file descriptor. By using the enable_io_blocking_for_file_descriptor and disable_io_blocking_for_file_descriptor functions you can enable and disable the I/O blocking of a file descriptor.

Here is the header of the source code unit providing the functions:

/*
 *  Copyright (C) 2014  Efstathios Chatzikyriakidis (stathis.chatzikyriakidis@gmail.com).
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef _FILE_DESCRIPTOR_UTILITY_H_
#define _FILE_DESCRIPTOR_UTILITY_H_

#include "shared-types.h"

/*
 * function prototypes.
 */

bool_t enable_io_blocking_for_file_descriptor (const int file_descriptor);

bool_t disable_io_blocking_for_file_descriptor (const int file_descriptor);

#endif // _FILE_DESCRIPTOR_UTILITY_H_

Here is the implementation of the source code unit providing the functions:

/*
 *  Copyright (C) 2014  Efstathios Chatzikyriakidis (stathis.chatzikyriakidis@gmail.com).
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#include <fcntl.h>

#include "file-descriptor-utility.h"

/*
 * functions.
 */

bool_t
enable_io_blocking_for_file_descriptor (const int file_descriptor)
{
  int file_descriptor_flags;

  if ((file_descriptor_flags = fcntl (file_descriptor, F_GETFL, 0)) < 0) 
  {
    return false;
  }

  if (fcntl (file_descriptor,
             F_SETFL,
             file_descriptor_flags & ~O_NONBLOCK) < 0) 
  {
    return false;
  }

  return true;
}

bool_t
disable_io_blocking_for_file_descriptor (const int file_descriptor)
{
  int file_descriptor_flags;

  if ((file_descriptor_flags = fcntl (file_descriptor, F_GETFL, 0)) < 0) 
  {
    return false;
  }

  if (fcntl (file_descriptor,
             F_SETFL,
             file_descriptor_flags | O_NONBLOCK) < 0) 
  {
    return false;
  }

  return true;
}

Happy Hacking!