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  }