Blame


1 e342de7d 2015-11-11 adrien package p9p
2 e342de7d 2015-11-11 adrien
3 e342de7d 2015-11-11 adrien import (
4 e342de7d 2015-11-11 adrien "fmt"
5 e342de7d 2015-11-11 adrien "time"
6 e342de7d 2015-11-11 adrien )
7 e342de7d 2015-11-11 adrien
8 e342de7d 2015-11-11 adrien const (
9 e342de7d 2015-11-11 adrien DefaultMSize = 64 << 10
10 e342de7d 2015-11-11 adrien DefaultVersion = "9P2000"
11 e342de7d 2015-11-11 adrien )
12 e342de7d 2015-11-11 adrien
13 e342de7d 2015-11-11 adrien const (
14 e342de7d 2015-11-11 adrien DMDIR = 0x80000000 // mode bit for directories
15 e342de7d 2015-11-11 adrien DMAPPEND = 0x40000000 // mode bit for append only files
16 e342de7d 2015-11-11 adrien DMEXCL = 0x20000000 // mode bit for exclusive use files
17 e342de7d 2015-11-11 adrien DMMOUNT = 0x10000000 // mode bit for mounted channel
18 e342de7d 2015-11-11 adrien DMAUTH = 0x08000000 // mode bit for authentication file
19 e342de7d 2015-11-11 adrien DMTMP = 0x04000000 // mode bit for non-backed-up files
20 e342de7d 2015-11-11 adrien
21 e342de7d 2015-11-11 adrien // 9p2000.u extensions
22 e342de7d 2015-11-11 adrien DMSYMLINK = 0x02000000
23 e342de7d 2015-11-11 adrien DMDEVICE = 0x00800000
24 e342de7d 2015-11-11 adrien DMNAMEDPIPE = 0x00200000
25 e342de7d 2015-11-11 adrien DMSOCKET = 0x00100000
26 e342de7d 2015-11-11 adrien DMSETUID = 0x00080000
27 e342de7d 2015-11-11 adrien DMSETGID = 0x00040000
28 e342de7d 2015-11-11 adrien
29 e342de7d 2015-11-11 adrien DMREAD = 0x4 // mode bit for read permission
30 e342de7d 2015-11-11 adrien DMWRITE = 0x2 // mode bit for write permission
31 e342de7d 2015-11-11 adrien DMEXEC = 0x1 // mode bit for execute permission
32 e342de7d 2015-11-11 adrien )
33 e342de7d 2015-11-11 adrien
34 e342de7d 2015-11-11 adrien // Flag defines the flag type for use with open and create
35 e342de7d 2015-11-11 adrien type Flag uint8
36 e342de7d 2015-11-11 adrien
37 e342de7d 2015-11-11 adrien const (
38 e342de7d 2015-11-11 adrien OREAD Flag = 0x00 // open for read
39 e342de7d 2015-11-11 adrien OWRITE = 0x01 // write
40 e342de7d 2015-11-11 adrien ORDWR = 0x02 // read and write
41 e342de7d 2015-11-11 adrien OEXEC = 0x03 // execute, == read but check execute permission
42 e342de7d 2015-11-11 adrien
43 e342de7d 2015-11-11 adrien // PROPOSAL(stevvooe): Possible protocal extension to allow the create of
44 e342de7d 2015-11-11 adrien // symlinks. Initially, the link is created with no value. Read and write
45 e342de7d 2015-11-11 adrien // to read and set the link value.
46 e342de7d 2015-11-11 adrien OSYMLINK = 0x04
47 e342de7d 2015-11-11 adrien
48 e342de7d 2015-11-11 adrien // or'd in
49 e342de7d 2015-11-11 adrien OTRUNC = 0x10 // or'ed in (except for exec), truncate file first
50 e342de7d 2015-11-11 adrien OCEXEC = 0x20 // or'ed in, close on exec
51 e342de7d 2015-11-11 adrien ORCLOSE = 0x40 // or'ed in, remove on close
52 e342de7d 2015-11-11 adrien )
53 e342de7d 2015-11-11 adrien
54 e342de7d 2015-11-11 adrien // QType indicates the type of a resource within the Qid.
55 e342de7d 2015-11-11 adrien type QType uint8
56 e342de7d 2015-11-11 adrien
57 e342de7d 2015-11-11 adrien const (
58 e342de7d 2015-11-11 adrien QTDIR QType = 0x80 // type bit for directories
59 e342de7d 2015-11-11 adrien QTAPPEND = 0x40 // type bit for append only files
60 e342de7d 2015-11-11 adrien QTEXCL = 0x20 // type bit for exclusive use files
61 e342de7d 2015-11-11 adrien QTMOUNT = 0x10 // type bit for mounted channel
62 e342de7d 2015-11-11 adrien QTAUTH = 0x08 // type bit for authentication file
63 e342de7d 2015-11-11 adrien QTTMP = 0x04 // type bit for not-backed-up file
64 e342de7d 2015-11-11 adrien QTFILE = 0x00 // plain file
65 e342de7d 2015-11-11 adrien )
66 e342de7d 2015-11-11 adrien
67 e342de7d 2015-11-11 adrien func (qt QType) String() string {
68 e342de7d 2015-11-11 adrien switch qt {
69 e342de7d 2015-11-11 adrien case QTDIR:
70 e342de7d 2015-11-11 adrien return "dir"
71 e342de7d 2015-11-11 adrien case QTAPPEND:
72 e342de7d 2015-11-11 adrien return "append"
73 e342de7d 2015-11-11 adrien case QTEXCL:
74 e342de7d 2015-11-11 adrien return "excl"
75 e342de7d 2015-11-11 adrien case QTMOUNT:
76 e342de7d 2015-11-11 adrien return "mount"
77 e342de7d 2015-11-11 adrien case QTAUTH:
78 e342de7d 2015-11-11 adrien return "auth"
79 e342de7d 2015-11-11 adrien case QTTMP:
80 e342de7d 2015-11-11 adrien return "tmp"
81 e342de7d 2015-11-11 adrien case QTFILE:
82 e342de7d 2015-11-11 adrien return "file"
83 e342de7d 2015-11-11 adrien }
84 e342de7d 2015-11-11 adrien
85 e342de7d 2015-11-11 adrien return "unknown"
86 e342de7d 2015-11-11 adrien }
87 e342de7d 2015-11-11 adrien
88 e342de7d 2015-11-11 adrien // Tag uniquely identifies an outstanding fcall in a 9p session.
89 e342de7d 2015-11-11 adrien type Tag uint16
90 e342de7d 2015-11-11 adrien
91 e342de7d 2015-11-11 adrien const NOTAG Tag = ^Tag(0)
92 e342de7d 2015-11-11 adrien
93 e342de7d 2015-11-11 adrien type Fid uint32
94 e342de7d 2015-11-11 adrien
95 e342de7d 2015-11-11 adrien const NOFID Fid = ^Fid(0)
96 e342de7d 2015-11-11 adrien
97 e342de7d 2015-11-11 adrien type Qid struct {
98 e342de7d 2015-11-11 adrien Type QType `9p:type,1`
99 e342de7d 2015-11-11 adrien Version uint32
100 e342de7d 2015-11-11 adrien Path uint64
101 e342de7d 2015-11-11 adrien }
102 e342de7d 2015-11-11 adrien
103 e342de7d 2015-11-11 adrien func (qid Qid) String() string {
104 e342de7d 2015-11-11 adrien return fmt.Sprintf("qid(%v, v=%x, p=%x)",
105 e342de7d 2015-11-11 adrien qid.Type, qid.Version, qid.Path)
106 e342de7d 2015-11-11 adrien }
107 e342de7d 2015-11-11 adrien
108 e342de7d 2015-11-11 adrien type Dir struct {
109 e342de7d 2015-11-11 adrien Type uint16
110 e342de7d 2015-11-11 adrien Dev uint32
111 e342de7d 2015-11-11 adrien Qid Qid
112 e342de7d 2015-11-11 adrien Mode uint32
113 e342de7d 2015-11-11 adrien
114 e342de7d 2015-11-11 adrien // BUG(stevvooe): The Year 2038 is coming soon. 9p wire protocol has these
115 e342de7d 2015-11-11 adrien // as 4 byte epoch times. Some possibilities include time dilation fields
116 e342de7d 2015-11-11 adrien // or atemporal files. We can also just not use them and set them to zero.
117 e342de7d 2015-11-11 adrien
118 e342de7d 2015-11-11 adrien AccessTime time.Time
119 e342de7d 2015-11-11 adrien ModTime time.Time
120 e342de7d 2015-11-11 adrien
121 e342de7d 2015-11-11 adrien Length uint64
122 e342de7d 2015-11-11 adrien Name string
123 e342de7d 2015-11-11 adrien UID string
124 e342de7d 2015-11-11 adrien GID string
125 e342de7d 2015-11-11 adrien MUID string
126 e342de7d 2015-11-11 adrien }
127 e342de7d 2015-11-11 adrien
128 e342de7d 2015-11-11 adrien func (d Dir) String() string {
129 e342de7d 2015-11-11 adrien return fmt.Sprintf("dir(%v mode=%v atime=%v mtime=%v length=%v name=%v uid=%v gid=%v muid=%v)",
130 e342de7d 2015-11-11 adrien d.Qid, d.Mode, d.AccessTime, d.ModTime, d.Length, d.Name, d.UID, d.GID, d.MUID)
131 e342de7d 2015-11-11 adrien }