2014-02-19 08:56:11 +08:00
package utils
import (
"crypto/rand"
"encoding/hex"
"io"
2014-06-13 21:56:58 +08:00
"io/ioutil"
2014-02-25 13:11:52 +08:00
"path/filepath"
2014-06-13 21:56:58 +08:00
"strconv"
"syscall"
2014-02-19 08:56:11 +08:00
)
2014-02-20 14:43:40 +08:00
// GenerateRandomName returns a new name joined with a prefix. This size
// specified is used to truncate the randomly generated value
2014-02-20 07:54:53 +08:00
func GenerateRandomName ( prefix string , size int ) ( string , error ) {
id := make ( [ ] byte , 32 )
2014-02-19 08:56:11 +08:00
if _ , err := io . ReadFull ( rand . Reader , id ) ; err != nil {
return "" , err
}
2014-02-20 07:54:53 +08:00
return prefix + hex . EncodeToString ( id ) [ : size ] , nil
2014-02-19 08:56:11 +08:00
}
2014-02-25 13:11:52 +08:00
// ResolveRootfs ensures that the current working directory is
// not a symlink and returns the absolute path to the rootfs
func ResolveRootfs ( uncleanRootfs string ) ( string , error ) {
rootfs , err := filepath . Abs ( uncleanRootfs )
if err != nil {
return "" , err
}
return filepath . EvalSymlinks ( rootfs )
}
2014-06-13 21:56:58 +08:00
func CloseExecFrom ( minFd int ) error {
fdList , err := ioutil . ReadDir ( "/proc/self/fd" )
if err != nil {
return err
}
for _ , fi := range fdList {
fd , err := strconv . Atoi ( fi . Name ( ) )
if err != nil {
// ignore non-numeric file names
continue
}
if fd < minFd {
// ignore descriptors lower than our specified minimum
continue
}
// intentionally ignore errors from syscall.CloseOnExec
syscall . CloseOnExec ( fd )
// the cases where this might fail are basically file descriptors that have already been closed (including and especially the one that was created when ioutil.ReadDir did the "opendir" syscall)
}
return nil
}