/* * SYS_FLOCK.C */ #include "defs.h" #include /* * FdLock structure (similar to the C struct flock), matches * FdLock class. */ typedef struct FdLock { runeoff_t start; runeoff_t len; runepid_t pid; /* runepid is 32-bits {*/ int32_t type; int32_t whence; int32_t error; int32_t fd; int32_t active; } FdLock; /* * Arguments to flock */ struct flock_args { LValueStor lvs; int op; #if LONG_BITS == 64 int filler01; #endif }; void RuneSysCall_flock(struct flock_args *args, int *rval) { FDStor *fdp; if ((args->op & LOCK_NB) == 0) threadSetBlocking(); fdp = (void *)args->lvs.s_Addr; *rval = flock(fdp->fd, args->op); if (*rval < 0) fdp->error = errno; else fdp->error = 0; if ((args->op & LOCK_NB) == 0) threadClrBlocking(); } /* * fcntl-based locks */ struct fdlock_args { LValueStor lvs; }; void RuneSysCall_fgetlk(struct fdlock_args *args, int *rval) { FdLock *rlk = (void *)args->lvs.s_Addr; struct flock flk; flk.l_start = rlk->start; flk.l_len = rlk->len; flk.l_pid = (pid_t)rlk->pid; flk.l_type = rlk->type; flk.l_whence = rlk->whence; if (fcntl(rlk->fd, F_GETLK, &flk) < 0) { *rval = -1; rlk->error = errno; } else { *rval = 0; rlk->error = 0; rlk->start = flk.l_start; rlk->len = flk.l_len; if (sizeof(pid_t) < sizeof(runepid_t)) rlk->pid = (runepid_t)(int)flk.l_pid; else rlk->pid = (runepid_t)flk.l_pid; rlk->type = flk.l_type; rlk->whence = flk.l_whence; } } void RuneSysCall_fsetlk(struct fdlock_args *args, int *rval) { FdLock *rlk = (void *)args->lvs.s_Addr; struct flock flk; flk.l_start = rlk->start; flk.l_len = rlk->len; flk.l_pid = (pid_t)rlk->pid; flk.l_type = rlk->type; flk.l_whence = rlk->whence; if (fcntl(rlk->fd, F_SETLK, &flk) < 0) { *rval = -1; rlk->error = errno; } else { *rval = 0; rlk->error = 0; rlk->active = (rlk->type != F_UNLCK); rlk->start = flk.l_start; rlk->len = flk.l_len; if (sizeof(pid_t) < sizeof(runepid_t)) rlk->pid = (runepid_t)(int)flk.l_pid; else rlk->pid = (runepid_t)flk.l_pid; rlk->type = flk.l_type; rlk->whence = flk.l_whence; } } void RuneSysCall_fsetlkw(struct fdlock_args *args, int *rval) { FdLock *rlk = (void *)args->lvs.s_Addr; struct flock flk; threadSetBlocking(); flk.l_start = rlk->start; flk.l_len = rlk->len; flk.l_pid = (pid_t)rlk->pid; flk.l_type = rlk->type; flk.l_whence = rlk->whence; if (fcntl(rlk->fd, F_SETLKW, &flk) < 0) { *rval = -1; rlk->error = errno; } else { *rval = 0; rlk->error = 0; rlk->active = (rlk->type != F_UNLCK); rlk->start = flk.l_start; rlk->len = flk.l_len; if (sizeof(pid_t) < sizeof(runepid_t)) rlk->pid = (runepid_t)(int)flk.l_pid; else rlk->pid = (runepid_t)flk.l_pid; rlk->type = flk.l_type; rlk->whence = flk.l_whence; } threadClrBlocking(); }