
#pragma once

#include <fcntl.h>
#include <sgtty.h>
#include <stream.h>

class FileDescState
{
  int fd;
  struct sgttyb original_params;
  int           original_mode;
  int           original_fcntl_fl;

  void SaveState();
  void RestoreState();

 public:

  FileDescState()      : fd(-1) {};
  FileDescState(int n) : fd(n)  {};
  void Assign_fd(int n)   { if(fd==-1) { fd = n; SaveState(); } };

  ~FileDescState()              { if(fd!=-1) RestoreState(); };

  void Param_add(int n);
  void Param_remove(int n);
  int  Flag_set(int n) { if(fd!=-1) return fcntl(fd,F_SETFL,n); return -1;};

  void NonBlocking() { if(fd!=-1) Flag_set(FNDELAY); };
};
