__noinference__{
#ifndef _FCNTL_H_
#define _FCNTL_H_
#ifndef __off64_t_def_
#define __off64_t_def_
typedef long long _off64_t;
#endif
#ifndef _pid_t_def_
#define _pid_t_def_
typedef int pid_t;
#endif
#ifndef _off_t_def_
#define _off_t_def_
typedef _off64_t off_t;
#endif
#ifndef _flock_def_
#define _flock_def_
struct flock{
  short l_type;
  short l_whence;
  off_t l_start;
  off_t l_len;
  pid_t l_pid;
};
#endif
#ifndef _mode_t_def_
#define _mode_t_def_
typedef unsigned int mode_t;
#endif
#ifndef O_NOCTTY
#define O_NOCTTY _FNOCTTY
#endif
#ifndef _FAPPEND
#define _FAPPEND 0x0008
#endif
#ifndef O_ACCMODE
#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
#endif
#ifndef _FCREAT
#define _FCREAT 0x0200
#endif
#ifndef F_RDLCK
#define F_RDLCK 1
#endif
#ifndef O_APPEND
#define O_APPEND _FAPPEND
#endif
#ifndef _FTRUNC
#define _FTRUNC 0x0400
#endif
#ifndef F_DUPFD
#define F_DUPFD 0
#endif
#ifndef O_WRONLY
#define O_WRONLY 1
#endif
#ifndef O_EXCL
#define O_EXCL _FEXCL
#endif
#ifndef FD_CLOEXEC
#define FD_CLOEXEC 1
#endif
#ifndef O_NONBLOCK
#define O_NONBLOCK _FNONBLOCK
#endif
#ifndef F_UNLCK
#define F_UNLCK 3
#endif
#ifndef F_GETFL
#define F_GETFL 3
#endif
#ifndef O_RSYNC
#define O_RSYNC _FSYNC
#endif
#ifndef F_GETLK
#define F_GETLK 7
#endif
#ifndef O_DSYNC
#define O_DSYNC _FSYNC
#endif
#ifndef O_RDWR
#define O_RDWR 2
#endif
#ifndef F_SETFD
#define F_SETFD 2
#endif
#ifndef F_SETFL
#define F_SETFL 4
#endif
#ifndef _FNONBLOCK
#define _FNONBLOCK 0x4000
#endif
#ifndef F_GETOWN
#define F_GETOWN 5
#endif
#ifndef F_SETLK
#define F_SETLK 8
#endif
#ifndef F_SETOWN
#define F_SETOWN 6
#endif
#ifndef O_SYNC
#define O_SYNC _FSYNC
#endif
#ifndef O_CREAT
#define O_CREAT _FCREAT
#endif
#ifndef _FEXCL
#define _FEXCL 0x0800
#endif
#ifndef F_WRLCK
#define F_WRLCK 2
#endif
#ifndef F_SETLKW
#define F_SETLKW 9
#endif
#ifndef F_GETFD
#define F_GETFD 1
#endif
#ifndef O_RDONLY
#define O_RDONLY 0
#endif
#ifndef _FNOCTTY
#define _FNOCTTY 0x8000
#endif
#ifndef O_TRUNC
#define O_TRUNC _FTRUNC
#endif
#ifndef _FSYNC
#define _FSYNC 0x2000
#endif

  // FIX: ADV is not supported

  datatype FcntlArg<`r::E> {
    Flock(struct flock @`r);
    Long(long);
  };
  typedef datatype FcntlArg<`r>@`r fcntlarg_t<`r>;

  extern int fcntl(int fd, int cmd, ... inject fcntlarg_t);
  extern int open(const char *, int, ... mode_t);
  // FIX: should arg be non-NULL?
  extern "C" int creat(const char *,mode_t);
#endif
}
