diff --git a/package/gluon-geolocator/luasrc/lib/gluon/geolocator/geolocator b/package/gluon-geolocator/luasrc/lib/gluon/geolocator/geolocator index cd3ab55e..3ec5771c 100755 --- a/package/gluon-geolocator/luasrc/lib/gluon/geolocator/geolocator +++ b/package/gluon-geolocator/luasrc/lib/gluon/geolocator/geolocator @@ -1,7 +1,9 @@ #!/usr/bin/lua +local bit = require('bit') +local unistd = require('posix.unistd') +local fcntl = require('posix.fcntl') local uci = require('simple-uci').cursor() -local nixio = require('nixio') local json = require ("jsonc") local ubus = require 'ubus' local iwinfo = require("iwinfo") @@ -16,9 +18,21 @@ end -- PID file to ensure the geolocator isn't running parallel local lockfile = '/var/lock/geolocator.lock' -local lockfd = nixio.open(lockfile, 'w', 'rw-------') +local lockfd, err = fcntl.open(lockfile, bit.bor(fcntl.O_WRONLY, fcntl.O_CREAT), 384) -- mode 0600 -if not lockfd:lock('tlock') then +if not lockfd then + io.stderr:write(err, '\n') + os.exit(1) +end + +local ok, _ = fcntl.fcntl(lockfd, fcntl.F_SETLK, { + l_start = 0, + l_len = 0, + l_type = fcntl.F_WRLCK, + l_whence = unistd.SEEK_SET, +}) + +if not ok then io.stderr:write(string.format( "Unable to lock file %s. Make sure there is no other instance of the geolocator running.\n", lockfile @@ -81,7 +95,7 @@ local function locate() return true end) - assert(#found_bssids >= 12, 'insufficient BSSIDs found') + assert(#found_bssids > 0, 'insufficient BSSIDs found') local data = receive_json('http://openwifi.su/api/v1/bssids/' .. table.concat(found_bssids, ',')) assert(type(data) == 'table' and data.lon and data.lat, 'location not available')