]> Cypherpunks repositories - gostls13.git/commitdiff
add sys.readfile()
authorRob Pike <r@golang.org>
Thu, 26 Jun 2008 21:09:26 +0000 (14:09 -0700)
committerRob Pike <r@golang.org>
Thu, 26 Jun 2008 21:09:26 +0000 (14:09 -0700)
add args to linux runtime

SVN=124961

src/cmd/gc/sys.go
src/cmd/gc/sysimport.c
src/runtime/Makefile
src/runtime/rt0_amd64_darwin.s
src/runtime/rt0_amd64_linux.s
src/runtime/runtime.h
src/runtime/sys_file.c [new file with mode: 0644]

index 613a0dcbcb228266659cb026100605b223df5b4f..4ea54b88d580e8c5591b786c7dfbf9bc686d4e9b 100644 (file)
@@ -40,6 +40,8 @@ func  mapaccess2(hmap *map[any]any, key any) (val any, pres bool);
 func   mapassign1(hmap *map[any]any, key any, val any);
 func   mapassign2(hmap *map[any]any, key any, val any, pres bool);
 
+func   readfile(string) (string, bool);        // read file into string; boolean status
+
 export
        mal
        breakpoint
@@ -79,4 +81,7 @@ export
        mapassign1
        mapassign2
 
+       // files
+       readfile
+
        ;
index 50170833784fef93219bfab950ea16246f0ff56d..284da748e435853a11d257e26d111de770c90534 100644 (file)
@@ -3,10 +3,10 @@ char* sysimport =
        "type sys._e002 {}\n"
        "type sys.any 24\n"
        "type sys._e003 *sys.any\n"
-       "type sys._o181 {_e179 sys._e003}\n"
+       "type sys._o207 {_e205 sys._e003}\n"
        "type sys.uint32 6\n"
-       "type sys._i183 {_e180 sys.uint32}\n"
-       "type sys._e001 (sys._e002 sys._o181 sys._i183)\n"
+       "type sys._i209 {_e206 sys.uint32}\n"
+       "type sys._e001 (sys._e002 sys._o207 sys._i209)\n"
        "var !sys.mal sys._e001\n"
        "type sys._e005 {}\n"
        "type sys._e006 {}\n"
@@ -16,151 +16,156 @@ char*     sysimport =
        "type sys._e009 {}\n"
        "type sys._e010 {}\n"
        "type sys.int32 5\n"
-       "type sys._i189 {_e188 sys.int32}\n"
-       "type sys._e008 (sys._e009 sys._e010 sys._i189)\n"
+       "type sys._i215 {_e214 sys.int32}\n"
+       "type sys._e008 (sys._e009 sys._e010 sys._i215)\n"
        "var !sys.panicl sys._e008\n"
        "type sys._e012 {}\n"
        "type sys._e013 {}\n"
        "type sys.bool 12\n"
-       "type sys._i194 {_e193 sys.bool}\n"
-       "type sys._e011 (sys._e012 sys._e013 sys._i194)\n"
+       "type sys._i220 {_e219 sys.bool}\n"
+       "type sys._e011 (sys._e012 sys._e013 sys._i220)\n"
        "var !sys.printbool sys._e011\n"
        "type sys._e015 {}\n"
        "type sys._e016 {}\n"
        "type sys.float64 10\n"
-       "type sys._i199 {_e198 sys.float64}\n"
-       "type sys._e014 (sys._e015 sys._e016 sys._i199)\n"
+       "type sys._i225 {_e224 sys.float64}\n"
+       "type sys._e014 (sys._e015 sys._e016 sys._i225)\n"
        "var !sys.printfloat sys._e014\n"
        "type sys._e018 {}\n"
        "type sys._e019 {}\n"
        "type sys.int64 7\n"
-       "type sys._i204 {_e203 sys.int64}\n"
-       "type sys._e017 (sys._e018 sys._e019 sys._i204)\n"
+       "type sys._i230 {_e229 sys.int64}\n"
+       "type sys._e017 (sys._e018 sys._e019 sys._i230)\n"
        "var !sys.printint sys._e017\n"
        "type sys._e021 {}\n"
        "type sys._e022 {}\n"
        "type sys._e023 25\n"
        "type sys.string *sys._e023\n"
-       "type sys._i209 {_e208 sys.string}\n"
-       "type sys._e020 (sys._e021 sys._e022 sys._i209)\n"
+       "type sys._i235 {_e234 sys.string}\n"
+       "type sys._e020 (sys._e021 sys._e022 sys._i235)\n"
        "var !sys.printstring sys._e020\n"
        "type sys._e025 {}\n"
        "type sys._e026 {}\n"
        "type sys.uint8 2\n"
        "type sys._e027 *sys.uint8\n"
-       "type sys._i214 {_e213 sys._e027}\n"
-       "type sys._e024 (sys._e025 sys._e026 sys._i214)\n"
+       "type sys._i240 {_e239 sys._e027}\n"
+       "type sys._e024 (sys._e025 sys._e026 sys._i240)\n"
        "var !sys.printpointer sys._e024\n"
        "type sys._e029 {}\n"
-       "type sys._o221 {_e218 sys.string}\n"
-       "type sys._i223 {_e219 sys.string _e220 sys.string}\n"
-       "type sys._e028 (sys._e029 sys._o221 sys._i223)\n"
+       "type sys._o247 {_e244 sys.string}\n"
+       "type sys._i249 {_e245 sys.string _e246 sys.string}\n"
+       "type sys._e028 (sys._e029 sys._o247 sys._i249)\n"
        "var !sys.catstring sys._e028\n"
        "type sys._e031 {}\n"
-       "type sys._o231 {_e228 sys.int32}\n"
-       "type sys._i233 {_e229 sys.string _e230 sys.string}\n"
-       "type sys._e030 (sys._e031 sys._o231 sys._i233)\n"
+       "type sys._o257 {_e254 sys.int32}\n"
+       "type sys._i259 {_e255 sys.string _e256 sys.string}\n"
+       "type sys._e030 (sys._e031 sys._o257 sys._i259)\n"
        "var !sys.cmpstring sys._e030\n"
        "type sys._e033 {}\n"
-       "type sys._o242 {_e238 sys.string}\n"
-       "type sys._i244 {_e239 sys.string _e240 sys.int32 _e241 sys.int32}\n"
-       "type sys._e032 (sys._e033 sys._o242 sys._i244)\n"
+       "type sys._o268 {_e264 sys.string}\n"
+       "type sys._i270 {_e265 sys.string _e266 sys.int32 _e267 sys.int32}\n"
+       "type sys._e032 (sys._e033 sys._o268 sys._i270)\n"
        "var !sys.slicestring sys._e032\n"
        "type sys._e035 {}\n"
-       "type sys._o253 {_e250 sys.uint8}\n"
-       "type sys._i255 {_e251 sys.string _e252 sys.int32}\n"
-       "type sys._e034 (sys._e035 sys._o253 sys._i255)\n"
+       "type sys._o279 {_e276 sys.uint8}\n"
+       "type sys._i281 {_e277 sys.string _e278 sys.int32}\n"
+       "type sys._e034 (sys._e035 sys._o279 sys._i281)\n"
        "var !sys.indexstring sys._e034\n"
        "type sys._e037 {}\n"
-       "type sys._o262 {_e260 sys.string}\n"
-       "type sys._i264 {_e261 sys.int64}\n"
-       "type sys._e036 (sys._e037 sys._o262 sys._i264)\n"
+       "type sys._o288 {_e286 sys.string}\n"
+       "type sys._i290 {_e287 sys.int64}\n"
+       "type sys._e036 (sys._e037 sys._o288 sys._i290)\n"
        "var !sys.intstring sys._e036\n"
        "type sys._e039 {}\n"
-       "type sys._o271 {_e268 sys.string}\n"
+       "type sys._o297 {_e294 sys.string}\n"
        "type sys._e040 *sys.uint8\n"
-       "type sys._i273 {_e269 sys._e040 _e270 sys.int32}\n"
-       "type sys._e038 (sys._e039 sys._o271 sys._i273)\n"
+       "type sys._i299 {_e295 sys._e040 _e296 sys.int32}\n"
+       "type sys._e038 (sys._e039 sys._o297 sys._i299)\n"
        "var !sys.byteastring sys._e038\n"
        "type sys._e042 {}\n"
        "type sys._e043 <>\n"
-       "type sys._o282 {_e278 sys._e043}\n"
+       "type sys._o308 {_e304 sys._e043}\n"
        "type sys._e044 *sys.uint8\n"
        "type sys._e045 *sys.uint8\n"
-       "type sys._s289 {}\n"
-       "type sys._e046 *sys._s289\n"
-       "type sys._i284 {_e279 sys._e044 _e280 sys._e045 _e281 sys._e046}\n"
-       "type sys._e041 (sys._e042 sys._o282 sys._i284)\n"
+       "type sys._s315 {}\n"
+       "type sys._e046 *sys._s315\n"
+       "type sys._i310 {_e305 sys._e044 _e306 sys._e045 _e307 sys._e046}\n"
+       "type sys._e041 (sys._e042 sys._o308 sys._i310)\n"
        "var !sys.mkiface sys._e041\n"
        "type sys._e048 {}\n"
-       "type sys._o293 {_e292 sys.int32}\n"
+       "type sys._o319 {_e318 sys.int32}\n"
        "type sys._e049 {}\n"
-       "type sys._e047 (sys._e048 sys._o293 sys._e049)\n"
+       "type sys._e047 (sys._e048 sys._o319 sys._e049)\n"
        "var !sys.argc sys._e047\n"
        "type sys._e051 {}\n"
-       "type sys._o298 {_e296 sys.string}\n"
-       "type sys._i300 {_e297 sys.int32}\n"
-       "type sys._e050 (sys._e051 sys._o298 sys._i300)\n"
-       "var !sys.argv sys._e050\n"
-       "type sys._e053 {}\n"
-       "type sys._o306 {_e304 sys.string}\n"
-       "type sys._i308 {_e305 sys.int32}\n"
-       "type sys._e052 (sys._e053 sys._o306 sys._i308)\n"
-       "var !sys.envv sys._e052\n"
-       "type sys._e055 {}\n"
-       "type sys._o313 {_e312 sys.int32}\n"
+       "type sys._o323 {_e322 sys.int32}\n"
+       "type sys._e052 {}\n"
+       "type sys._e050 (sys._e051 sys._o323 sys._e052)\n"
+       "var !sys.envc sys._e050\n"
+       "type sys._e054 {}\n"
+       "type sys._o328 {_e326 sys.string}\n"
+       "type sys._i330 {_e327 sys.int32}\n"
+       "type sys._e053 (sys._e054 sys._o328 sys._i330)\n"
+       "var !sys.argv sys._e053\n"
        "type sys._e056 {}\n"
-       "type sys._e054 (sys._e055 sys._o313 sys._e056)\n"
-       "var !sys.envc sys._e054\n"
+       "type sys._o336 {_e334 sys.string}\n"
+       "type sys._i338 {_e335 sys.int32}\n"
+       "type sys._e055 (sys._e056 sys._o336 sys._i338)\n"
+       "var !sys.envv sys._e055\n"
        "type sys._e058 {}\n"
-       "type sys._o319 {_e316 sys.int32 _e317 sys.float64}\n"
-       "type sys._i321 {_e318 sys.float64}\n"
-       "type sys._e057 (sys._e058 sys._o319 sys._i321)\n"
+       "type sys._o345 {_e342 sys.int32 _e343 sys.float64}\n"
+       "type sys._i347 {_e344 sys.float64}\n"
+       "type sys._e057 (sys._e058 sys._o345 sys._i347)\n"
        "var !sys.frexp sys._e057\n"
        "type sys._e060 {}\n"
-       "type sys._o328 {_e325 sys.float64}\n"
-       "type sys._i330 {_e326 sys.int32 _e327 sys.float64}\n"
-       "type sys._e059 (sys._e060 sys._o328 sys._i330)\n"
+       "type sys._o354 {_e351 sys.float64}\n"
+       "type sys._i356 {_e352 sys.int32 _e353 sys.float64}\n"
+       "type sys._e059 (sys._e060 sys._o354 sys._i356)\n"
        "var !sys.ldexp sys._e059\n"
        "type sys._e062 {}\n"
-       "type sys._o338 {_e335 sys.float64 _e336 sys.float64}\n"
-       "type sys._i340 {_e337 sys.float64}\n"
-       "type sys._e061 (sys._e062 sys._o338 sys._i340)\n"
+       "type sys._o364 {_e361 sys.float64 _e362 sys.float64}\n"
+       "type sys._i366 {_e363 sys.float64}\n"
+       "type sys._e061 (sys._e062 sys._o364 sys._i366)\n"
        "var !sys.modf sys._e061\n"
        "type sys._e064 {}\n"
        "type sys._e066 [sys.any] sys.any\n"
        "type sys._e065 *sys._e066\n"
-       "type sys._o344 {hmap sys._e065}\n"
-       "type sys._i346 {keysize sys.uint32 valsize sys.uint32 keyalg sys.uint32 valalg sys.uint32 hint sys.uint32}\n"
-       "type sys._e063 (sys._e064 sys._o344 sys._i346)\n"
+       "type sys._o370 {hmap sys._e065}\n"
+       "type sys._i372 {keysize sys.uint32 valsize sys.uint32 keyalg sys.uint32 valalg sys.uint32 hint sys.uint32}\n"
+       "type sys._e063 (sys._e064 sys._o370 sys._i372)\n"
        "var !sys.newmap sys._e063\n"
        "type sys._e068 {}\n"
-       "type sys._o354 {val sys.any}\n"
+       "type sys._o380 {val sys.any}\n"
        "type sys._e070 [sys.any] sys.any\n"
        "type sys._e069 *sys._e070\n"
-       "type sys._i356 {hmap sys._e069 key sys.any}\n"
-       "type sys._e067 (sys._e068 sys._o354 sys._i356)\n"
+       "type sys._i382 {hmap sys._e069 key sys.any}\n"
+       "type sys._e067 (sys._e068 sys._o380 sys._i382)\n"
        "var !sys.mapaccess1 sys._e067\n"
        "type sys._e072 {}\n"
-       "type sys._o361 {val sys.any pres sys.bool}\n"
+       "type sys._o387 {val sys.any pres sys.bool}\n"
        "type sys._e074 [sys.any] sys.any\n"
        "type sys._e073 *sys._e074\n"
-       "type sys._i363 {hmap sys._e073 key sys.any}\n"
-       "type sys._e071 (sys._e072 sys._o361 sys._i363)\n"
+       "type sys._i389 {hmap sys._e073 key sys.any}\n"
+       "type sys._e071 (sys._e072 sys._o387 sys._i389)\n"
        "var !sys.mapaccess2 sys._e071\n"
        "type sys._e076 {}\n"
        "type sys._e077 {}\n"
        "type sys._e079 [sys.any] sys.any\n"
        "type sys._e078 *sys._e079\n"
-       "type sys._i368 {hmap sys._e078 key sys.any val sys.any}\n"
-       "type sys._e075 (sys._e076 sys._e077 sys._i368)\n"
+       "type sys._i394 {hmap sys._e078 key sys.any val sys.any}\n"
+       "type sys._e075 (sys._e076 sys._e077 sys._i394)\n"
        "var !sys.mapassign1 sys._e075\n"
        "type sys._e081 {}\n"
        "type sys._e082 {}\n"
        "type sys._e084 [sys.any] sys.any\n"
        "type sys._e083 *sys._e084\n"
-       "type sys._i374 {hmap sys._e083 key sys.any val sys.any pres sys.bool}\n"
-       "type sys._e080 (sys._e081 sys._e082 sys._i374)\n"
+       "type sys._i400 {hmap sys._e083 key sys.any val sys.any pres sys.bool}\n"
+       "type sys._e080 (sys._e081 sys._e082 sys._i400)\n"
        "var !sys.mapassign2 sys._e080\n"
+       "type sys._e086 {}\n"
+       "type sys._o410 {_e407 sys.string _e408 sys.bool}\n"
+       "type sys._i412 {_e409 sys.string}\n"
+       "type sys._e085 (sys._e086 sys._o410 sys._i412)\n"
+       "var !sys.readfile sys._e085\n"
        "))\n"
 ;
index 11e39cc6ce641162fc89a2691f906658eec0f042..cc1e8c2ea417f88d6389eadb93f5e3f02befce75 100644 (file)
@@ -16,9 +16,10 @@ LIBOFILES=\
        rt1_$(GOARCH)_$(GOOS).$O\
        rt2_$(GOARCH).$O\
        runtime.$O\
+       sys_file.$O\
 
 OFILES=$(RT0OFILES) $(LIBOFILES)
-HFILES=
+HFILES=runtime.h
 
 install: rt0 $(LIB)
        cp $(RT0OFILES) $(GOROOT)/lib
index 031cc059df5811b1f12fc318c229412d95e0fa48..ad2e70843b5a39815e927027a440d996460d3dc6 100644 (file)
@@ -7,8 +7,8 @@ TEXT    _rt0_amd64_darwin(SB),1,$-8
        PUSHQ   $0
        MOVQ    SP, BP
        ANDQ    $~15, SP
-       MOVQ    8(BP), DI
-       LEAQ    16(BP), SI
+       MOVQ    8(BP), DI       // argc
+       LEAQ    16(BP), SI      // argv
        MOVL    DI, DX
        ADDL    $1, DX
        SHLL    $3, DX
@@ -57,6 +57,34 @@ TEXT sys·write(SB),1,$-8
        CALL    notok(SB)
        RET
 
+TEXT   open(SB),1,$-8
+       MOVQ    8(SP), DI
+       MOVL    16(SP), SI
+       MOVL    $5, AX                  // syscall entry
+       SYSCALL
+       RET
+
+TEXT   close(SB),1,$-8
+       MOVL    8(SP), DI
+       MOVL    $6, AX                  // syscall entry
+       SYSCALL
+       RET
+
+TEXT   fstat(SB),1,$-8
+       MOVL    8(SP), DI
+       MOVQ    16(SP), SI
+       MOVL    $189, AX                        // syscall entry
+       SYSCALL
+       RET
+
+TEXT   read(SB),1,$-8
+       MOVL    8(SP), DI
+       MOVQ    16(SP), SI
+       MOVL    24(SP), DX
+       MOVL    $3, AX                  // syscall entry
+       SYSCALL
+       RET
+
 TEXT   sys·sigaction(SB),1,$-8
        MOVL    8(SP), DI               // arg 1 sig
        MOVQ    16(SP), SI              // arg 2 act
index 30f72728ad4235d23e93b68b2c28c845a48edd38..d89dc927ef19a40d096fb5d8cb097c2f2c8dfaa9 100644 (file)
@@ -7,8 +7,8 @@ TEXT    _rt0_amd64_linux(SB),1,$-8
        PUSHQ   $0
        MOVQ    SP, BP
        ANDQ    $~15, SP
-       MOVQ    8(BP), DI
-       LEAQ    16(BP), SI
+       MOVQ    8(BP), DI       // argc
+       LEAQ    16(BP), SI      // argv
        MOVL    DI, DX
        ADDL    $1, DX
        SHLL    $3, DX
@@ -24,6 +24,11 @@ loop:
 
 done:
        ADDQ    $8, CX
+       SUBQ    $16, SP
+       MOVL    DI, 0(SP)
+       MOVQ    SI, 8(SP)
+       CALL    args(SB)
+       ADDQ    $16, SP
        CALL    check(SB)
        CALL    main·main(SB)
        CALL    sys·exit(SB)
@@ -52,6 +57,34 @@ TEXT sys·write(SB),1,$-8
        CALL    notok(SB)
        RET
 
+TEXT   open(SB),1,$-8
+       MOVQ    8(SP), DI
+       MOVL    16(SP), SI
+       MOVL    $2, AX                  // syscall entry
+       SYSCALL
+       RET
+
+TEXT   close(SB),1,$-8
+       MOVL    8(SP), DI
+       MOVL    $3, AX                  // syscall entry
+       SYSCALL
+       RET
+
+TEXT   fstat(SB),1,$-8
+       MOVL    8(SP), DI
+       MOVQ    16(SP), SI
+       MOVL    $5, AX                  // syscall entry
+       SYSCALL
+       RET
+
+TEXT   read(SB),1,$-8
+       MOVL    8(SP), DI
+       MOVQ    16(SP), SI
+       MOVL    24(SP), DX
+       MOVL    $0, AX                  // syscall entry
+       SYSCALL
+       RET
+
 TEXT   sys·rt_sigaction(SB),1,$-8
        MOVL    8(SP), DI
        MOVQ    16(SP), SI
@@ -94,7 +127,7 @@ TEXT sys·mmap(SB),1,$-8
        MOVL    $9, AX                  // syscall entry
        SYSCALL
        CMPQ    AX, $0xfffffffffffff001
-       JNE     2(PC)
+       JLS     2(PC)
        CALL    notok(SB)
        RET
 
index 4d185a5dc7349610562cd26c99a6be99076363de..c645992d8fb9e5262fd7574d996d6f35f47b1a99 100644 (file)
@@ -90,6 +90,10 @@ void*        mal(uint32);
 uint32 cmpstring(string, string);
 void   initsig(void);
 void   traceback(uint8 *pc, uint8 *sp);
+int32  open(byte*, int32);
+int32  read(int32, void*, int32);
+void   close(int32);
+int32  fstat(int32, void*);
 struct SigTab
 {
        int32   catch;
@@ -124,3 +128,4 @@ void        sys·intstring(int64, string);
 void   sys·ifaces2i(Sigi*, Sigs*, Map*, void*);
 void   sys·ifacei2i(Sigi*, Map*, void*);
 void   sys·ifacei2s(Sigs*, Map*, void*);
+void   sys·readfile(string, string, bool);
diff --git a/src/runtime/sys_file.c b/src/runtime/sys_file.c
new file mode 100644 (file)
index 0000000..80dec3d
--- /dev/null
@@ -0,0 +1,80 @@
+// Copyright 2009 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "runtime.h"
+
+typedef uint64 dev_t;
+typedef uint64 ino_t;
+typedef uint32 mode_t;
+typedef uint64 nlink_t;
+typedef uint32 uid_t;
+typedef uint32 gid_t;
+typedef int64 off_t;
+typedef int64 blksize_t;
+typedef int64 blkcnt_t;
+typedef int64 time_t;
+
+struct timespec {
+       time_t tv_sec;
+       int64 tv_nsec;
+};
+
+struct stat {
+       dev_t   st_dev;     /* ID of device containing file */
+       ino_t   st_ino;     /* inode number */
+       nlink_t st_nlink;   /* number of hard links */
+       mode_t  st_mode;    /* protection */
+       uid_t   st_uid;     /* user ID of owner */
+       gid_t   st_gid;     /* group ID of owner */
+       int32   pad0;
+       dev_t   st_rdev;    /* device ID (if special file) */
+       off_t   st_size;    /* total size, in bytes */
+       blksize_t st_blksize; /* blocksize for filesystem I/O */
+       blkcnt_t        st_blocks;  /* number of blocks allocated */
+       struct timespec st_atime;   /* time of last access */
+       struct timespec st_mtime;   /* time of last modification */
+       struct timespec st_ctime;   /* time of last status change */
+};
+
+void
+sys·readfile(string filein, string fileout, bool okout)
+{
+       int32 fd;
+       byte namebuf[256];
+       struct stat statbuf;
+
+       fileout = nil;
+       okout = false;
+
+       if(filein == nil || filein->len >= sizeof(namebuf))
+               goto out;
+
+       mcpy(namebuf, filein->str, filein->len);
+       namebuf[filein->len] = '\0';
+       fd = open(namebuf, 0);
+       if(fd < 0)
+               goto out;
+
+       if (fstat(fd, &statbuf) < 0)
+               goto close_out;
+
+       if (statbuf.st_size <= 0)
+               goto close_out;
+
+       fileout = mal(sizeof(fileout->len)+statbuf.st_size + 1);
+       fileout->len = statbuf.st_size;
+
+       if (read(fd, fileout->str, statbuf.st_size) != statbuf.st_size) {
+               fileout = nil;
+               goto close_out;
+       }
+       okout = 1;
+
+close_out:
+       close(fd);
+out:
+       FLUSH(&fileout);
+       FLUSH(&okout);
+       return;
+}