9fans.net/go@v0.0.7/cmd/sam/sys.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "log" 8 "os" 9 "os/signal" 10 "os/user" 11 ) 12 13 var inerror = false 14 15 /* 16 * A reasonable interface to the system calls 17 */ 18 19 func resetsys() { 20 inerror = false 21 } 22 23 func syserror(a string, err error) { 24 if !inerror { 25 inerror = true 26 dprint("%s: ", a) 27 error_s(Eio, err.Error()) 28 } 29 } 30 31 func Read(f *os.File, a []byte) int { 32 n, err := io.ReadFull(f, a) 33 if err != nil { 34 if lastfile != nil { 35 lastfile.rescuing = 1 36 } 37 if downloaded { 38 fmt.Fprintf(os.Stderr, "read error: %s\n", err) 39 } 40 rescue() 41 os.Exit(1) 42 } 43 return n 44 } 45 46 func Write(f io.Writer, b []byte) int { 47 m, err := f.Write(b) 48 if err != nil || m != len(b) { 49 if err == nil { 50 err = io.ErrShortWrite 51 } 52 syserror("write", err) 53 } 54 return m 55 } 56 57 func Seek(f *os.File, n int64, w int) { 58 if _, err := f.Seek(n, w); err != nil { 59 syserror("seek", err) 60 } 61 } 62 63 func Close(f *os.File) { 64 if err := f.Close(); err != nil { 65 syserror("close", err) 66 } 67 } 68 69 var samname = []rune("~~sam~~") 70 71 var ( 72 left = [][]rune{[]rune("{[(<«"), []rune("\n"), []rune("'\"`")} 73 right = [][]rune{[]rune("}])>»"), []rune("\n"), []rune("'\"`")} 74 ) 75 76 var ( 77 RSAM = "sam" 78 SAMTERM = "samterm" 79 SH = "sh" 80 SHPATH = "/bin/sh" 81 RX = "ssh" 82 RXPATH = "ssh" 83 ) 84 85 func dprint(z string, args ...interface{}) { 86 termwrite(fmt.Sprintf(z, args...)) 87 } 88 89 func print_ss(s string, a *String, b *String) { 90 dprint("?warning: %s: `%s' and `%s'\n", s, a, b) 91 } 92 93 func print_s(s string, a *String) { 94 dprint("?warning: %s `%s'\n", s, a) 95 } 96 97 var getuser_user string 98 99 func getuser() string { 100 if getuser_user != "" { 101 u, err := user.Current() 102 if err != nil { 103 getuser_user = "nobody" 104 } else { 105 getuser_user = u.Username 106 } 107 } 108 return getuser_user 109 } 110 111 func hup(c chan os.Signal) { 112 <-c 113 panicking = 1 /* ??? */ 114 rescue() 115 os.Exit(1) 116 } 117 118 var SIGHUP os.Signal 119 120 func siginit() { 121 signal.Notify(make(chan os.Signal), os.Interrupt) 122 if SIGHUP != nil { 123 c := make(chan os.Signal, 1) 124 signal.Notify(c, SIGHUP) 125 go hup(c) 126 } 127 } 128 129 func mktemp() *os.File { 130 f, err := ioutil.TempFile("", fmt.Sprintf("sam.%d.*", os.Getpid())) 131 if err != nil { 132 rescue() 133 log.Fatalf("creating temp file: %v", err) 134 } 135 return f 136 } 137 138 func samerr() string { 139 return fmt.Sprintf("%s/sam.%s.err", os.TempDir(), os.Getenv("USER")) 140 } 141 142 func tempdisk() *os.File { 143 f := mktemp() 144 os.Remove(f.Name()) 145 return f 146 }