perkeep/pkg/osutil/restart_freebsd.go
mpl 62b5da6f99 find the path to the executable of the running instance
to restart camli properly

This change adds the functionality to find the path to
the currently running executable, so that camlistore
can be restarted without à priori knowledge of cwd.
It should work for linux, netBSD and freeBSD, and it
might work for openBSD.
The naive (os.Args[0]) approach is still used with
darwin.

Reference: https://codereview.appspot.com/6736069/

Change-Id: Icc9fc2b4e1b3542cfbe6c457c1fefbe762eff2f1
2012-11-14 16:10:50 +01:00

55 lines
1.4 KiB
Go

// +build freebsd
/*
Copyright 2012 The Camlistore Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package osutil
import (
"errors"
"os"
"runtime"
"syscall"
"unsafe"
)
func init() {
osSelfPath = selfPathFreeBSD
}
func selfPathFreeBSD() (string, error) {
mib := [4]int32{1 /* CTL_KERN */, 14 /* KERN_PROC */, 12 /* KERN_PROC_PATHNAME */, -1}
n := uintptr(0)
// get length
_, _, err := syscall.Syscall6(syscall.SYS__SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
if err != 0 {
return "", err
}
if n == 0 { // shouldn't happen
return "", nil
}
buf := make([]byte, n)
_, _, err = syscall.Syscall6(syscall.SYS__SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, uintptr(unsafe.Pointer(&buf[0])), uintptr(unsafe.Pointer(&n)), 0, 0)
if err != 0 {
return "", err
}
if n == 0 { // shouldn't happen
return "", nil
}
return string(buf[:n-1]), nil
}