本文整理汇总了Golang中syscall.Mknod函数的典型用法代码示例。如果您正苦于以下问题:Golang Mknod函数的具体用法?Golang Mknod怎么用?Golang Mknod使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Mknod函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: createDevices
func createDevices() error {
err := os.MkdirAll(pathPrefix, 644)
if err != nil {
log.Warnf("Failed to ensure presence of tether device directory: %s", err)
}
// create serial devices
for i := 0; i < 3; i++ {
path := fmt.Sprintf("%s/ttyS%d", pathPrefix, i)
minor := 64 + i
err = syscall.Mknod(path, syscall.S_IFCHR|uint32(os.FileMode(0660)), tether.Mkdev(4, minor))
if err != nil {
return fmt.Errorf("failed to create %s for com%d: %s", path, i+1, err)
}
}
// make an access to urandom
path := fmt.Sprintf("%s/urandom", pathPrefix)
err = syscall.Mknod(path, syscall.S_IFCHR|uint32(os.FileMode(0444)), tether.Mkdev(1, 9))
if err != nil {
return fmt.Errorf("failed to create urandom access %s: %s", path, err)
}
return nil
}
示例2: setdeleted
func (constor *Constor) setdeleted(path string) error {
err := syscall.Mknod(path, syscall.S_IFCHR, 0)
if err != nil {
err := syscall.Unlink(path)
if err != nil {
constor.error("unable to rm %s %s", path, err)
}
return syscall.Mknod(path, syscall.S_IFCHR, 0)
}
return nil
}
示例3: extractArchive
func extractArchive() int {
archive := tar.NewReader(input)
for {
hdr, err := archive.Next()
if err == io.EOF {
break
}
if err != nil {
fmt.Fprintf(os.Stderr, "An error occured while reading archive: %v\n", err)
return 1
}
if verbose {
fmt.Fprintf(os.Stderr, "%s\n", hdr.Name)
}
switch hdr.Typeflag {
case tar.TypeReg, tar.TypeRegA:
var f *os.File
if f, err = os.OpenFile(hdr.Name, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, os.FileMode(hdr.Mode)); err == nil {
io.Copy(f, archive)
f.Close()
err = os.Chtimes(hdr.Name, hdr.ModTime, hdr.ModTime)
}
case tar.TypeDir:
err = os.Mkdir(hdr.Name, os.FileMode(hdr.Mode))
if err != nil {
patherr, ok := err.(*os.PathError)
if ok && patherr.Err == syscall.EEXIST {
err = nil
}
}
case tar.TypeSymlink:
err = os.Link(hdr.Name, hdr.Linkname)
case tar.TypeFifo:
err = syscall.Mkfifo(hdr.Name, uint32(hdr.Mode))
case tar.TypeChar:
err = errors.New("character devices unsupported")
err = syscall.Mknod(hdr.Name, syscall.S_IFCHR, makedev(hdr.Devmajor, hdr.Devminor))
case tar.TypeBlock:
err = errors.New("block devices unsupported")
err = syscall.Mknod(hdr.Name, syscall.S_IFBLK, makedev(hdr.Devmajor, hdr.Devminor))
}
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
}
}
return 0
}
示例4: test
func (f *mknod1) test(path string, t *testing.T) {
if os.Getuid() != 0 {
t.Logf("skipping unless root")
return
}
defer syscall.Umask(syscall.Umask(0))
err := syscall.Mknod(path+"/node", syscall.S_IFIFO|0666, 123)
if err != nil {
t.Fatalf("Mknod: %v", err)
}
gotr := <-f.seen.gotr
if gotr == nil {
t.Fatalf("no recorded MknodRequest")
}
if g, e := gotr.Name, "node"; g != e {
t.Errorf("got Name = %q; want %q", g, e)
}
if g, e := gotr.Rdev, uint32(123); g != e {
if runtime.GOOS == "linux" {
// Linux fuse doesn't echo back the rdev if the node
// isn't a device (we're using a FIFO here, as that
// bit is portable.)
} else {
t.Errorf("got Rdev = %v; want %v", g, e)
}
}
if g, e := gotr.Mode, os.FileMode(os.ModeNamedPipe|0666); g != e {
t.Errorf("got Mode = %v; want %v", g, e)
}
t.Logf("Got request: %#v", gotr)
}
示例5: createDeviceNode
// Creates the device node in the rootfs of the container.
func createDeviceNode(rootfs string, node *configs.Device) error {
var (
dest = filepath.Join(rootfs, node.Path)
parent = filepath.Dir(dest)
)
if err := os.MkdirAll(parent, 0755); err != nil {
return err
}
fileMode := node.FileMode
switch node.Type {
case 'c':
fileMode |= syscall.S_IFCHR
case 'b':
fileMode |= syscall.S_IFBLK
default:
return fmt.Errorf("%c is not a valid device type for device %s", node.Type, node.Path)
}
if err := syscall.Mknod(dest, uint32(fileMode), node.Mkdev()); err != nil && !os.IsExist(err) {
return fmt.Errorf("mknod %s %s", node.Path, err)
}
if err := syscall.Chown(dest, int(node.Uid), int(node.Gid)); err != nil {
return fmt.Errorf("chown %s to %d:%d", node.Path, node.Uid, node.Gid)
}
return nil
}
示例6: ListenForClients
func ListenForClients(pipename string) {
if _, err := os.Stat(pipename); err == nil {
fmt.Printf("pipe already exists\n")
} else {
syscall.Mknod(pipename, syscall.S_IFIFO|0666, 0)
}
servedClients := make(map[string]bool)
fmt.Printf("About to open pipe %s for read\n", pipename)
for {
readPipe, err := os.OpenFile(pipename, os.O_RDONLY, 0666)
if err != nil {
fmt.Printf("Could not open register pipe %s for read\n", REGISTER_PIPE)
continue
//log.Fatal(err)
}
msg := &Registration{}
dataDecoder := gob.NewDecoder(readPipe)
err = dataDecoder.Decode(msg)
if err != nil {
fmt.Printf("Error decoding registration msg from %s\n", pipename)
//log.Fatal(err)
} else {
readPipe.Close()
}
if msg.ClientName == "" {
continue
}
fmt.Printf("Need to open pipe for reading client commands: %+v\n", msg)
if !servedClients[msg.ClientName] {
go serveClient(msg.ClientName, servedClients)
}
servedClients[msg.ClientName] = true
}
}
示例7: mknod
func mknod(device string, major, minor int) error {
var fileMode os.FileMode = 0600
fileMode |= syscall.S_IFBLK
dev := int((major << 8) | (minor & 0xff) | ((minor & 0xfff00) << 12))
return syscall.Mknod(device, uint32(fileMode), dev)
}
示例8: make_console
// make_console sets the right modes for the real console, then creates
// a /dev/console in the chroot.
func make_console(base, console string, unprivileged bool) {
if err := os.Chmod(console, 0600); err != nil {
log.Printf("%v", err)
}
if err := os.Chown(console, 0, 0); err != nil {
log.Printf("%v", err)
}
st, err := os.Stat(console)
if err != nil {
log.Printf("%v", err)
}
nn := path.Join(base, "/dev/console")
mode, dev := modedev(st)
if unprivileged {
// In unprivileged uses, we can't mknod /dev/console, however,
// we can just create a file /dev/console and use bind mount on file.
if _, err := os.Stat(nn); err != nil {
ioutil.WriteFile(nn, []byte{}, 0600) // best effort, ignore error
}
} else {
if err := syscall.Mknod(nn, mode, dev); err != nil {
log.Printf("%v", err)
}
}
// if any previous steps failed, this one will too, so we can bail here.
if err := syscall.Mount(console, nn, "", syscall.MS_BIND, ""); err != nil {
log.Fatalf("Mount :%s: on :%s: flags %v: %v",
console, nn, syscall.MS_BIND, err)
}
}
示例9: ConvertRead
func (overlayWhiteoutConverter) ConvertRead(hdr *tar.Header, path string) (bool, error) {
base := filepath.Base(path)
dir := filepath.Dir(path)
// if a directory is marked as opaque by the AUFS special file, we need to translate that to overlay
if base == WhiteoutOpaqueDir {
if err := syscall.Setxattr(dir, "trusted.overlay.opaque", []byte{'y'}, 0); err != nil {
return false, err
}
// don't write the file itself
return false, nil
}
// if a file was deleted and we are using overlay, we need to create a character device
if strings.HasPrefix(base, WhiteoutPrefix) {
originalBase := base[len(WhiteoutPrefix):]
originalPath := filepath.Join(dir, originalBase)
if err := syscall.Mknod(originalPath, syscall.S_IFCHR, 0); err != nil {
return false, err
}
if err := os.Chown(originalPath, hdr.Uid, hdr.Gid); err != nil {
return false, err
}
// don't write the file itself
return false, nil
}
return true, nil
}
示例10: TestMknod
func TestMknod(t *testing.T) {
t.Parallel()
if os.Getuid() != 0 {
t.Skip("skipping unless root")
}
f := &mknod1{}
mnt, err := fstestutil.MountedT(t, fstestutil.SimpleFS{f})
if err != nil {
t.Fatal(err)
}
defer mnt.Close()
defer syscall.Umask(syscall.Umask(0))
err = syscall.Mknod(mnt.Dir+"/node", syscall.S_IFIFO|0666, 123)
if err != nil {
t.Fatalf("Mknod: %v", err)
}
want := fuse.MknodRequest{
Name: "node",
Mode: os.FileMode(os.ModeNamedPipe | 0666),
Rdev: uint32(123),
}
if runtime.GOOS == "linux" {
// Linux fuse doesn't echo back the rdev if the node
// isn't a device (we're using a FIFO here, as that
// bit is portable.)
want.Rdev = 0
}
if g, e := f.RecordedMknod(), want; g != e {
t.Fatalf("mknod saw %+v, want %+v", g, e)
}
}
示例11: CreateDeviceNode
// Creates the device node in the rootfs of the container.
func CreateDeviceNode(rootfs string, node *devices.Device) error {
var (
dest = filepath.Join(rootfs, node.Path)
parent = filepath.Dir(dest)
)
if err := os.MkdirAll(parent, 0755); err != nil {
return err
}
fileMode := node.FileMode
switch node.Type {
case 'c':
fileMode |= syscall.S_IFCHR
case 'b':
fileMode |= syscall.S_IFBLK
default:
return fmt.Errorf("%c is not a valid device type for device %s", node.Type, node.Path)
}
if err := syscall.Mknod(dest, uint32(fileMode), devices.Mkdev(node.MajorNumber, node.MinorNumber)); err != nil && !os.IsExist(err) {
return fmt.Errorf("mknod %s %s", node.Path, err)
}
return nil
}
示例12: Mknod
func Mknod(call []string) error {
e := flagSet.Parse(call[1:])
if e != nil {
return e
}
if flagSet.NArg() != 1 || *helpFlag {
println("`mknod` [options] <file>")
flagSet.PrintDefaults()
return nil
}
mode, ok := typemap[strings.ToLower(*typeFlag)]
if !ok {
return errors.New("Invalid node type \"" + *typeFlag + "\"")
}
if mode == syscall.S_IFBLK && (*majorFlag == -1 || *minorFlag == -1) {
return errors.New("When creating a block device, both minor and major number have to be given")
}
fmode, e := strconv.ParseUint(*modeFlag, 10, 8)
if e != nil {
return e
}
mode |= uint32(fmode)
e = syscall.Mknod(flagSet.Arg(0), mode, *majorFlag<<8|*minorFlag)
return e
}
示例13: checkCanMknod
func checkCanMknod() {
/* TODO - mktemp */
fnam := shared.VarPath("null")
// warning to cut-pasters: can't do the below in general, that is if minor is big
if err := syscall.Mknod(fnam, syscall.S_IFCHR, int((int64(1)<<8)|int64(3))); err != nil {
canMknod = false
os.Remove(fnam)
}
}
示例14: CreateDevice
func (fs *Filesystem) CreateDevice(devpath string, dev int, mode uint32) error {
p := fs.absPath(devpath)
um := syscall.Umask(0)
if err := syscall.Mknod(p, mode, dev); err != nil {
return fmt.Errorf("failed to mknod device '%s': %v", p, err)
}
syscall.Umask(um)
return nil
}
示例15: make
func (inode *SpecialInode) make(name string) error {
if inode.Mode&syscall.S_IFBLK != 0 || inode.Mode&syscall.S_IFCHR != 0 {
return syscall.Mknod(name, uint32(inode.Mode), int(inode.Rdev))
} else if inode.Mode&syscall.S_IFIFO != 0 {
return syscall.Mkfifo(name, uint32(inode.Mode))
} else {
return errors.New("unsupported mode")
}
}