func (decoderData *decoderData) addSpecialFile(header *tar.Header, parent *filesystem.DirectoryInode, name string) error { var newInode filesystem.SpecialInode if header.Typeflag == tar.TypeChar { newInode.Mode = filesystem.FileMode((header.Mode & ^syscall.S_IFMT) | syscall.S_IFCHR) } else if header.Typeflag == tar.TypeBlock { newInode.Mode = filesystem.FileMode((header.Mode & ^syscall.S_IFMT) | syscall.S_IFBLK) } else if header.Typeflag == tar.TypeFifo { newInode.Mode = filesystem.FileMode((header.Mode & ^syscall.S_IFMT) | syscall.S_IFIFO) } else { return errors.New(fmt.Sprintf("unsupported type: %v", header.Typeflag)) } newInode.Uid = uint32(header.Uid) newInode.Gid = uint32(header.Gid) newInode.MtimeNanoSeconds = int32(header.ModTime.Nanosecond()) newInode.MtimeSeconds = header.ModTime.Unix() if header.Devminor > 255 { return errors.New(fmt.Sprintf("minor device number: %d too large", header.Devminor)) } newInode.Rdev = uint64(header.Devmajor<<8 | header.Devminor) decoderData.addEntry(parent, header.Name, name, &newInode) return nil }
func makeSpecialInode(stat *syscall.Stat_t) *filesystem.SpecialInode { var inode filesystem.SpecialInode inode.Mode = filesystem.FileMode(stat.Mode) inode.Uid = stat.Uid inode.Gid = stat.Gid inode.MtimeSeconds = stat.Mtim.Sec inode.MtimeNanoSeconds = int32(stat.Mtim.Nsec) inode.Rdev = stat.Rdev return &inode }