github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libkb/flock_windows.go (about)

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  //go:build windows
     5  // +build windows
     6  
     7  package libkb
     8  
     9  import (
    10  	"fmt"
    11  	"os"
    12  	"syscall"
    13  )
    14  
    15  // Open the file with exclusive access (locked to other processes)
    16  // When the process exits, the lock will be released.
    17  func (f *LockPIDFile) Lock() (err error) {
    18  	pathp, err := syscall.UTF16PtrFromString(f.name)
    19  	if err != nil {
    20  		return PIDFileLockError{f.name}
    21  	}
    22  	access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE)
    23  	createmode := uint32(syscall.OPEN_ALWAYS)
    24  	sharemode := uint32(syscall.FILE_SHARE_READ) // os.Open always uses FILE_SHARE_READ | FILE_SHARE_WRITE
    25  	var sa *syscall.SecurityAttributes
    26  	r, err := syscall.CreateFile(pathp, access, sharemode, sa, createmode, syscall.FILE_ATTRIBUTE_NORMAL, 0)
    27  	if err != nil {
    28  		return PIDFileLockError{f.name}
    29  	}
    30  	// this is what os.openFile does
    31  	f.file = os.NewFile(uintptr(r), f.name)
    32  
    33  	pid := os.Getpid()
    34  	fmt.Fprintf(f.file, "%d", pid)
    35  	f.file.Sync()
    36  
    37  	f.G().Log.Debug("Locked pidfile %s for pid=%d", f.name, pid)
    38  
    39  	return nil
    40  }