/*
Copyright (C) 2001, 2004, 2005 Axis Communications AB.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

2. Neither the name of Axis Communications nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
 */
/* This file is to be kept in sync with libc/include/sys/fcntl.h,
   on which it is based, except values used or returned by syscalls must
   be those of the Linux/CRIS kernel.  */

#ifndef _FCNTL_
#define _FCNTL_

#include <sys/cdefs.h>

_BEGIN_STD_C

#define _FOPEN     (-1)       /* from sys/file.h, kernel use only */
#define _FREAD     0x0001     /* read enabled */
#define _FWRITE    0x0002     /* write enabled */
#define _FNDELAY   0x0800     /* non blocking I/O (4.2 style) */
#define _FAPPEND   0x0400     /* append (writes guaranteed at the end) */
#define _FMARK     0x0010     /* internal; mark during gc() */
#define _FDEFER    0x0020     /* internal; defer for next gc pass */
#define _FASYNC    0x2000     /* signal pgrp when data ready */
#define _FCREAT    0x0040     /* open with file create */
#define _FTRUNC    0x0200     /* open with truncation */
#define _FEXCL     0x0080     /* error on open if file exists */
#define _FNBIO     _FNONBLOCK /* non blocking I/O (sys5 style) */
#define _FSYNC     0x1000     /* do all writes synchronously */
#define _FNONBLOCK 0x0800     /* non blocking I/O (POSIX style) */
#define _FNOCTTY   0x0100     /* don't assign a ctty on this open */

#define O_ACCMODE  (O_RDONLY | O_WRONLY | O_RDWR)

/*
 * Flag values for open(2) and fcntl(2)
 * The kernel adds 1 to the open modes to turn it into some
 * combination of FREAD and FWRITE.
 */
#define O_RDONLY 0 /* +1 == FREAD */
#define O_WRONLY 1 /* +1 == FWRITE */
#define O_RDWR   2 /* +1 == FREAD|FWRITE */
#define O_APPEND _FAPPEND
#define O_CREAT  _FCREAT
#define O_TRUNC  _FTRUNC
#define O_EXCL   _FEXCL
/*	O_SYNC		_FSYNC		not posix, defined below */
/*	O_NDELAY	_FNDELAY 	set in include/fcntl.h */
/*	O_NDELAY	_FNBIO 		set in 5include/fcntl.h */
#define O_NONBLOCK _FNONBLOCK
#define O_NOCTTY   _FNOCTTY

#ifndef _POSIX_SOURCE

#define O_SYNC _FSYNC

/*
 * Flags that work for fcntl(fd, F_SETFL, FXXXX)
 */
#define FAPPEND _FAPPEND
#define FSYNC   _FSYNC
#define FASYNC  _FASYNC
#define FNBIO   _FNBIO
#define FNONBIO _FNONBLOCK /* XXX fix to be NONBLOCK everywhere */
#define FNDELAY _FNDELAY

/*
 * Flags that are disallowed for fcntl's (FCNTLCANT);
 * used for opens, internal state, or locking.
 */
#define FREAD   _FREAD
#define FWRITE  _FWRITE
#define FMARK   _FMARK
#define FDEFER  _FDEFER
#define FSHLOCK _FSHLOCK
#define FEXLOCK _FEXLOCK

/*
 * The rest of the flags, used only for opens
 */
#define FOPEN   _FOPEN
#define FCREAT  _FCREAT
#define FTRUNC  _FTRUNC
#define FEXCL   _FEXCL
#define FNOCTTY _FNOCTTY

#endif /* !_POSIX_SOURCE */

/* XXX close on exec request; must match UF_EXCLOSE in user.h */
#define FD_CLOEXEC 1 /* posix */

/* fcntl(2) requests */
#define F_DUPFD  0 /* dup */
#define F_GETFD  1 /* get f_flags */
#define F_SETFD  2 /* set f_flags */
#define F_GETFL  3 /* more flags (cloexec) */
#define F_SETFL  4
#define F_GETLK  5
#define F_SETLK  6
#define F_SETLKW 7

#define F_SETOWN 8 /*  for sockets. */
#define F_GETOWN 9 /*  for sockets. */

/* for F_[GET|SET]FL */
#define FD_CLOEXEC 1 /* actually anything with low bit set goes */

/* for posix fcntl() and lockf() */
#define F_RDLCK 0
#define F_WRLCK 1
#define F_UNLCK 2

/* for old implementation of bsd flock () */
#define F_EXLCK 4 /* or 3 */
#define F_SHLCK 8 /* or 4 */

/* operations for bsd flock(), also used by the kernel implementation */
#define LOCK_SH 1 /* shared lock */
#define LOCK_EX 2 /* exclusive lock */
#define LOCK_NB                                            \
    4             /* or'd with one of the above to prevent \
                     blocking */
#define LOCK_UN 8 /* remove lock */

/* file segment locking set data type - information passed to system by user */
struct flock {
    short l_type;   /* F_RDLCK, F_WRLCK, or F_UNLCK */
    short l_whence; /* flag to choose starting offset */
    long  l_start;  /* relative offset, in bytes */
    long  l_len;    /* length, in bytes; 0 means lock to EOF */
    short l_pid;    /* returned with F_GETLK */
    short l_xxx;    /* reserved for future use */
};

#ifndef _POSIX_SOURCE
/* extended file segment locking set data type */
struct eflock {
    short l_type;   /* F_RDLCK, F_WRLCK, or F_UNLCK */
    short l_whence; /* flag to choose starting offset */
    long  l_start;  /* relative offset, in bytes */
    long  l_len;    /* length, in bytes; 0 means lock to EOF */
    short l_pid;    /* returned with F_GETLK */
    short l_xxx;    /* reserved for future use */
    long  l_rpid;   /* Remote process id wanting this lock */
    long  l_rsys;   /* Remote system id wanting this lock */
};
#endif /* !_POSIX_SOURCE */

#include <sys/types.h>
#include <sys/stat.h> /* sigh. for the mode bits for open/creat */

extern int open(const char *, int, ...);
extern int creat(const char *, mode_t);
extern int fcntl(int, int, ...);

/* Provide _<systemcall> prototypes for functions provided by some versions
   of newlib.  */
#ifdef _LIBC
extern int _open(const char *, int, ...);
extern int _fcntl(int, int, ...);
#ifdef __LARGE64_FILES
extern int _open64(const char *, int, ...);
#endif
#endif

_END_STD_C

#endif /* !_FCNTL_ */
