#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <X11/Xauth.h>
#include <X11/Xos.h>
#include <sys/stat.h>
#include <errno.h>
#include <time.h>
#define Time_t time_t
#ifndef X_NOT_POSIX
#include <unistd.h>
#else
#ifndef WIN32
extern unsigned sleep ();
#else
#include <X11/Xwindows.h>
#define link rename
#endif
#endif
#ifdef __UNIXOS2__
#define link rename
#endif
int
XauLockAuth (
_Xconst char *file_name,
int retries,
int timeout,
long dead)
{
char creat_name[1025], link_name[1025];
struct stat statb;
Time_t now;
int creat_fd = -1;
if (strlen (file_name) > 1022)
return LOCK_ERROR;
(void) strcpy (creat_name, file_name);
(void) strcat (creat_name, "-c");
(void) strcpy (link_name, file_name);
(void) strcat (link_name, "-l");
if (stat (creat_name, &statb) != -1) {
now = time ((Time_t *) 0);
if (dead == 0 || now - statb.st_ctime > dead) {
(void) unlink (creat_name);
(void) unlink (link_name);
}
}
while (retries > 0) {
if (creat_fd == -1) {
creat_fd = open (creat_name, O_WRONLY | O_CREAT | O_EXCL, 0600);
if (creat_fd == -1) {
if (errno != EACCES)
return LOCK_ERROR;
} else
(void) close (creat_fd);
}
if (creat_fd != -1) {
#ifndef X_NOT_POSIX
if (1 == pathconf(creat_name, _PC_LINK_MAX)) {
if (-1 == rename(creat_name, link_name)) {
return LOCK_ERROR;
} else {
return LOCK_SUCCESS;
}
} else {
#endif
if (link (creat_name, link_name) != -1)
return LOCK_SUCCESS;
if (errno == ENOENT) {
creat_fd = -1;
continue;
}
if (errno != EEXIST)
return LOCK_ERROR;
#ifndef X_NOT_POSIX
}
#endif
}
(void) sleep ((unsigned) timeout);
--retries;
}
return LOCK_TIMEOUT;
}