+static int nixio_file_lock(lua_State *L) {
+ int fd = fileno(nixio__checkfile(L));
+
+ const int j = lua_gettop(L);
+ int flags = 0;
+ for (int i=2; i<=j; i++) {
+ const char *flag = luaL_checkstring(L, i);
+ if (!strcmp(flag, "sh")) {
+ flags |= LOCK_SH;
+ } else if (!strcmp(flag, "ex")) {
+ flags |= LOCK_EX;
+ } else if (!strcmp(flag, "un")) {
+ flags |= LOCK_UN;
+ } else if (!strcmp(flag, "nb")) {
+ flags |= LOCK_NB;
+ } else {
+ return luaL_argerror(L, i, "supported values: sh, ex, un, nb");
+ }
+ }
+
+ return nixio__pstatus(L, flock(fd, flags));
+}
+