Files correlati : *.* Ricompilazione Demo : [ ] Commento : ccustio.c Cambiato oridne di inclusione per far contento Visual Studio >= 2008 colors.h Aggiunto flag NATIVE_CONTROLS e tolto flag SMALL_ICONS controls.* Aggiunto supporto per bottoni nativi al posto dei simulacri XI dongle.cpp Aggiunta in modo DBG la simulazione chiave master per Power Station expr.cpp TRUE -> true FALSE -> false image.h Reso accessibile handle XVT_IMAGE per bottoni nativi isam.cpp Corretta segnalazione campi mancanti acceduti tramite TRecfield maskfld.* Supporto per controlli nativi printapp.cpp Eliminate funzioni DEPRECATED per Visual Studio >= 2005 relacpp.cpp Corretto posizionamento bottoni per controli nativi e non tree.cpp Supporto per Tree controls nativi ed eliminati quelli fatti "in casa" window.* Reso virtuale metodoto TWindow::force_update, necessario ai TTree_field git-svn-id: svn://10.65.10.50/trunk@15851 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			886 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			886 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
#include <sys/stat.h>
 | 
						|
#ifdef WIN32
 | 
						|
#include <sys/types.h>
 | 
						|
#include <io.h>
 | 
						|
#include <share.h>
 | 
						|
#include <sys/locking.h>           
 | 
						|
#else
 | 
						|
#include "../xvaga/xvt.h"
 | 
						|
#include <sys/ipc.h>
 | 
						|
#include <sys/sem.h>
 | 
						|
#include <unistd.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include "ccustio.h"         
 | 
						|
 | 
						|
#define         CalcPos(Rec, Len, Base) (((Rec) - 1) * ((RecNoType) (Len)) + ((RecNoType) (Base)))
 | 
						|
#define LOCK_OFF 1200000000L
 | 
						|
 | 
						|
#ifdef LINUX
 | 
						|
#define         LOCKSEM "locksem"
 | 
						|
 | 
						|
/* extern long lseek(int, long, int);*/
 | 
						|
// extern int chsize(int, long);
 | 
						|
// extern int lockf(int, int, long);
 | 
						|
#endif
 | 
						|
 | 
						|
unsigned        setlock(unsigned);
 | 
						|
int                             seeklk(SecDef *, long, unsigned, unsigned, long);
 | 
						|
#ifdef LINUX
 | 
						|
int     semtran(char *);
 | 
						|
static void semcall(int, int);
 | 
						|
void    PS(int); 
 | 
						|
void    VS(int);
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
   @($) setlock  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Trasforma il modo di lock utente in modo lock XENIX.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   Nella versione XENIX :
 | 
						|
 | 
						|
   lm = numero lock xenix.
 | 
						|
   @(FSV)
 | 
						|
 | 
						|
   @(IN)
 | 
						|
   Restituisce il comando XENIX.
 | 
						|
   @(FN)
 | 
						|
   */
 | 
						|
 | 
						|
unsigned        setlock(LockMode)
 | 
						|
  unsigned      LockMode; /* Tipo di lock */
 | 
						|
 | 
						|
{
 | 
						|
 | 
						|
  int           lm;
 | 
						|
 | 
						|
  LockMode &= RecLockTypes ;
 | 
						|
#ifdef WIN32
 | 
						|
  if (LockMode == ShareLock) lm = _LK_NBRLCK ;
 | 
						|
  else
 | 
						|
    if (LockMode == Lock) lm = _LK_NBRLCK ;
 | 
						|
    else lm = _LK_UNLCK ;
 | 
						|
#else
 | 
						|
  if (LockMode == ShareLock) lm = F_TLOCK ;
 | 
						|
  else
 | 
						|
    if (LockMode == Lock) lm = F_TLOCK ;
 | 
						|
    else lm = F_ULOCK ;
 | 
						|
#endif
 | 
						|
  return(lm) ;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @($) seeklk  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Effettua una seek.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   junk = variabile di lavoro.
 | 
						|
 | 
						|
   lock = variabile per eseguire comandi di lock.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
int seeklk(S, pos, lm, LockMode, rec) 
 | 
						|
  SecDef                        *S ;      /* Descrittore file               */
 | 
						|
  long                          pos ;     /* posizione all'interno del file */
 | 
						|
  unsigned              lm ;      /* comando di lock per XENIX      */
 | 
						|
  unsigned              LockMode; /* comando di lock utente         */ 
 | 
						|
  long                    rec;      /* n.ro di record                 */
 | 
						|
 | 
						|
{
 | 
						|
  if (LockMode != NoLock && S->LockMode != ExclLock) 
 | 
						|
  {               
 | 
						|
#ifdef WIN32
 | 
						|
    /*    if (test_share())  */
 | 
						|
  { 
 | 
						|
    if (_lseek(S->F, LOCK_OFF + rec, SEEK_SET) == -1L)
 | 
						|
      if ((S->IOR = CIOResult()) != NoErr) return(-1);
 | 
						|
    
 | 
						|
    if ( _locking(S->F,lm, 1L) == -1)
 | 
						|
    { 
 | 
						|
      S->IOR = CIOResult();
 | 
						|
      
 | 
						|
      // EACCESS = 13, EAGAIN = 11
 | 
						|
      if (S->IOR == 13) S->IOR = 11;   
 | 
						|
      if (LockMode == UnLock || LockMode == NoLock) S->IOR = NoErr;
 | 
						|
      if (S->IOR != NoErr) return(-1);
 | 
						|
    }  
 | 
						|
  }
 | 
						|
#else
 | 
						|
  if (lseek(S->F, LOCK_OFF + rec, SEEK_SET) == -1L)
 | 
						|
    if ((S->IOR = CIOResult()) != NoErr) return(-1) ;
 | 
						|
  if (lockf(S->F,lm, 1L) == -1)
 | 
						|
    if ((S->IOR = CIOResult()) != NoErr) return(-1) ;
 | 
						|
#endif
 | 
						|
}
 | 
						|
#ifdef WIN32
 | 
						|
  if (_lseek(S->F, pos, SEEK_SET) == -1L)
 | 
						|
#else
 | 
						|
    if (lseek(S->F, pos, SEEK_SET) == -1L)
 | 
						|
#endif
 | 
						|
      if ((S->IOR = CIOResult()) != NoErr) return(-1) ;
 | 
						|
  return(0) ;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) CLockRec  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Esegue un comando lock sul record nro. "rec" del file descritto da "s".
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   Solo versione XENIX.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
void CLockRec(s, rec, lockmode) 
 | 
						|
  SecDef                        *s ; /* descrittore del file */
 | 
						|
  RecNoType     rec ; /* numero record su cui effettuare il lock */
 | 
						|
  unsigned              lockmode;/* operazione lock da effettuare  */
 | 
						|
 | 
						|
{
 | 
						|
  seeklk(s, CalcPos(rec, s->LenRec, s->BaseFil), setlock(lockmode), lockmode, rec);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) CVerify  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Verifica che il file "name" esista.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   junk = variabile di lavoro.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
void                             CVerify(S, Name)
 | 
						|
  SecDef                                *S;   /* descrittore File */
 | 
						|
  FileName                      Name; /* nome file        */
 | 
						|
 | 
						|
{
 | 
						|
  int   junk ;
 | 
						|
 | 
						|
  S->IOR = NoErr;
 | 
						|
#ifdef WIN32
 | 
						|
  if ((S->F = sopen(Name, O_RDONLY | O_BINARY, SH_DENYNO, S_IREAD | S_IWRITE)) == -1)
 | 
						|
#else
 | 
						|
    if ((S->F = open(Name, O_RDONLY, 0666)) == -1)
 | 
						|
#endif
 | 
						|
      S->IOR = CIOResult();
 | 
						|
    else
 | 
						|
      if (close(S->F) == -1)
 | 
						|
      {
 | 
						|
        junk = CIOResult();
 | 
						|
        if (!S->IOR) S->IOR = junk;
 | 
						|
      }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) COpen  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Apre un file di record.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   junk = variabile di lavoro.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
void                             COpen(S, Name, Len, Base, LockMode)
 | 
						|
  SecDef        *S;            /* descrittore file */
 | 
						|
  FileName                      Name;    /* nome del file    */
 | 
						|
  unsigned                      Len;     /* lunghezza record */
 | 
						|
  unsigned                      Base;    /* offset dall'inizio del file fisico; e' sempre 0 per i file dati */
 | 
						|
  unsigned                      LockMode;/* lock di apertura del file    */
 | 
						|
 | 
						|
{
 | 
						|
  int   junk;
 | 
						|
 | 
						|
  S->IOR = NoErr;
 | 
						|
#ifdef WIN32
 | 
						|
  if ((S->F = sopen(Name, O_RDWR|O_BINARY,
 | 
						|
                    /*  test_share() && */ LockMode == ExclLock ? SH_DENYRW : 
 | 
						|
                    SH_DENYNO, S_IREAD|S_IWRITE)) == -1)
 | 
						|
#else
 | 
						|
    if ((S->F = open(Name, O_RDWR , 0666)) == -1)
 | 
						|
#endif
 | 
						|
      if ((S->IOR = CIOResult()) != NoErr) return ;
 | 
						|
  S->LenRec = Len;
 | 
						|
  S->BaseFil = Base * BlockLenIO ;
 | 
						|
  S->LockMode = LockMode ;
 | 
						|
  S->lpos = -1;
 | 
						|
  strcpy(S->name, Name);
 | 
						|
  if (lseek(S->F, 0L, SEEK_SET) == -1L)
 | 
						|
    if ((S->IOR = CIOResult()) != NoErr) return ;
 | 
						|
  if (excllock(Name, (S->LockMode == ExclLock)) == -1)
 | 
						|
  {
 | 
						|
    S->IOR = CIOResult();
 | 
						|
    if (close(S->F) == -1) junk = CIOResult();
 | 
						|
  }
 | 
						|
}
 | 
						|
/*
 | 
						|
   @(#) CCreate  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Crea un nuovo file di record.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   junk = variabile di lavoro.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
void                            CCreate(S, Name, Len, Base, MaxSec)
 | 
						|
  SecDef                                *S;     /* descrittore del file */
 | 
						|
  FileName                      Name;   /* nome del file        */
 | 
						|
  unsigned                      Len;    /* lunghezza del record */
 | 
						|
  unsigned                      Base;   /* offset dall'inizio del file fisico  */
 | 
						|
  RecNoType                     MaxSec; /* Numero di blocchi di disco da allocare */
 | 
						|
 | 
						|
{
 | 
						|
  int                           junk;
 | 
						|
 | 
						|
  S->IOR = NoErr;
 | 
						|
#ifdef WIN32
 | 
						|
  if ((S->F = sopen(Name, O_RDWR | O_CREAT, SH_DENYNO, S_IREAD | S_IWRITE)) == -1)
 | 
						|
#else
 | 
						|
    if ((S->F = open(Name, O_RDWR | O_CREAT, 0666)) == -1)
 | 
						|
#endif
 | 
						|
      if ((S->IOR = CIOResult()) != NoErr) return ;
 | 
						|
#ifdef WIN32
 | 
						|
  if (chsize(S->F, ((RecNoType) MaxSec)*BlockLenIO) == -1)
 | 
						|
#else
 | 
						|
  if (lseek(S->F, ((RecNoType) MaxSec)*BlockLenIO, SEEK_SET) == -1)
 | 
						|
#endif
 | 
						|
		S->IOR = CIOResult();
 | 
						|
 | 
						|
  if (close(S->F) == -1)
 | 
						|
  {
 | 
						|
    junk = CIOResult();
 | 
						|
    if (!S->IOR) S->IOR = junk;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) CChsize  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Cambia la dimensione di un file di record.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   junk = variabile di lavoro.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
void                            CChsize(S, Name, Len, Base, MaxSec)
 | 
						|
  SecDef                                *S;     /* descrittore del file */
 | 
						|
  FileName                      Name;   /* nome del file        */
 | 
						|
  unsigned                      Len;    /* lunghezza del record */
 | 
						|
  unsigned                      Base;   /* offset dall'inizio del file fisico */ 
 | 
						|
  RecNoType                     MaxSec; /* numero di blocchi del file modificati */
 | 
						|
 | 
						|
{
 | 
						|
  int                           junk;
 | 
						|
 | 
						|
  S->IOR = NoErr;
 | 
						|
#ifdef WIN32
 | 
						|
  if ((S->F = sopen(Name, O_RDWR | O_BINARY, SH_DENYNO, S_IREAD | S_IWRITE)) == -1)
 | 
						|
#else
 | 
						|
    if ((S->F = open(Name, O_RDWR, 0666)) == -1)
 | 
						|
#endif
 | 
						|
      if ((S->IOR = CIOResult()) != NoErr) return ;
 | 
						|
#ifdef WIN32
 | 
						|
  if (chsize(S->F, ((RecNoType) MaxSec)*BlockLenIO) == -1)
 | 
						|
#else
 | 
						|
  if (lseek(S->F, ((RecNoType) MaxSec)*BlockLenIO, SEEK_SET) == -1)
 | 
						|
#endif
 | 
						|
 | 
						|
    S->IOR = CIOResult();
 | 
						|
  if (close(S->F) == -1)
 | 
						|
  {
 | 
						|
    junk = CIOResult();
 | 
						|
    if (!S->IOR) S->IOR = junk;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) CClose  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Chiude un file di record. 
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   */
 | 
						|
 | 
						|
void                             CClose(S)
 | 
						|
  SecDef        *S; /* descrittore del file da chiudere */
 | 
						|
 | 
						|
{
 | 
						|
  S->IOR = NoErr;
 | 
						|
#ifdef WIN32
 | 
						|
  if (close(S->F) == -1) S->IOR = CIOResult();
 | 
						|
#else
 | 
						|
  if (S->LockMode == AutoLock)
 | 
						|
  {
 | 
						|
    if (S->lpos != -1)
 | 
						|
    {
 | 
						|
      if (lseek(S->F, S->lpos, SEEK_SET) == -1L)
 | 
						|
        if ((S->IOR = CIOResult()) != NoErr) return ;
 | 
						|
      if (lockf(S->F,F_ULOCK,(long) S->LenRec) == -1)
 | 
						|
        if ((S->IOR = CIOResult()) != NoErr) return ;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  if (close(S->F) == -1) S->IOR = CIOResult();
 | 
						|
  if (exclunlock(S->name, (S->LockMode == ExclLock)) == -1)
 | 
						|
    S->IOR = CIOResult();
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) CDelete  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Cancella un file di record.
 | 
						|
   @(FD)
 | 
						|
   */
 | 
						|
 | 
						|
 | 
						|
void                             CDelete(S, Name)
 | 
						|
  SecDef        *S;         /* descrittore del file */
 | 
						|
  FileName                      Name; /* Nome del file        */
 | 
						|
 | 
						|
{
 | 
						|
  if (unlink(Name) == -1)
 | 
						|
    S->IOR = CIOResult();
 | 
						|
  else
 | 
						|
    S->IOR = NoErr;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) CRead  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Legge un record del file.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   junk = variabile di lavoro.
 | 
						|
 | 
						|
   fpos = contiene la posizione del record all'interno del file.
 | 
						|
   @(FSV)
 | 
						|
 | 
						|
   @(IN)
 | 
						|
   Lo spazio necessario a contenere il record letto deve essere stato allocato in precedenza.
 | 
						|
   @(FN)
 | 
						|
   */
 | 
						|
 | 
						|
void                             CRead(S, RecBuf, Rec, LockMode)
 | 
						|
  SecDef        *S;             /* descrittore del file           */
 | 
						|
  RecType                               RecBuf;   /* spazio per contenere il record */
 | 
						|
  RecNoType                     Rec;      /* Record da leggere              */
 | 
						|
  unsigned                      LockMode; /* lock sul record                */
 | 
						|
 | 
						|
{
 | 
						|
  int                           junk;
 | 
						|
  register      RecNoType       fpos;
 | 
						|
 | 
						|
  if (Rec)
 | 
						|
  {
 | 
						|
    S->IOR = NoErr;
 | 
						|
    fpos = CalcPos(Rec, S->LenRec, S->BaseFil);
 | 
						|
#ifndef WIN32
 | 
						|
    if (S->LockMode == AutoLock)
 | 
						|
    {
 | 
						|
      if (S->lpos != -1)
 | 
						|
        if (seeklk(S, S->lpos, F_ULOCK, LockMode, (S->lpos - S->BaseFil) / S->LenRec) == -1) return ;
 | 
						|
      if (seeklk(S, fpos, F_TLOCK, LockMode, Rec) == -1) return ;
 | 
						|
      S->lpos = fpos ;
 | 
						|
    }
 | 
						|
    else
 | 
						|
#endif
 | 
						|
    if (seeklk(S, fpos, setlock(LockMode), LockMode, Rec) == -1) return ;
 | 
						|
    if (read(S->F, RecBuf, (unsigned) S->LenRec) == -1)
 | 
						|
    {
 | 
						|
      S->IOR = CIOResult();
 | 
						|
      junk = seeklk(S, fpos, setlock(UnLock), LockMode, Rec) == -1;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else S->IOR = 3;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) CWrite  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Scrive un record nel file.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   junk = variabile di lavoro.
 | 
						|
 | 
						|
   fpos = contiene la posizione del record all'interno del file.
 | 
						|
   @(FSV)
 | 
						|
 | 
						|
   @(IN)
 | 
						|
   Lo spazio necessario a contenere il record letto deve essere stato allocato in precedenza.
 | 
						|
   @(FN)
 | 
						|
   */
 | 
						|
 | 
						|
void                             CWrite(S, RecBuf, Rec, LockMode)
 | 
						|
  SecDef        *S;             /* descrittore del file                      */
 | 
						|
  RecType                               RecBuf;   /* spazio che contiene il record da scrivere */
 | 
						|
  RecNoType                     Rec;      /* numero del record da scrivere             */
 | 
						|
  unsigned                      LockMode; /* lock sul record                           */
 | 
						|
 | 
						|
{
 | 
						|
  int                           junk;
 | 
						|
  register      RecNoType       fpos;
 | 
						|
 | 
						|
  if (Rec)
 | 
						|
  {
 | 
						|
    S->IOR = NoErr;
 | 
						|
    fpos = CalcPos(Rec, S->LenRec, S->BaseFil);
 | 
						|
#ifndef WIN32
 | 
						|
    if (S->LockMode == AutoLock)
 | 
						|
    {
 | 
						|
      if (S->lpos != -1)
 | 
						|
        if (seeklk(S, S->lpos, F_ULOCK, LockMode, (S->lpos - S->BaseFil) / S->LenRec) == -1) return ;
 | 
						|
      if (seeklk(S, fpos, F_TLOCK, LockMode, Rec) == -1) return ;
 | 
						|
      S->lpos = fpos ;
 | 
						|
    }
 | 
						|
    else
 | 
						|
#endif
 | 
						|
      if (seeklk(S, fpos, setlock(LockMode), LockMode, Rec) == -1) return ;
 | 
						|
    if (write(S->F, RecBuf, (unsigned) S->LenRec) == -1)
 | 
						|
    {
 | 
						|
      S->IOR = CIOResult();
 | 
						|
      junk = seeklk(S, fpos, setlock(UnLock), LockMode, Rec) == -1;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else S->IOR = 3;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) IDeleteRec  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Cancellazione logica di un record.
 | 
						|
   @(FD)
 | 
						|
   */
 | 
						|
 | 
						|
void                             IDeleteRec(RecBuf)
 | 
						|
  RecType                        RecBuf; /* record da cancellare */
 | 
						|
 | 
						|
{
 | 
						|
  RecBuf[0] = Deleted;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) IRecallRec  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Recupero logico di un record.
 | 
						|
   @(FD)
 | 
						|
   */
 | 
						|
 | 
						|
void                             IRecallRec(RecBuf)
 | 
						|
  RecType                        RecBuf; /* record da recuperare logicamente */
 | 
						|
 | 
						|
{
 | 
						|
  RecBuf[0] = Valid;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) IRecIsDeleted  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Controlla se il record in "RecBuf" e' cancellato oppure no.
 | 
						|
   @(FD)
 | 
						|
   */
 | 
						|
 | 
						|
BOOLEAN         IRecIsDeleted(RecBuf)
 | 
						|
  RecType               RecBuf; /* record da controllare */
 | 
						|
 | 
						|
{
 | 
						|
  return (RecBuf[0] == Deleted);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) ITestLock  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Controlla se l'errore "err" e' dovuto ad un lock.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   Versione WIN32 e LINUX.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
 | 
						|
BOOLEAN         ITestLock(err)
 | 
						|
  int           err;  /* codice di errore */
 | 
						|
 | 
						|
{
 | 
						|
  return(TESTLOCK(err)) ;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef LINUX
 | 
						|
struct lockdata
 | 
						|
{
 | 
						|
  int users;
 | 
						|
  int excl;
 | 
						|
} ld;
 | 
						|
 | 
						|
int sizeld = sizeof(struct lockdata);
 | 
						|
 | 
						|
/*
 | 
						|
   @($) lockpath  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Restituisce il nome del file di lock per il file "name".
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   path = percorso per il file (/usr/tmp/....).
 | 
						|
 | 
						|
   s1,s,s2   = stringhe di lavoro (nomi file).
 | 
						|
 | 
						|
   Solo versione XENIX.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
char            *lockpath(name)
 | 
						|
  char  *name; /* stringa nome file */
 | 
						|
 | 
						|
{
 | 
						|
  static char   path[200];
 | 
						|
  char *s1 = name, *s = name, *s2 = name;
 | 
						|
 | 
						|
  while ((s1 = strchr(s, DIRSEP)) != NULL)
 | 
						|
  {
 | 
						|
    s2 = s;
 | 
						|
    s = s1 + 1;
 | 
						|
  }
 | 
						|
  sprintf(path, "/usr/tmp/%s", s2);
 | 
						|
  return(path);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @($) dirname  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Estrae dal path il nome del direttorio.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   path = percorso per il file .
 | 
						|
 | 
						|
   s   = stringa di lavoro.
 | 
						|
 | 
						|
   Solo versione XENIX.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
char            *dirname(name)
 | 
						|
  char  *name; /* stringa contenente il path */
 | 
						|
 | 
						|
{
 | 
						|
  static char   path[200];
 | 
						|
  char                                  *s;
 | 
						|
 | 
						|
  strcpy(path,name);
 | 
						|
  if ((s = strrchr(path, DIRSEP)) == NULL) strcpy(path, ".");
 | 
						|
  else *s = '\0';
 | 
						|
  return(path);
 | 
						|
}
 | 
						|
 | 
						|
static int      semres = 0;
 | 
						|
 | 
						|
/*
 | 
						|
   @($) semtran  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Trasforma il nome di un semaforo in un identificatore poi lo crea o lo apre.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   key = chiave corrispondente al nome semaforo.
 | 
						|
 | 
						|
   id  = identificatore del semaforo.
 | 
						|
 | 
						|
   Solo versione XENIX.
 | 
						|
   La semget fa una open sul semaforo; se non lo trova lo crea e poi lo libera.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
int     semtran(s)
 | 
						|
  char  *s; /* stringa nome del semaforo */
 | 
						|
 | 
						|
{
 | 
						|
  register      int key = 0, sid;
 | 
						|
 | 
						|
  semres = 0 ;
 | 
						|
  while (*s) key += *s++;
 | 
						|
  if ((sid = semget((key_t) key, 1, 0666)) == -1)
 | 
						|
  {
 | 
						|
    if ((sid = semget((key_t) key, 1, 0666 | IPC_CREAT)) == -1)
 | 
						|
      semres = -1;
 | 
						|
    VS(sid);
 | 
						|
  }
 | 
						|
  return(sid);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @($) semcall  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Chiama il semaforo "sid" e su di esso svolge "op".
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   sb = struttura necessaria per la chiamata a "semop".
 | 
						|
 | 
						|
   Solo versione XENIX.
 | 
						|
   @(FSV)
 | 
						|
 | 
						|
   @(IN)
 | 
						|
   se op = -1 il semaforo viene occupato.
 | 
						|
 | 
						|
   se op = +1 il semaforo viene liberato.
 | 
						|
   @(FN)
 | 
						|
   */
 | 
						|
 | 
						|
static void semcall(sid, op)
 | 
						|
  int           sid; /* identificatore semaforo */
 | 
						|
  int           op;  /* operazione da effettuare sul semaforo: libero/occupato */
 | 
						|
 | 
						|
{
 | 
						|
  struct sembuf sb;
 | 
						|
 | 
						|
  semres = 0 ;
 | 
						|
  sb.sem_num = 0;
 | 
						|
  sb.sem_op = op;
 | 
						|
  sb.sem_flg = 0;
 | 
						|
  if (semop(sid, &sb, 1) == -1)
 | 
						|
    semres = -1;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @($) PS  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Acquisisce il semaforo "sid".
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   Solo versione XENIX.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
void    PS(sid)
 | 
						|
  int   sid; /* identificatore semaforo */
 | 
						|
 | 
						|
{
 | 
						|
  semcall(sid, -1);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @($) VS  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Rilascia il semaforo "sid".
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   Solo versione XENIX.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
void    VS(sid)
 | 
						|
  int   sid;
 | 
						|
 | 
						|
{
 | 
						|
  semcall(sid, 1);
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) excllock  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Funzione per la gestione di un lock esclusivo su tutto il file.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   Nella versione XENIX:
 | 
						|
 | 
						|
   path = contiene il file di lock.
 | 
						|
 | 
						|
   dir  = contiene la directory.
 | 
						|
 | 
						|
   fd        = identificatore restituito dalla "open".
 | 
						|
 | 
						|
   junk = variabile di lavoro.
 | 
						|
 | 
						|
   sid       = identificatore del semaforo su locksem.
 | 
						|
 | 
						|
   errno     = codice errore.
 | 
						|
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
int excllock(name,excl)
 | 
						|
  char  *name;  /* nome del file                               */
 | 
						|
  int excl; /* se true deve fare il lock ex. altrimenti no */
 | 
						|
 | 
						|
{
 | 
						|
#ifdef LINUX
 | 
						|
  char  path[200], dir[200];
 | 
						|
  int           fd, junk, sid;
 | 
						|
  extern int errno;
 | 
						|
 | 
						|
  strcpy(path, lockpath(name));
 | 
						|
  strcpy(dir, dirname(path));
 | 
						|
  sid = semtran(LOCKSEM);
 | 
						|
  if (semres == -1) return(-1);
 | 
						|
  PS(sid);
 | 
						|
  if (semres == -1) return(-1);
 | 
						|
  if (xvt_fsys_access(dir, F_OK) == ENOENT)
 | 
						|
	 xvt_fsys_mkdir(dir);
 | 
						|
  if (((fd = open(path, O_WRONLY | O_CREAT | O_EXCL, 0666)) == -1) && 
 | 
						|
      errno == EEXIST)
 | 
						|
  {
 | 
						|
    errno = 0;
 | 
						|
    if ((fd = open(path, O_RDWR, 0666)) == -1)
 | 
						|
    {
 | 
						|
      VS(sid);
 | 
						|
      return(-1);
 | 
						|
    }
 | 
						|
    if ((read(fd, &ld, sizeld) <= 0) ||
 | 
						|
        (lseek(fd, 0L, SEEK_SET) == -1L))
 | 
						|
    {
 | 
						|
      junk = close(fd);
 | 
						|
      VS(sid);
 | 
						|
      return(-1) ;
 | 
						|
    }
 | 
						|
    if (((ld.excl) && (ld.excl != getpid())) || excl)
 | 
						|
    {
 | 
						|
      junk = close(fd);
 | 
						|
      errno = EACCES ;
 | 
						|
      VS(sid);
 | 
						|
      return(-1);
 | 
						|
    }
 | 
						|
    ld.users++;
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    if (fd == -1)
 | 
						|
    {
 | 
						|
      VS(sid);
 | 
						|
      return(-1);
 | 
						|
    }
 | 
						|
    errno = 0;
 | 
						|
    ld.users = 1;
 | 
						|
    if (excl) ld.excl = getpid();
 | 
						|
    else ld.excl = 0;
 | 
						|
  }
 | 
						|
  if (write(fd, &ld, sizeld) == -1) 
 | 
						|
  {
 | 
						|
    junk = close(fd);
 | 
						|
    VS(sid);
 | 
						|
    return(-1);
 | 
						|
  }
 | 
						|
  if (close(fd) == -1)
 | 
						|
  {
 | 
						|
    VS(sid);
 | 
						|
    return(-1);
 | 
						|
  }
 | 
						|
  VS(sid);
 | 
						|
  if (semres == -1) return(-1);
 | 
						|
#endif
 | 
						|
  return(0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
   @(#) exclunlock  CUSTIO
 | 
						|
 | 
						|
   @(ID)
 | 
						|
   Gestisce un unlock esclusivo su tutto il file.
 | 
						|
   @(FD)
 | 
						|
 | 
						|
   @(ISV)
 | 
						|
   Nella versione XENIX:
 | 
						|
 | 
						|
   path = contiene il file di lock.
 | 
						|
 | 
						|
   fd        = identificatore restituito dalla "open".
 | 
						|
 | 
						|
   junk = variabile di lavoro.
 | 
						|
 | 
						|
   sid       = identificatore del semaforo su locksem.
 | 
						|
   @(FSV)
 | 
						|
   */
 | 
						|
 | 
						|
int     exclunlock(name,excl)
 | 
						|
  char  *name;  /* nome file */
 | 
						|
  int excl; /* se true esegue un unlock sul file */
 | 
						|
 | 
						|
{
 | 
						|
#ifdef LINUX
 | 
						|
  int                           fd, junk, sid;
 | 
						|
  char                  path[200];
 | 
						|
 | 
						|
  strcpy(path, lockpath(name));
 | 
						|
  sid = semtran(LOCKSEM);
 | 
						|
  if (semres == -1) return(-1);
 | 
						|
  PS(sid);
 | 
						|
  if (semres == -1) return(-1);
 | 
						|
  if (((fd = open(path, O_RDWR , 0666)) == -1) ||
 | 
						|
      (read(fd, &ld, sizeld) <= 0) ||
 | 
						|
      (lseek(fd, 0L, SEEK_SET) == -1L))
 | 
						|
  {
 | 
						|
    junk = close(fd);
 | 
						|
    VS(sid);
 | 
						|
    return(-1);
 | 
						|
  }
 | 
						|
  if (excl) ld.excl = 0;
 | 
						|
  if (--ld.users == 0)
 | 
						|
  {
 | 
						|
    if ((close(fd) == -1) || (unlink(path) == -1))
 | 
						|
    {
 | 
						|
      VS(sid);
 | 
						|
      return(-1);
 | 
						|
    }
 | 
						|
    VS(sid);
 | 
						|
    if (semres == -1) return(-1);
 | 
						|
    return(0);
 | 
						|
  }
 | 
						|
  if (write(fd, &ld, sizeld) == -1)
 | 
						|
  {
 | 
						|
    junk = close(fd);
 | 
						|
    VS(sid);
 | 
						|
    return(-1);
 | 
						|
  }
 | 
						|
  if (close(fd) == -1)
 | 
						|
  {
 | 
						|
    VS(sid);
 | 
						|
    return(-1);
 | 
						|
  }
 | 
						|
  VS(sid);
 | 
						|
  if (semres == -1) return(-1);
 | 
						|
#endif
 | 
						|
  return(0);
 | 
						|
}
 |