diff --git a/CHANGES b/CHANGES index 7a5431d..b33903a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,7 @@ 0.20: add errmsg API work around broken Linux sendfile API (offset 64-bit but count 32-bit) + add io_appendfile, io_readwritefile 0.19.2: for some reason, a botched dependency slipped in the the Makefile diff --git a/Makefile b/Makefile index db6b591..50ab4d7 100644 --- a/Makefile +++ b/Makefile @@ -162,6 +162,9 @@ fmt_ulong0.o: fmt/fmt_ulong0.c ./fmt.h fmt_ulonglong.o: fmt/fmt_ulonglong.c ./fmt.h fmt_xlong.o: fmt/fmt_xlong.c ./fmt.h ./haveinline.h fmt_xlonglong.o: fmt/fmt_xlonglong.c ./fmt.h +io_appendfile.o: io/io_appendfile.c ./io_internal.h ./io.h ./uint64.h \ + ./taia.h ./tai.h ./array.h ./haveepoll.h ./havekqueue.h ./havedevpoll.h \ + ./havesigio.h io_canread.o: io/io_canread.c ./io_internal.h ./io.h ./uint64.h ./taia.h \ ./tai.h ./array.h ./haveepoll.h ./havekqueue.h ./havedevpoll.h \ ./havesigio.h @@ -210,6 +213,9 @@ io_pipe.o: io/io_pipe.c ./io_internal.h ./io.h ./uint64.h ./taia.h \ io_readfile.o: io/io_readfile.c ./io_internal.h ./io.h ./uint64.h \ ./taia.h ./tai.h ./array.h ./haveepoll.h ./havekqueue.h ./havedevpoll.h \ ./havesigio.h +io_readwritefile.o: io/io_readwritefile.c ./io_internal.h ./io.h \ + ./uint64.h ./taia.h ./tai.h ./array.h ./haveepoll.h ./havekqueue.h \ + ./havedevpoll.h ./havesigio.h io_receivefd.o: io/io_receivefd.c ./io_internal.h ./io.h ./uint64.h \ ./taia.h ./tai.h ./array.h ./haveepoll.h ./havekqueue.h ./havedevpoll.h \ ./havesigio.h @@ -584,7 +590,7 @@ DNS_OBJS=dns_dfd.o dns_domain.o dns_dtda.o dns_ip.o dns_ip6.o dns_ipq.o dns_ipq6 CASE_OBJS=case_diffb.o case_diffs.o case_lowerb.o case_lowers.o case_starts.o MULT_OBJS=imult16.o imult32.o imult64.o umult16.o umult32.o umult64.o ARRAY_OBJS=array_allocate.o array_bytes.o array_cat.o array_cat0.o array_catb.o array_cate.o array_cats.o array_cats0.o array_equal.o array_fail.o array_get.o array_length.o array_reset.o array_start.o array_trunc.o array_truncate.o -IO_OBJS=io_canread.o io_canwrite.o io_check.o io_close.o io_closeonexec.o io_createfile.o io_dontwantread.o io_dontwantwrite.o io_eagain.o io_fd.o io_finishandshutdown.o io_getcookie.o io_nonblock.o io_passfd.o io_pipe.o io_readfile.o io_receivefd.o io_sendfile.o io_setcookie.o io_sigpipe.o io_socketpair.o io_timeout.o io_timeouted.o io_tryread.o io_tryreadtimeout.o io_trywrite.o io_trywritetimeout.o io_wait.o io_waitread.o io_waituntil.o io_waituntil2.o io_waitwrite.o io_wantread.o io_wantwrite.o iob_addbuf.o iob_addbuf_free.o iob_addbuf_internal.o iob_addfile.o iob_addfile_close.o iob_adds.o iob_adds_free.o iob_new.o iob_prefetch.o iob_reset.o iob_send.o +IO_OBJS=io_appendfile.o io_canread.o io_canwrite.o io_check.o io_close.o io_closeonexec.o io_createfile.o io_dontwantread.o io_dontwantwrite.o io_eagain.o io_fd.o io_finishandshutdown.o io_getcookie.o io_nonblock.o io_passfd.o io_pipe.o io_readfile.o io_readwritefile.o io_receivefd.o io_sendfile.o io_setcookie.o io_sigpipe.o io_socketpair.o io_timeout.o io_timeouted.o io_tryread.o io_tryreadtimeout.o io_trywrite.o io_trywritetimeout.o io_wait.o io_waitread.o io_waituntil.o io_waituntil2.o io_waitwrite.o io_wantread.o io_wantwrite.o iob_addbuf.o iob_addbuf_free.o iob_addbuf_internal.o iob_addfile.o iob_addfile_close.o iob_adds.o iob_adds_free.o iob_new.o iob_prefetch.o iob_reset.o iob_send.o TEXTCODE_OBJS=base64.o fmt_base64.o fmt_cescape.o fmt_foldwhitespace.o fmt_hexdump.o fmt_html.o fmt_quotedprintable.o fmt_to_array.o fmt_to_sa.o fmt_tofrom_array.o fmt_urlencoded.o fmt_uuencoded.o fmt_yenc.o scan_base64.o scan_cescape.o scan_hexdump.o scan_html.o scan_quotedprintable.o scan_to_array.o scan_to_sa.o scan_tofrom_array.o scan_urlencoded.o scan_uuencoded.o scan_yenc.o byte.a: $(BYTE_OBJS) diff --git a/io.h b/io.h index 8e84296..5f3f052 100644 --- a/io.h +++ b/io.h @@ -12,6 +12,12 @@ int io_readfile(int64* d,const char* s); /* like open(s,O_WRONLY|O_CREAT|O_TRUNC,0600) */ /* return 1 if ok, 0 on error */ int io_createfile(int64* d,const char* s); +/* like open(s,O_RDWR) */ +/* return 1 if ok, 0 on error */ +int io_readwritefile(int64* d,const char* s); +/* like open(s,O_WRONLY|O_APPEND|O_CREAT,0600) */ +/* return 1 if ok, 0 on error */ +int io_appendfile(int64* d,const char* s); /* like pipe(d) */ /* return 1 if ok, 0 on error */ int io_pipe(int64* d); diff --git a/io/io_appendfile.3 b/io/io_appendfile.3 new file mode 100644 index 0000000..f29a44c --- /dev/null +++ b/io/io_appendfile.3 @@ -0,0 +1,16 @@ +.TH io_appendfile 3 +.SH NAME +io_appendfile \- open a file for appending +.SH SYNTAX +.B #include + +int \fBio_appendfile\fP(int64* d,const char* s); +.SH DESCRIPTION +io_appendfile sets d to the number of a new descriptor writing to the +end of the disk file named \fIs\fR, and returns 1. If the file does not +exist, it will be created with mode 0600. + +If something goes wrong, io_appendfile sets \fIerrno\fR to indicate the error, and +returns 0; it does not create a new descriptor, and it does not touch d. +.SH "SEE ALSO" +io_readfile(3), io_createfile(3), io_readwritefile(3) diff --git a/io/io_appendfile.c b/io/io_appendfile.c new file mode 100644 index 0000000..bdc4c42 --- /dev/null +++ b/io/io_appendfile.c @@ -0,0 +1,13 @@ +#define _FILE_OFFSET_BITS 64 +#include +#include +#include "io_internal.h" + +int io_appendfile(int64* d,const char* s) { + long fd=open(s,O_WRONLY|O_APPEND|O_CREAT,0600); + if (fd != -1) { + *d=fd; + return 1; + } + return 0; +} diff --git a/io/io_createfile.3 b/io/io_createfile.3 index 9267935..958f838 100644 --- a/io/io_createfile.3 +++ b/io/io_createfile.3 @@ -14,4 +14,4 @@ If something goes wrong, io_createfile sets \fIerrno\fR to indicate the error, a returns 0; it does not create a new descriptor, and it does not touch d. (However, it may have truncated or created the file.) .SH "SEE ALSO" -io_readfile(3) +io_readfile(3), io_appendfile(3), io_readwritefile(3) diff --git a/io/io_readfile.3 b/io/io_readfile.3 index 37a69e8..a858a9f 100644 --- a/io/io_readfile.3 +++ b/io/io_readfile.3 @@ -12,4 +12,4 @@ disk file named \fIs\fR, and returns 1. If something goes wrong, io_readfile sets \fIerrno\fR to indicate the error, and returns 0; it does not create a new descriptor, and it does not touch d. .SH "SEE ALSO" -io_readfile(3) +io_createfilefile(3), io_appendfile(3), io_readwritefile(3) diff --git a/io/io_readwritefile.3 b/io/io_readwritefile.3 new file mode 100644 index 0000000..57cd017 --- /dev/null +++ b/io/io_readwritefile.3 @@ -0,0 +1,16 @@ +.TH io_readwritefile 3 +.SH NAME +io_readfile \- open a file for reading and writing +.SH SYNTAX +.B #include + +int \fBio_readwritefile\fP(int64* d,const char* s); +.SH DESCRIPTION +io_readwritefile sets d to the number of a new descriptor reading from +and writing to the disk file named \fIs\fR, and returns 1. The file +needs to exist. + +If something goes wrong, io_readwritefile sets \fIerrno\fR to indicate the error, and +returns 0; it does not create a new descriptor, and it does not touch d. +.SH "SEE ALSO" +io_readfile(3), io_createfile(3), io_appendfile(3) diff --git a/io/io_readwritefile.c b/io/io_readwritefile.c new file mode 100644 index 0000000..b7d9606 --- /dev/null +++ b/io/io_readwritefile.c @@ -0,0 +1,13 @@ +#define _FILE_OFFSET_BITS 64 +#include +#include +#include "io_internal.h" + +int io_readwritefile(int64* d,const char* s) { + long fd=open(s,O_RDWR); + if (fd != -1) { + *d=fd; + return 1; + } + return 0; +}