[daip] Re: file locking

gtaylor gtaylor at aoc.nrao.edu
Mon Nov 8 12:00:27 EST 2004


Hi Eric,

   Still no go with a somewhat different error message now:

>uc
ZLOCK non-ex: Operation not supported
AIPS 2: ZERROR: ON FILE DA02:CAD000000.177;
AIPS 2: ZERROR: IN ZDAOPN ERRNO = 45 (Operation not supported)

Ciao,
                                        - Greg

On Mon, 8 Nov 2004, Eric Greisen wrote:

> Let's try a debug:
> 
> cd $AIPS_ROOT
> . LOGIN.SH    (or source LOGIN.CSH)
> $CDTST
> cd $APLUNIX
> mv ZLOCK.C ZLOCK.C.SAVE
> cp attached file below to $APLUNIX/ZLOCK.C
> COMRPL $APLUNIX/ZLOCK
> COMLNK $AIPPGM/AIPS
> 
> then try the ucat again
> 
> Eric
> --------------------- cut here -------------------------------
> #ifndef _POSIX_SOURCE
> #define _POSIX_SOURCE
> #endif
> #define Z_lock__
> #include <unistd.h>
> #include <stdio.h>
> #include <errno.h>
> #include <fcntl.h>                      /* For System V 2.0+ read and */
>                                         /* write locks.               */
> #include <AIPSPROTO.H>
> 
> #if __STDC__
>    void zlock_(int *fd, char pname[MAXPNAME], int *excl, int *syserr,
>       int *ierr)
> #else
>    void zlock_(fd, pname, excl, syserr, ierr)
>    int *fd, *excl, *syserr, *ierr;
>    char pname[MAXPNAME];
> #endif
> /*--------------------------------------------------------------------*/
> /*! apply a shared or exclusive lock to a disk file                   */
> /*# Z2 IO-basic                                                       */
> /*--------------------------------------------------------------------*/
> /*;  Copyright (C) 1995, 1997-1998                                    */
> /*;  Associated Universities, Inc. Washington DC, USA.                */
> /*;                                                                   */
> /*;  This program is free software; you can redistribute it and/or    */
> /*;  modify it under the terms of the GNU General Public License as   */
> /*;  published by the Free Software Foundation; either version 2 of   */
> /*;  the License, or (at your option) any later version.              */
> /*;                                                                   */
> /*;  This program is distributed in the hope that it will be useful,  */
> /*;  but WITHOUT ANY WARRANTY; without even the implied warranty of   */
> /*;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    */
> /*;  GNU General Public License for more details.                     */
> /*;                                                                   */
> /*;  You should have received a copy of the GNU General Public        */
> /*;  License along with this program; if not, write to the Free       */
> /*;  Software Foundation, Inc., 675 Massachusetts Ave, Cambridge,     */
> /*;  MA 02139, USA.                                                   */
> /*;                                                                   */
> /*;  Correspondence concerning AIPS should be addressed as follows:   */
> /*;         Internet email: aipsmail at nrao.edu.                        */
> /*;         Postal address: AIPS Project Office                       */
> /*;                         National Radio Astronomy Observatory      */
> /*;                         520 Edgemont Road                         */
> /*;                         Charlottesville, VA 22903-2475 USA        */
> /*--------------------------------------------------------------------*/
> /*  Open (if necessary) and apply either a shared or exclusive lock   */
> /*  a file.  If an error occurs, files are NOT closed.                */
> /*  Inputs:                                                           */
> /*     pname    C*48   Physical file name                             */
> /*     excl     I      Lock type indicator: 0 => shared               */
> /*                                          1 => exclusive            */
> /*  In/out:                                                           */
> /*     fd       I      File descriptor (if -1, open the file as well  */
> /*                        as apply the requested lock; return the     */
> /*                        file descriptor)                            */
> /*  Output:                                                           */
> /*     syserr   I      System error code                              */
> /*     ierr     I      Error return code: 0 => no error               */
> /*                        1 => device not found (fd = -1)             */
> /*                        2 => file not found (fd = -1)               */
> /*                        3 => open error (fd = -1)                   */
> /*                        4 => exclusive use denied                   */
> /*                        6 => other lock error                       */
> /*  Bell UNIX version; requires Posix fcntl                           */
> /*--------------------------------------------------------------------*/
> {
>    int llen, xlen, xlnb, jerr;
>    register int i, j;
>    char pathname[MAXAPATH];
>    struct flock lock;
> /*--------------------------------------------------------------------*/
>    *ierr = 0;
>    *syserr = 0;
>                                         /* If *fd = -1, we need to    */
>                                         /* open the file first.       */
>    if (*fd == -1) {
>                                         /* Translate path name        */
>       llen = MAXPNAME;
>       xlen = MAXAPATH;
>       zpath_ (&llen, pname, &xlen, pathname, &xlnb, &jerr);
>       if (jerr != 0) {
>          *ierr = 1;
>          goto exit;
>          }
>       else {
>          pathname[xlnb] = '\0';
>                                         /* Open the disk file         */
>                                         /* read/write (= 2)           */
>          if ((*fd = open (pathname, O_RDWR)) == -1) {
>             *syserr = errno;
>                                         /* File doesn't exist.        */
>             if (errno == ENOENT)
>                *ierr = 2;
>                                         /* Some other open error.     */
>             else
>                *ierr = 3;
>             perror ("ZLOCK");
>             printf ("ZLOCK: Pathname %s\n",pathname);
>             goto exit;
>             }
>          }
>       }
>                                         /* Apply non-blocking lock.   */
>    lock.l_whence = SEEK_SET;
>    lock.l_start = 0;
>    lock.l_len = 0;
>                                         /* Exclusive lock.            */
>    if (*excl == 1) {
>       lock.l_type = F_WRLCK;
>       }
>    else {                               /* Shared lock                */
>       lock.l_type = F_RDLCK;
>       }
> 
>    if ( fcntl (*fd, F_SETLK, &lock) == -1 ) {
>       *syserr = errno;
>       if ( errno == EACCES || errno == EAGAIN ) {
>          *ierr = 4;
>          }
>       else {                            /* Some other error           */
>          if (*excl == 1) {
>             perror ("ZLOCK excl");
>             }
>          else {                         /* Shared lock                */
>             perror ("ZLOCK non-ex");
>             }
>          *ierr = 6;
>          }
>       }
> 
> exit:
>    return;
> }
> 




More information about the Daip mailing list