package utils

import (
	"os"
	"syscall"
)

type DirLock struct {
	dir string
	f   *os.File
}

func NewDirLock(dir string) *DirLock {
	return &DirLock{
		dir: dir,
	}
}

func (l *DirLock) Dir() string {
	return l.dir
}

func (l *DirLock) Lock() error {
	f, err := os.Open(l.dir)
	if err != nil {
		return err
	}
	l.f = f

	return syscall.Flock(int(f.Fd()), syscall.LOCK_EX)
}

func (l *DirLock) Unlock() error {
	defer l.f.Close()
	return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN)
}
