ibm-information-center/dist/eclipse/plugins/i5OS.ic.apis_5.4.0.1/dossfllk.htm

455 lines
12 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Copyright" content="Copyright (c) 2006 by IBM Corporation">
<title>DosSetFileLocks()--Lock and Unlock a Byte Range of an Open File</title>
<!-- Begin Header Records ========================================== -->
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<!-- Change History: -->
<!-- YYMMDD USERID Change description -->
<!-- Unix2 SCRIPT J converted by B2H R4.1 (346) (CMS) by V2KEA304 -->
<!-- at RCHVMW2 on 17 Feb 1999 at 11:05:09 -->
<!-- Change History: -->
<!-- 011022 JTROUS: Changes from API Review 1, V5R2 -->
<!-- 010514 JET: This file has undergone html cleanup -->
<!-- 020719 MFENLON: updated for QFileSvr.400 threadsafety, V5R3 -->
<!-- 020905 JTROUS: Changes for scan processing, V5R3a, DCR 98680 -->
<!-- 021118 JTROUS: Correct ERROR_GEN_FAILURE (no change flag) -->
<!-- 050413 JTROUS: Minor fixups, V5R4 review (no change flag) -->
<!-- End Header Records -->
<link rel="stylesheet" type="text/css" href="../rzahg/ic.css">
</head>
<body>
<!-- Java sync-link -->
<script language="Javascript" src="../rzahg/synch.js" type="text/javascript">
</script>
<a name="Top_Of_Page"></a>
<h2>DosSetFileLocks()--Lock and Unlock a Byte Range of an Open File</h2>
<div class="box" style="width: 80%;">
<br>
&nbsp;&nbsp;Syntax
<pre>
#define INCL_DOSERRORS
#define INCL_DOSFILEMGR
#include &lt;os2.h&gt;
APIRET APIENTRY DosSetFileLocks(HFILE <em>FileHandle</em>,
PFILELOCK <em>ppUnLockRange</em>,
PFILELOCK <em>ppLockRange</em>,
ULONG <em>ulTimeOut</em>,
ULONG <em>ulFlags</em>);
</pre>
&nbsp;&nbsp;Service Program Name: QP0LLIB1<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Default Public Authority: *USE<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Threadsafe: Conditional; see <a href="#HDRDSFLUSG">Usage Notes</a>.<br>
<!-- iddvc RMBR -->
<br>
</div>
<p>The <strong>DosSetFileLocks()</strong> function locks and unlocks a range of
an open file. A non-zero range indicates that a lock or unlock request is being
made.</p>
<br>
<h3>Parameters</h3>
<dl>
<dt><strong><em>FileHandle</em></strong></dt>
<dd>(Input) The file descriptor of the file in which a range is to be
locked.</dd>
<dt><strong><em>ppUnlockRange</em></strong></dt>
<dd>(Input) Address of the structure containing the offset and length of a
range to be unlocked. The structure is as follows:
<dl compact>
<dt><em>FileOffset</em></dt>
<dd>The offset to the beginning of the range to be unlocked.</dd>
<dt><em>RangeLength</em></dt>
<dd>The length of the range to be unlocked. A value of zero means that
unlocking is not required.</dd>
</dl>
</dd>
<dt><strong><em>ppLockRange</em></strong></dt>
<dd>(Input) Address of the structure containing the offset and length of a
range to be locked. The structure is as follows:
<dl compact>
<dt><em>FileOffset</em></dt>
<dd>The offset to the beginning of the range to be locked.</dd>
<dt><em>RangeLength</em></dt>
<dd>The length of the range to be locked. A value of zero means that locking is
not required.</dd>
</dl>
</dd>
<dt><strong><em>ulTimeOut</em></strong></dt>
<dd>(Input) The maximum time, in milliseconds, that the process is to wait for
the requested locks.</dd>
<dt><strong><em>ulFlags</em></strong></dt>
<dd>(Input) Flags that describe the action to be taken. If any flags other than
those listed below are specified, the error ERROR_INVALID_PARAMETER will be
returned.
<p>The following values are to be specified in <em>ulFlags</em>:</p>
<dl compact>
<dt><em>'0x0002' or QP0L_DOSSETFILELOCKS_ATOMIC</em></dt>
<dd>Atomic. This bit defines a request for atomic locking. If this bit is set
to 1 and the lock range is equal to the unlock range, an atomic lock occurs. If
this bit is set to 1 and the lock range is not equal to the unlock range,
ERROR_LOCK_VIOLATION is returned.</dd>
<dt><em>'0x0001' or QP0L_DOSSETFILELOCKS_SHARE</em></dt>
<dd>Share. This bit defines the type of access that other processes may have to
the file range that is being locked.
<p>If this bit is set to 0 (the default), other processes have no access to the
locked file range. The current process has exclusive access to the locked file
range, which must not overlap any other locked file range.</p>
<p>If this bit is set to 1, the current process and other processes have shared
access to the locked file range. A file range with shared access may overlap
any other file range with shared access, but must not overlap any other file
range with exclusive access.</p>
</dd>
</dl>
</dd>
</dl>
<br>
<h3>Authorities</h3>
<p>No authorization is required.</p>
<br>
<h3>Return Value</h3>
<dl compact>
<dt><em>NO_ERROR (0)</em></dt>
<dd><strong>DosSetFileLocks()</strong> was successful.</dd>
<dt><em>value (non-zero)</em></dt>
<dd><strong>DosSetFileLocks()</strong> was not successful.
The <em>value</em> that is returned indicates the error.</dd>
</dl>
<br>
<h3>Error Conditions</h3>
<p>If <strong>DosSetFileLocks()</strong> is not successful, the value that is
returned is one of the following errors. The &lt;<strong>bseerr.h</strong>&gt;
header file defines these values.</p>
<dl compact>
<dt><em>[ERROR_GEN_FAILURE]</em></dt>
<dd>
<p>A general failure occurred.</p>
<p>This may result from damage in the system. Refer to messages in the job log
for other possible causes.</p>
</dd>
<dt><em>[ERROR_INVALID_HANDLE]</em></dt>
<dd>
<p>An invalid file handle was found.</p>
<p>The file handle passed to this function is not valid.</p>
</dd>
<dt><em>[ERROR_LOCK_VIOLATION]</em></dt>
<dd>
<p>A lock violation was found.</p>
<p>The requested lock and unlock ranges are both zero.</p>
</dd>
<dt><em>[ERROR_INVALID_PARAMETER]</em></dt>
<dd>
<p>An invalid parameter was found.</p>
<p>A parameter passed to this function is not valid.</p>
<p>The byte range specified by the offset and length in the ppUnlockRange or
ppLockRange parameters extends beyond 2GB minus 1 byte.</p>
</dd>
<dt><em>[ERROR_ATOMIC_LOCK_NOT_SUPPORTED]</em></dt>
<dd>
<p>The atomic lock operation is not supported.</p>
<p>The file system does not support atomic lock operations.</p>
</dd>
<dt><em>[ERROR_TIMER_NOT_SUPPORTED]</em></dt>
<dd>
<p>The lock timer value is not supported.</p>
<p>The file system does not support the lock timer value.</p>
</dd>
</dl>
<br>
<h3>Error Messages</h3>
<p>The system may send the following messages from this function.</p>
<table width="100%" cellpadding="5">
<!-- cols="15 85" -->
<tr>
<th align="left" valign="top">Message ID</th>
<th align="left" valign="top">Error Message Text</th>
</tr>
<tr>
<td width="15%" valign="top">CPE3418 E</td>
<td width="85%" valign="top">Possible APAR condition or hardware failure.</td>
</tr>
<tr>
<td valign="top">CPFA0D4 E</td>
<td valign="top">File system error occurred. Error number &amp;1.</td>
</tr>
<tr>
<td valign="top">CPF3CF2 E</td>
<td valign="top">Error(s) occurred during running of &amp;1 API.</td>
</tr>
<tr>
<td valign="top">CPF9872 E</td>
<td valign="top">Program or service program &amp;1 in library &amp;2 ended.
Reason code &amp;3.</td>
</tr>
</table>
<br>
<br>
<h3><a name="HDRDSFLUSG">Usage Notes</a></h3>
<ol type="1">
<li>If this function is called
by a thread executing one of the scan-related exit programs (or any of its
created threads), it will fail with error code [ENOTSUP]. See <a href=
"ifsopenexit.htm">Integrated File System Scan on Open Exit Programs</a> and <a
href="ifscloseexit.htm">Integrated File System Scan on Close Exit Programs</a>
for more information.
<br><br>
</li>
<li>This function will fail with error code [ERROR_GEN_FAILURE] when all the
following conditions are true:
<ul>
<li>Where multiple threads exist in the job.</li>
<li>The object this function is operating on resides in a file system that is
not threadsafe. Only the following file systems are threadsafe for this
function:
<ul>
<li>"Root" (/)</li>
<li>QOpenSys</li>
<li>User-defined</li>
<li>QNTC</li>
<li>QSYS.LIB</li>
<li>Independent ASP QSYS.LIB</li>
<li>QOPT</li>
<li>QFileSvr.400</li>
</ul>
</li>
</ul>
<br>
</li>
<li>The following file systems do not support timer values other than 0. An
attempt to a value other than 0 for the timer value results in an
ERROR_TIMER_NOT_SUPPORTED error.
<p>Also, the following file systems do not support the atomic locking flag. If you
turn on the atomic locking flag, an ERROR_ATOMIC_LOCKS_NOT_SUPPORTED error is
returned.</p>
<ul>
<li>"Root" (/)</li>
<li>QOpenSys</li>
<li>User-Defined File System</li>
<li>QDLS</li>
<li>QOPT</li>
<li>QNetWare</li>
</ul>
<br>
</li>
<li>The following file systems do not support byte range locks. An attempt to
use this API results in an ERROR_GEN_FAILURE error.
<ul>
<li>QSYS.LIB</li>
<li>Independent ASP QSYS.LIB</li>
<li>Network File System</li>
<li>QFileSvr.400</li>
</ul>
<br>
</li>
<li>When you develop in C-based languages and this function is compiled with
the _LARGE_FILES macro defined, it will be mapped to <strong>
DosSetFileLocks64()</strong>. Additionally, the <samp>PFILELOCK</samp> data
type will be mapped to a type <samp>PFILELOCK64</samp>.
<br><br></li>
<li>Locks placed on character special files result in advisory locks.&nbsp; For
more information on advisory locking, please see the <a href="fcntl.htm">
fcntl()--Perform File Control Command</a>.
</li>
</ol>
<br>
<h3>Related Information</h3>
<ul>
<li>The &lt;<strong>fcntl.h</strong>&gt; file (see <a href="unix13.htm">Header
Files for UNIX-Type Functions</a>)</li>
<li>The &lt;<strong>os2.h</strong>&gt; file (see <a href="unix13.htm">Header
Files for UNIX-Type Functions</a>)</li>
<li>The &lt;<strong>os2def.h</strong>&gt; file (see <a href="unix13.htm">Header
Files for UNIX-Type Functions</a>)</li>
<li>The &lt;<strong>bse.h</strong>&gt; file (see <a href="unix13.htm">Header
Files for UNIX-Type Functions</a>)</li>
<li>The &lt;<strong>bsedos.h</strong>&gt; file (see <a href="unix13.htm">Header
Files for UNIX-Type Functions</a>)</li>
<li>The &lt;<strong>bseerr.h</strong>&gt; file (see <a href="unix13.htm">Header
Files for UNIX-Type Functions</a>)</li>
<li><a href="dossfl64.htm">DosSetFileLocks64()</a>--Lock and Unlock a Byte
Range of an Open File (Large File Enabled)</li>
</ul>
<br>
<h3>Example</h3>
<p>See <a href="../apiref/aboutapis.htm#codedisclaimer">Code disclaimer information</a>
for information pertaining to code examples.</p>
<p>The following example opens, locks, and unlocks a file.</p>
<pre>
#define INCL_DOSERRORS
#define INCL_DOSFILEMGR
#include &lt;os2.h&gt;
#include &lt;stdio.h&gt;
#define NULL_RANGE 0L
#define LOCK_FLAGS 0
main() {
char fn[]="lock.file";
char buf[] =
"Test data for locking and unlocking range of a file";
int fd;
ULONG lockTimeout = 2000; /* lock timeout of 2 seconds */
FILELOCK Area; /* area of file to lock/unlock */
Area.Offset = 4; /* start locking at byte 4 */
Area.Range = 10; /* lock 10 bytes for the file */
/* Create a file for this example */
fd = creat(fn, S_IWUSR | S_IRUSR);
/* Write some data to the file */
write(fd, buf, sizof(buf) -1);
close(fd);
/* Open the file */
if ((fd = open(fn, O_RDWR) &lt; 0)
{
perror("open() error");
return;
}
/* Lock a range */
rc = DosSetFileLocks((HFILE)fd,
NULL_RANGE,
&amp;Area,
&amp;LockTimeout,
LOCK_FLAGS);
if(rc != 0) /* Lock failed */
{
perror("DosSetFileLocks() error");
}
/* Unlock a range */
rc = DosSetFileLocks((HFILE)fd,
&amp;Area,
NULL_RANGE,
&amp;LockTimeout,
LOCK_FLAGS);
if(rc != 0) /* Unlock failed */
{
perror("DosSetFileLocks() error");
}
close(fd);
unlink(fn);
}
</pre>
<hr>
API introduced: V4R2
<hr>
<center>
<table cellpadding="2" cellspacing="2">
<tr align="center">
<td valign="middle" align="center"><a href="#Top_Of_Page">Top</a> | <a href=
"unix.htm">UNIX-Type APIs</a> | <a href="aplist.htm">APIs by category</a></td>
</tr>
</table>
</center>
</body>
</html>