// 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" #include "sys_types.h" 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 = true; close_out: close(fd); out: FLUSH(&fileout); FLUSH(&okout); } void sys·writefile(string filein, string textin, bool okout) { int32 fd; byte namebuf[256]; okout = false; if(filein == nil || filein->len >= sizeof(namebuf)) goto out; mcpy(namebuf, filein->str, filein->len); namebuf[filein->len] = '\0'; fd = open(namebuf, 1|O_CREAT, 0644); // open for write, create if non-existant (sic) if(fd < 0) goto out; if (write(fd, textin->str, textin->len) != textin->len) { goto close_out; } okout = true; close_out: close(fd); out: FLUSH(&okout); }