190221f91SCody Peter Mello /*
290221f91SCody Peter Mello  * This file and its contents are supplied under the terms of the
390221f91SCody Peter Mello  * Common Development and Distribution License ("CDDL"), version 1.0.
490221f91SCody Peter Mello  * You may only use this file in accordance with the terms of version
590221f91SCody Peter Mello  * 1.0 of the CDDL.
690221f91SCody Peter Mello  *
790221f91SCody Peter Mello  * A full copy of the text of the CDDL should have accompanied this
890221f91SCody Peter Mello  * source.  A copy of the CDDL is also available via the Internet at
990221f91SCody Peter Mello  * http://www.illumos.org/license/CDDL.
1090221f91SCody Peter Mello  */
1190221f91SCody Peter Mello 
1290221f91SCody Peter Mello /*
13*44bf619dSJohn Levon  * Copyright 2019 Joyent, Inc.
1490221f91SCody Peter Mello  */
1590221f91SCody Peter Mello 
1690221f91SCody Peter Mello /*
1790221f91SCody Peter Mello  * Utility functions for use in both acquire-lock and runtests.
1890221f91SCody Peter Mello  */
1990221f91SCody Peter Mello 
2090221f91SCody Peter Mello #include "util.h"
2190221f91SCody Peter Mello #include <err.h>
2290221f91SCody Peter Mello #include <errno.h>
2390221f91SCody Peter Mello #include <poll.h>
2490221f91SCody Peter Mello #include <stdarg.h>
2590221f91SCody Peter Mello #include <stdio.h>
2690221f91SCody Peter Mello #include <stdlib.h>
2790221f91SCody Peter Mello #include <strings.h>
2890221f91SCody Peter Mello #include <unistd.h>
2990221f91SCody Peter Mello 
3090221f91SCody Peter Mello 
3190221f91SCody Peter Mello boolean_t LOG = B_FALSE;
3290221f91SCody Peter Mello 
3390221f91SCody Peter Mello 
3490221f91SCody Peter Mello void
flock_log(const char * format,...)3590221f91SCody Peter Mello flock_log(const char *format, ...)
3690221f91SCody Peter Mello {
3790221f91SCody Peter Mello 	va_list ap;
3890221f91SCody Peter Mello 	if (!LOG) {
3990221f91SCody Peter Mello 		return;
4090221f91SCody Peter Mello 	}
4190221f91SCody Peter Mello 
4290221f91SCody Peter Mello 	va_start(ap, format);
4390221f91SCody Peter Mello 	(void) vfprintf(stderr, format, ap);
4490221f91SCody Peter Mello 	va_end(ap);
4590221f91SCody Peter Mello }
4690221f91SCody Peter Mello 
4790221f91SCody Peter Mello 
4890221f91SCody Peter Mello boolean_t
flock_nodata(int fd)4990221f91SCody Peter Mello flock_nodata(int fd)
5090221f91SCody Peter Mello {
5190221f91SCody Peter Mello 	struct pollfd pfd = { fd, POLLIN, 0 };
5290221f91SCody Peter Mello 	int ret = poll(&pfd, 1, 1000);
5390221f91SCody Peter Mello 
5490221f91SCody Peter Mello 	if (ret == -1) {
5590221f91SCody Peter Mello 		err(EXIT_FAILURE, "poll failed");
5690221f91SCody Peter Mello 	}
5790221f91SCody Peter Mello 
5890221f91SCody Peter Mello 	return (ret == 0);
5990221f91SCody Peter Mello }
6090221f91SCody Peter Mello 
6190221f91SCody Peter Mello 
6290221f91SCody Peter Mello void
flock_block(int fd)6390221f91SCody Peter Mello flock_block(int fd)
6490221f91SCody Peter Mello {
6590221f91SCody Peter Mello 	char buf[1];
6690221f91SCody Peter Mello 	int ret = 0;
6790221f91SCody Peter Mello 	while (ret < 1) {
6890221f91SCody Peter Mello 		ret = read(fd, buf, 1);
6990221f91SCody Peter Mello 		if (ret == -1) {
7090221f91SCody Peter Mello 			if (errno == EINTR)
7190221f91SCody Peter Mello 				continue;
7290221f91SCody Peter Mello 			err(EXIT_FAILURE, "read failed");
7390221f91SCody Peter Mello 		}
7490221f91SCody Peter Mello 	}
7590221f91SCody Peter Mello }
7690221f91SCody Peter Mello 
7790221f91SCody Peter Mello 
7890221f91SCody Peter Mello void
flock_alert(int fd)7990221f91SCody Peter Mello flock_alert(int fd)
8090221f91SCody Peter Mello {
8190221f91SCody Peter Mello 	int ret = 0;
8290221f91SCody Peter Mello 	while (ret < 1) {
8390221f91SCody Peter Mello 		ret = write(fd, "1", 1);
8490221f91SCody Peter Mello 		if (ret == -1) {
8590221f91SCody Peter Mello 			if (errno == EINTR)
8690221f91SCody Peter Mello 				continue;
8790221f91SCody Peter Mello 			err(EXIT_FAILURE, "write failed");
8890221f91SCody Peter Mello 		}
8990221f91SCody Peter Mello 	}
9090221f91SCody Peter Mello }
9190221f91SCody Peter Mello 
9290221f91SCody Peter Mello 
9390221f91SCody Peter Mello lock_style_t
flock_styleenum(char * stylestr)9490221f91SCody Peter Mello flock_styleenum(char *stylestr)
9590221f91SCody Peter Mello {
9690221f91SCody Peter Mello 	if (strcmp(stylestr, "posix") == 0) {
9790221f91SCody Peter Mello 		return (LSTYLE_POSIX);
9890221f91SCody Peter Mello 	} else if (strcmp(stylestr, "ofd") == 0) {
9990221f91SCody Peter Mello 		return (LSTYLE_OFD);
10090221f91SCody Peter Mello 	} else if (strcmp(stylestr, "flock") == 0) {
10190221f91SCody Peter Mello 		return (LSTYLE_FLOCK);
10290221f91SCody Peter Mello 	} else {
10390221f91SCody Peter Mello 		errx(EXIT_FAILURE, BAD_LOCK_MESSAGE);
10490221f91SCody Peter Mello 	}
10590221f91SCody Peter Mello }
10690221f91SCody Peter Mello 
10790221f91SCody Peter Mello 
10890221f91SCody Peter Mello char *
flock_stylestr(lock_style_t style)10990221f91SCody Peter Mello flock_stylestr(lock_style_t style)
11090221f91SCody Peter Mello {
11190221f91SCody Peter Mello 	switch (style) {
11290221f91SCody Peter Mello 	case LSTYLE_POSIX:
11390221f91SCody Peter Mello 		return ("posix");
11490221f91SCody Peter Mello 	case LSTYLE_OFD:
11590221f91SCody Peter Mello 		return ("ofd");
11690221f91SCody Peter Mello 	case LSTYLE_FLOCK:
11790221f91SCody Peter Mello 		return ("flock");
11890221f91SCody Peter Mello 	default:
11990221f91SCody Peter Mello 		abort();
12090221f91SCody Peter Mello 	}
12190221f91SCody Peter Mello }
12290221f91SCody Peter Mello 
12390221f91SCody Peter Mello 
12490221f91SCody Peter Mello char *
flock_stylename(lock_style_t style)12590221f91SCody Peter Mello flock_stylename(lock_style_t style)
12690221f91SCody Peter Mello {
12790221f91SCody Peter Mello 	switch (style) {
12890221f91SCody Peter Mello 	case LSTYLE_POSIX:
12990221f91SCody Peter Mello 		return ("fcntl(2) POSIX");
13090221f91SCody Peter Mello 	case LSTYLE_OFD:
13190221f91SCody Peter Mello 		return ("fcntl(2) OFD");
13290221f91SCody Peter Mello 	case LSTYLE_FLOCK:
13390221f91SCody Peter Mello 		return ("flock(3C)");
13490221f91SCody Peter Mello 	default:
13590221f91SCody Peter Mello 		abort();
13690221f91SCody Peter Mello 	}
13790221f91SCody Peter Mello }
13890221f91SCody Peter Mello 
13990221f91SCody Peter Mello 
14090221f91SCody Peter Mello void
flock_reinit(struct flock * flp,int ltype)14190221f91SCody Peter Mello flock_reinit(struct flock *flp, int ltype)
14290221f91SCody Peter Mello {
14390221f91SCody Peter Mello 	bzero(flp, sizeof (*flp));
14490221f91SCody Peter Mello 	flp->l_type = ltype;
14590221f91SCody Peter Mello }
14690221f91SCody Peter Mello 
14790221f91SCody Peter Mello 
14890221f91SCody Peter Mello char *
flock_cmdname(int cmd)14990221f91SCody Peter Mello flock_cmdname(int cmd)
15090221f91SCody Peter Mello {
15190221f91SCody Peter Mello 	switch (cmd) {
15290221f91SCody Peter Mello 	case F_SETLK:
15390221f91SCody Peter Mello 		return ("F_SETLK");
15490221f91SCody Peter Mello 	case F_OFD_SETLK:
15590221f91SCody Peter Mello 		return ("F_OFD_SETLK");
15690221f91SCody Peter Mello 	case F_SETLKW:
15790221f91SCody Peter Mello 		return ("F_SETLKW");
15890221f91SCody Peter Mello 	case F_OFD_SETLKW:
15990221f91SCody Peter Mello 		return ("F_OFD_SETLKW");
16090221f91SCody Peter Mello 	case F_GETLK:
16190221f91SCody Peter Mello 		return ("F_GETLK");
16290221f91SCody Peter Mello 	case F_OFD_GETLK:
16390221f91SCody Peter Mello 		return ("F_OFD_GETLK");
16490221f91SCody Peter Mello 	case F_FLOCK:
16590221f91SCody Peter Mello 		return ("F_FLOCK");
16690221f91SCody Peter Mello 	case F_FLOCKW:
16790221f91SCody Peter Mello 		return ("F_FLOCKW");
1689c7f1ae0SJerry Jelinek #if !defined(_LP64)
1699c7f1ae0SJerry Jelinek 	case F_OFD_SETLK64:
1709c7f1ae0SJerry Jelinek 		return ("F_OFD_SETLK64");
1719c7f1ae0SJerry Jelinek 	case F_OFD_SETLKW64:
1729c7f1ae0SJerry Jelinek 		return ("F_OFD_SETLKW64");
1739c7f1ae0SJerry Jelinek 	case F_OFD_GETLK64:
1749c7f1ae0SJerry Jelinek 		return ("F_OFD_GETLK64");
1759c7f1ae0SJerry Jelinek #endif
17690221f91SCody Peter Mello 	default:
17790221f91SCody Peter Mello 		abort();
17890221f91SCody Peter Mello 	}
17990221f91SCody Peter Mello }
180