#ifndef __CCUSTIO_H
#define __CCUSTIO_H

#ifdef LINUX
#include        <unistd.h>
#include        <errno.h>
#endif

#ifndef __CCOMMON_H
#include        "ccommon.h"
#endif
#ifndef __GENCONST_H
#include        "genconst.h"
#endif

#define BlockLenIO      512
#define Valid                   0
#define Deleted                 1

typedef char                    *FileName;
typedef char                    *RecType;
typedef long                    RecNoType;

#ifdef __GNUC__
#define __PACKED__ __attribute__ ((packed))
#define __ALIGNED__ __attribute__ ((aligned(2))) 
#define __PACK_1__
#else
#define __PACKED__
#define __ALIGNED__
#pragma pack(2)
#endif

typedef struct  {
  int                                   F;
  FILE                                  *Fd;
  int                                   IOR;
  int                                   LenRec;
  int                                   BaseFil;
  unsigned                      LockMode;
  RecNoType             lpos;
  PathSt                                name;
  /* @(!) 2.3.01.325 */
  RecNoType       lkpos;
  /* @(:) 2.3.01.325 */
} SecDef ;

#ifdef WIN32
#define TESTLOCK(x)             ((x) == 13 || (x) == 11)
#define DEADLOCK(x)             ((x) == EDEADLOCK)
#else   
#define TESTLOCK(x)             (((x) == EACCES) || ((x) == EGAIN) || ((x) == ENOLCK))
#define DEADLOCK(x)             (((x) == EDEADLOCK) || ((x) == EDEADLK))
#endif
#define BLOCKEXT(len,rec)       (((((RecNoType) (len)) * ((RecNoType) (rec))) / BlockLenIO) + 1)

#ifdef WIN32
#pragma pack()
#endif

#ifdef __cplusplus
extern "C" {
#endif
  void CLockRec(SecDef *, RecNoType, unsigned);
  void CVerify(SecDef *,char *);
  void COpen(SecDef *,char *, unsigned, unsigned, unsigned);
  void CCreate(SecDef *,char *,unsigned ,unsigned ,RecNoType);
  void CChsize(SecDef *,char *,unsigned ,unsigned ,RecNoType);
  void CClose(SecDef *);
  void CDelete(SecDef *,char *);
  void CRead(SecDef *,RecType,RecNoType ,unsigned );
  void CWrite(SecDef *,RecType,RecNoType ,unsigned );
  void IDeleteRec(RecType);
  void IRecallRec(RecType);
  BOOLEAN IRecIsDeleted(RecType);
  BOOLEAN ITestLock(int );
  /* @(!) 2.3.01.325 modificata int excllock(char *,BOOLEAN);*/ 
  /* @(!) 2.3.01.325 modificata int exclunlock(char *,BOOLEAN);*/ 
  int excllock(char *,int);
  int exclunlock(char *,int);
  // int sleep_dos(int);   // Killed by Guy
  /* @(:) 2.3.01.325 */
  BOOLEAN test_share(void);
#ifdef __cplusplus
};
#endif
#endif /* __CCUSTIO_H */