⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uucplock.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic	char	*sccsid = "@(#)uucplock.c	4.1	(ULTRIX)	7/17/90";#endif lint/************************************************************************ *									* *			Copyright (c) 1984 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************//* * defs that come from uucp.h */#define NAMESIZE 15#define FAIL -1#define SAME 0#define SLCKTIME 28800	/* system/device timeout (LCK.. files) in seconds (8 hours) */#define ASSERT(e, f, v) if (!(e)) {\	fprintf(stderr, "AERROR - (%s) ", "e");\	fprintf(stderr, f, v);\	finish(FAIL);\}#define LOCKPRE "/usr/spool/uucp/LCK."#define LCKMODE 0644/* * This code is taken almost directly from uucp and follows the same * conventions.  This is important since uucp and tip should * respect each others locks. */	/*  ulockf 3.2  10/26/79  11:40:29  *//* #include "uucp.h" */#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <sys/file.h>/******* *	ulockf(file, atime) *	char *file; *	time_t atime; * *	ulockf  -  this routine will create a lock file (file). *	If one already exists, the create time is checked for *	older than the age time (atime). *	If it is older, an attempt will be made to unlink it *	and create a new one. * *	return codes:  0  |  FAIL */#define MAXFULLNAME 255staticulockf(file, atime)	char *file;	time_t atime;{	struct stat stbuf;	time_t ptime;	int ret;	static int pid = -1;	static char *Login = NULL;	static char tempfile[MAXFULLNAME];	int fd;#ifdef FLOCK	if (pid < 0)		pid = getpid();	if (Login == NULL)		Login = (char *)getlogin();	if ((fd = open(file, O_RDWR | O_CREAT, LCKMODE)) < 0)		return(FAIL);	chmod(file,LCKMODE);	if (flock(fd, LOCK_EX | LOCK_NB) <  0) {		close(fd);		return(FAIL);	}	sprintf(tempfile,"%d %s %s\n",pid, "tip", Login);	write(fd,tempfile, strlen(tempfile));	stlock(file, fd);#else	if (pid < 0) {		pid = getpid();		sprintf(tempfile, "/usr/spool/uucp/LTMP.%d", pid);	}	if (onelock(pid, tempfile, file) == -1) {		/* lock file exists */		/* get status to check age of the lock file */		ret = stat(file, &stbuf);		if (ret != -1) {			time(&ptime);			if ((ptime - stbuf.st_ctime) < atime) {				/* file not old enough to delete */				return (FAIL);			}		}		ret = unlink(file);		ret = onelock(pid, tempfile, file);		if (ret != 0)			return (FAIL);	}	stlock(file, -1);#endif	return (0);}#define MAXLOCKS 10	/* maximum number of lock files */#ifdef FLOCKint openfd[MAXLOCKS];#endifchar *Lockfile[MAXLOCKS];int Nlocks = 0;/*** *	stlock(name)	put name in list of lock files *	char *name; * *	return codes:  none */staticstlock(name, fd)	char *name;	int fd;{	char *p;	extern char *calloc();	int i;	for (i = 0; i < Nlocks; i++) {		if (Lockfile[i] == NULL)			break;	}	ASSERT(i < MAXLOCKS, "TOO MANY LOCKS %d", i);	if (i >= Nlocks)		i = Nlocks++;	p = calloc(strlen(name) + 1, sizeof (char));	ASSERT(p != NULL, "CAN NOT ALLOCATE FOR %s", name);	strcpy(p, name);	Lockfile[i] = p;#ifdef FLOCK	openfd[i] =fd;#endif	return;}/*** *	rmlock(name)	remove all lock files in list *	char *name;	or name * *	return codes: none */staticrmlock(name)	char *name;{	int i;	for (i = 0; i < Nlocks; i++) {		if (Lockfile[i] == NULL)			continue;		if (name == NULL || strcmp(name, Lockfile[i]) == SAME) {#ifdef FLOCK			flock(openfd[i], LOCK_UN);			close(openfd[i]);#endif			unlink(Lockfile[i]);			free(Lockfile[i]);			Lockfile[i] = NULL;		}	}}/* * this stuff from pjw  *  /usr/pjw/bin/recover - check pids to remove unnecessary locks * *	isalock(name) returns 0 if the name is a lock * *	onelock(pid,tempfile,name) makes lock a name *	on behalf of pid.  Tempfile must be in the same *	file system as name. * *	lock(pid,tempfile,names) either locks all the *	names or none of them */staticisalock(name)	char *name;{	struct stat xstat;	if (stat(name, &xstat) < 0)		return (0);	if (xstat.st_size != sizeof(int))		return (0);	return (1);}staticonelock(pid, tempfile, name)	char *tempfile, *name;{	int fd;	fd = creat(tempfile, 0444);	if (fd < 0)		return (-1);	write(fd,(char *)&pid, sizeof(int));	close(fd);	if (link(tempfile, name) < 0) {		unlink(tempfile);		return (-1);	}	unlink(tempfile);	return (0);}/*** *	delock(s)	remove a lock file *	char *s; * *	return codes:  0  |  FAIL */delock(s)	char *s;{	char ln[30];	sprintf(ln, "%s.%s", LOCKPRE, s);	rmlock(ln);}/*** *	mlock(sys)	create system lock *	char *sys; * *	return codes:  0  |  FAIL */mlock(sys)	char *sys;{	char lname[30];	sprintf(lname, "%s.%s", LOCKPRE, sys);	return (ulockf(lname, (time_t) SLCKTIME ) < 0 ? FAIL : 0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -