90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello/*
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello * This file and its contents are supplied under the terms of the
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello * Common Development and Distribution License ("CDDL"), version 1.0.
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello * You may only use this file in accordance with the terms of version
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello * 1.0 of the CDDL.
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello *
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello * A full copy of the text of the CDDL should have accompanied this
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello * source. A copy of the CDDL is also available via the Internet at
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello * http://www.illumos.org/license/CDDL.
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello */
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello/*
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello * Copyright 2016 Joyent, Inc.
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello */
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello/*
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello * Utility functions for use in both acquire-lock and runtests.
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello */
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello#include "util.h"
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello#include <err.h>
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello#include <errno.h>
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello#include <poll.h>
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello#include <stdarg.h>
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello#include <stdio.h>
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello#include <stdlib.h>
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello#include <strings.h>
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello#include <unistd.h>
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloboolean_t LOG = B_FALSE;
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mellovoid
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloflock_log(const char *format, ...)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello{
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello va_list ap;
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello if (!LOG) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return;
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello va_start(ap, format);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello (void) vfprintf(stderr, format, ap);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello va_end(ap);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello}
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloboolean_t
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloflock_nodata(int fd)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello{
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello struct pollfd pfd = { fd, POLLIN, 0 };
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello int ret = poll(&pfd, 1, 1000);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello if (ret == -1) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello err(EXIT_FAILURE, "poll failed");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return (ret == 0);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello}
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mellovoid
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloflock_block(int fd)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello{
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello char buf[1];
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello int ret = 0;
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello while (ret < 1) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello ret = read(fd, buf, 1);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello if (ret == -1) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello if (errno == EINTR)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello continue;
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello err(EXIT_FAILURE, "read failed");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello}
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mellovoid
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloflock_alert(int fd)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello{
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello int ret = 0;
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello while (ret < 1) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello ret = write(fd, "1", 1);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello if (ret == -1) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello if (errno == EINTR)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello continue;
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello err(EXIT_FAILURE, "write failed");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello}
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mellolock_style_t
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloflock_styleenum(char *stylestr)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello{
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello if (strcmp(stylestr, "posix") == 0) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return (LSTYLE_POSIX);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello } else if (strcmp(stylestr, "ofd") == 0) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return (LSTYLE_OFD);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello } else if (strcmp(stylestr, "flock") == 0) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return (LSTYLE_FLOCK);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello } else {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello errx(EXIT_FAILURE, BAD_LOCK_MESSAGE);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return (LSTYLE_LAST);
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello}
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mellochar *
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloflock_stylestr(lock_style_t style)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello{
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello switch (style) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case LSTYLE_POSIX:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("posix");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case LSTYLE_OFD:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("ofd");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case LSTYLE_FLOCK:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("flock");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello default:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello abort();
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("<unreachable>");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello}
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mellochar *
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloflock_stylename(lock_style_t style)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello{
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello switch (style) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case LSTYLE_POSIX:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("fcntl(2) POSIX");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case LSTYLE_OFD:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("fcntl(2) OFD");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case LSTYLE_FLOCK:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("flock(3C)");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello default:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello abort();
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("<unreachable>");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello}
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mellovoid
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloflock_reinit(struct flock *flp, int ltype)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello{
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello bzero(flp, sizeof (*flp));
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello flp->l_type = ltype;
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello}
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mellochar *
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Melloflock_cmdname(int cmd)
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello{
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello switch (cmd) {
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case F_SETLK:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("F_SETLK");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case F_OFD_SETLK:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("F_OFD_SETLK");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case F_SETLKW:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("F_SETLKW");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case F_OFD_SETLKW:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("F_OFD_SETLKW");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case F_GETLK:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("F_GETLK");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case F_OFD_GETLK:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("F_OFD_GETLK");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case F_FLOCK:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("F_FLOCK");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello case F_FLOCKW:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("F_FLOCKW");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello default:
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello abort();
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello return ("<unreachable>");
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello }
90221f9148b67fdc90178b67f9600b7bd4e3bc7cCody Peter Mello}