ftp.nice.ch/pub/next/database/apps/RZToDoList.1.1.s.tar.gz#/RZToDoList/lock_file.c

This is lock_file.c in view mode; [Download] [Up]

/* 
 * lock_file - functions for file locking
 *
 * You may freely copy, distribute and reuse the code in this example.
 * This code is provided AS IS without warranty of any kind, expressed 
 * or implied, as to its fitness for any particular use.
 *
 * Copyright 1995 Ralph Zazula (rzazula@next.com).  All Rights Reserved.
 *
 */

#include "lock_file.h"
#include <libc.h>
#include <stdio.h>
#include <errno.h>

int lock_file(char *filename)
/*
 * Drops a lock file "filename.lock" for "filename".  Returns:
 * 	LOCK_SUCCESS	(0)	success
 * 	LOCK_EXIST		(-1)	lock file already exists
 * 	LOCK_NOCREATE	(-2)	couldn't create lock file
 */
{
	int fd;
	char lockfile[MAXPATHLEN+1];

	sprintf(lockfile, "%s.lock", filename);
	fd = open(lockfile, O_RDWR | O_CREAT | O_EXCL, 0660);
	if(fd < 0) {
		if(errno == EEXIST) {
			/* check age of lock file */
			struct stat st;
			if(!stat(lockfile, &st)) {
				if((time(NULL) - st.st_mtime) >= 3600) {
#ifdef DEBUG
					fprintf(stderr, "removing stale lock file for %s\n",filename);
#endif
					unlink(lockfile);
					fd = open(lockfile, O_RDWR | O_CREAT | O_EXCL, 0660);
					if(fd < 0) {
						if(errno == EEXIST) {
#ifdef DEBUG
							fprintf(stderr, "couldn't remove lock file for %s\n",filename);
#endif
						} else {
#ifdef DEBUG
							fprintf(stderr, "couldn't create lock file for %s\n",filename);							
#endif
						}
						return LOCK_NOCREATE;
					} else {
						close(fd);
						return LOCK_SUCCESS;
					}
				} else {
					return LOCK_EXIST;
				}
			} else {
#ifdef DEBUG
				fprintf(stderr, "couldn't stat %s\n",lockfile);
#endif
				return LOCK_EXIST;
			}
		} else {
#ifdef DEBUG
			fprintf(stderr, "cannot create lock file %s\n", lockfile);
#endif
			return LOCK_NOCREATE;
		}
	} else {
		close(fd);
	}
	return LOCK_SUCCESS;
}

int unlock_file(char *filename)
/*
 * removes the lock file "filename.lock" for "filename".
 * Returns LOCK_SUCCESS on success and a negative error code on failure.
 * The error code is that which resulted from the attempted unlink().
 */
{
	char lockfile[MAXPATHLEN+1];
	
	sprintf(lockfile, "%s.lock", filename);
	if(!unlink(lockfile)) {
		return LOCK_SUCCESS;
	}
	return errno;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.