adjust gitignore
[mkp224o.git] / ioutil.c
blobf3b4c1f7ef53d070d0b79e0018c77b9f0f4ed43e
1 #include <stdint.h>
2 #include <string.h>
3 #include "types.h"
4 #include "ioutil.h"
6 #ifndef _WIN32
8 #include <errno.h>
9 #include <sys/stat.h>
10 #include <fcntl.h>
11 #include <unistd.h>
13 int writeall(FH fd,const u8 *data,size_t len)
15 ssize_t wrote;
16 while (len) {
17 wrote = write(fd,data,len);
18 if (wrote == -1) {
19 if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
20 continue;
21 return -1;
23 len -= (size_t) wrote;
24 data += wrote;
26 return 0;
29 FH createfile(const char *path,int secret)
31 int fd;
32 do {
33 fd = open(path,O_WRONLY | O_CREAT | O_TRUNC,secret ? 0600 : 0666);
34 if (fd == -1) {
35 if (errno == EINTR)
36 continue;
37 return -1;
39 } while (0);
40 return fd;
43 int closefile(FH fd)
45 int cret;
46 do {
47 cret = close(fd);
48 if (cret == -1) {
49 if (errno == EINTR)
50 continue;
51 return -1;
53 } while (0);
54 return 0;
57 int createdir(const char *path,int secret)
59 return mkdir(path,secret ? 0700 : 0777);
62 #else
64 int writeall(FH fd,const u8 *data,size_t len)
66 DWORD wrote;
67 BOOL success;
68 while (len) {
69 success = WriteFile(fd,data,
70 len <= (DWORD)-1 ? (DWORD)len : (DWORD)-1,&wrote,0);
71 if (!success)
72 return -1;
73 data += wrote;
74 if (len >= wrote)
75 len -= wrote;
76 else
77 len = 0;
79 return 0;
82 FH createfile(const char *path,int secret)
84 // XXX no support for non-ascii chars
85 // XXX don't know how to handle secret argument
86 (void) secret;
87 return CreateFileA(path,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
90 int closefile(FH fd)
92 return CloseHandle(fd) ? 0 : -1;
95 int createdir(const char *path,int secret)
97 // XXX don't know how to handle secret argument
98 return CreateDirectoryA(path,0) ? 0 : -1;
101 #endif
103 int writetofile(const char *path,const u8 *data,size_t len,int secret)
105 FH fd = createfile(path,secret);
106 int wret = writeall(fd,data,len);
107 int cret = closefile(fd);
108 if (cret == -1)
109 return -1;
110 return wret;