This example opens or creates and opens a file named "FLOCK.DAT," and updates it using file locks.

#define INCL_DOSFILEMGR       /* File Manager values */
#define INCL_DOSERRORS        /* DOS Error values    */
#include <os2.h>
#include <stdio.h>
#include <string.h>

int main(VOID) {

HFILE     FileHandle   = NULLHANDLE;  /* File handle */
ULONG     Action       = 0,           /* Action taken by DosOpen */
          Wrote        = 0,           /* Number of bytes written by DosWrite */
          i            = 0;           /* Loop index */
CHAR      FileData[40] = "Forty bytes of demonstration text data\r\n";
APIRET    rc           = NO_ERROR;    /* Return code */
FILELOCK  LockArea     = {0},         /* Area of file to lock */
          UnlockArea   = {0};         /* Area of file to unlock */

rc = DosOpen("flock.dat",                   /* File to open */
             &FileHandle,                   /* File handle */
             &Action,                       /* Action taken */
             4000L,                         /* File primary allocation */
             FILE_ARCHIVED,                 /* File attributes */
             FILE_OPEN | FILE_CREATE,       /* Open function type */
             OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE,
             0L);                           /* No extended attributes */
if (rc != NO_ERROR) {                       /* If open failed */
   printf("DosOpen error: return code = %u\n", rc);
   return 1;
}
LockArea.lOffset = 0L;              /* Start locking at beginning of file */
LockArea.lRange =  40L;             /* Use a lock range of 40 bytes       */

         /* Write 8000 bytes to the file, 40 bytes at a time */
for (i=0; i<200; ++i) {
  rc = DosSetFileLocks(FileHandle,        /* File handle   */
                       &UnlockArea,       /* Unlock previous record (if any) */
                       &LockArea,         /* Lock current record */
                       2000L,             /* Lock time-out value of 2 seconds */
                       0L);               /* Exclusive lock, not atomic */
  if (rc != NO_ERROR) {
     printf("DosSetFileLocks error: return code = %u\n", rc);
     return 1;
  }

  rc = DosWrite(FileHandle, FileData, sizeof(FileData), &Wrote);
  if (rc != NO_ERROR) {
     printf("DosWrite error: return code = %u\n", rc);
     return 1;
  }

   UnlockArea = LockArea;      /* Will unlock this record on next iteration */
   LockArea.lOffset += 40L;    /* Prepare to lock next record               */

} /* endfor - 8000 bytes written */
rc = DosClose(FileHandle);    /* Close file, this releases outstanding locks */
/* Should check if (rc != NO_ERROR) here ... */
return NO_ERROR;
}


[Back] [Next]