package wire

import "os"

// ADB file modes seem to only be 16 bits.
// Values are taken from http://linux.die.net/include/bits/stat.h.
const (
	ModeDir        uint32 = 0040000
	ModeSymlink           = 0120000
	ModeSocket            = 0140000
	ModeFifo              = 0010000
	ModeCharDevice        = 0020000
)

func ParseFileModeFromAdb(modeFromSync uint32) (filemode os.FileMode) {
	// The ADB filemode uses the permission bits defined in Go's os package, but
	// we need to parse the other bits manually.
	switch {
	case modeFromSync&ModeSymlink == ModeSymlink:
		filemode = os.ModeSymlink
	case modeFromSync&ModeDir == ModeDir:
		filemode = os.ModeDir
	case modeFromSync&ModeSocket == ModeSocket:
		filemode = os.ModeSocket
	case modeFromSync&ModeFifo == ModeFifo:
		filemode = os.ModeNamedPipe
	case modeFromSync&ModeCharDevice == ModeCharDevice:
		filemode = os.ModeCharDevice
	}

	filemode |= os.FileMode(modeFromSync).Perm()
	return
}