mirror of
https://github.com/hashcat/hashcat.git
synced 2025-07-08 23:58:24 +00:00
73 lines
1.2 KiB
C
73 lines
1.2 KiB
C
/**
|
|
* Author......: See docs/credits.txt
|
|
* License.....: MIT
|
|
*/
|
|
|
|
#include "common.h"
|
|
#include "types.h"
|
|
#include "locking.h"
|
|
#include "shared.h"
|
|
|
|
#if defined (F_SETLKW)
|
|
|
|
int hc_lockfile (HCFILE *fp)
|
|
{
|
|
if (fp == NULL) return -1;
|
|
|
|
struct flock lock;
|
|
|
|
memset (&lock, 0, sizeof (struct flock));
|
|
|
|
lock.l_type = F_WRLCK;
|
|
|
|
while (fcntl (fp->fd, F_SETLKW, &lock))
|
|
{
|
|
// These shouldn't happen with F_SETLKW yet are (rarely) seen IRL. Recoverable!
|
|
if (errno == EAGAIN || errno == ENOLCK)
|
|
{
|
|
struct timeval tv = { .tv_sec = 0, .tv_usec = 10000 };
|
|
select (0, NULL, NULL, NULL, &tv);
|
|
|
|
continue;
|
|
}
|
|
|
|
// A signal may interrupt a wait for lock with EINTR. Anything else is fatal
|
|
if (errno != EINTR) return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int hc_unlockfile (HCFILE *fp)
|
|
{
|
|
if (fp == NULL) return -1;
|
|
|
|
struct flock lock;
|
|
|
|
memset (&lock, 0, sizeof (struct flock));
|
|
|
|
lock.l_type = F_UNLCK;
|
|
|
|
if (fcntl (fp->fd, F_SETLK, &lock)) return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
#else
|
|
|
|
int hc_lockfile (MAYBE_UNUSED HCFILE *fp)
|
|
{
|
|
// we should put windows specific code here
|
|
|
|
return 0;
|
|
}
|
|
|
|
int hc_unlockfile (MAYBE_UNUSED HCFILE *fp)
|
|
{
|
|
// we should put windows specific code here
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif // F_SETLKW
|