mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Split libc/unistd/ioleast.cpp into multiple files.
This commit is contained in:
parent
defa74d7ec
commit
a212ec0ee3
15 changed files with 441 additions and 80 deletions
|
@ -237,6 +237,14 @@ getopt/getopt_long.o \
|
|||
getopt/getopt.o \
|
||||
grp/grent.o \
|
||||
init/init.o \
|
||||
ioleast/preadall.o \
|
||||
ioleast/preadleast.o \
|
||||
ioleast/pwriteall.o \
|
||||
ioleast/pwriteleast.o \
|
||||
ioleast/readall.o \
|
||||
ioleast/readleast.o \
|
||||
ioleast/writeall.o \
|
||||
ioleast/writeleast.o \
|
||||
libgen/basename.o \
|
||||
libgen/dirname.o \
|
||||
locale/localeconv.o \
|
||||
|
@ -430,7 +438,6 @@ unistd/getpgid.o \
|
|||
unistd/getpid.o \
|
||||
unistd/getppid.o \
|
||||
unistd/getuid.o \
|
||||
unistd/ioleast.o \
|
||||
unistd/isatty.o \
|
||||
unistd/lchown.o \
|
||||
unistd/linkat.o \
|
||||
|
|
51
libc/include/ioleast.h
Normal file
51
libc/include/ioleast.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
The Sortix C Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The Sortix C Library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ioleast.h
|
||||
Versions of {,p}{read,write} that don't return until it has returned as much
|
||||
data as requested, end of file, or an error occurs. This is sometimes needed
|
||||
as read(2) and write(2) is not always guaranteed to fill up the entire
|
||||
buffer or write it all.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef INCLUDE_IOLEAST_H
|
||||
#define INCLUDE_IOLEAST_H
|
||||
|
||||
#include <features.h>
|
||||
|
||||
#include <sys/__/types.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
@include(off_t.h)
|
||||
@include(size_t.h)
|
||||
|
||||
size_t preadall(int fd, void* buf, size_t count, off_t off);
|
||||
size_t preadleast(int fd, void* buf, size_t least, size_t max, off_t off);
|
||||
size_t pwriteall(int fd, const void* buf, size_t count, off_t off);
|
||||
size_t pwriteleast(int fd, const void* buf, size_t least, size_t max, off_t off);
|
||||
size_t readall(int fd, void* buf, size_t count);
|
||||
size_t readleast(int fd, void* buf, size_t least, size_t max);
|
||||
size_t writeall(int fd, const void* buf, size_t count);
|
||||
size_t writeleast(int fd, const void* buf, size_t least, size_t max);
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif
|
|
@ -41,6 +41,7 @@ __BEGIN_DECLS
|
|||
@include(time_t.h)
|
||||
__END_DECLS
|
||||
#include <sortix/timespec.h>
|
||||
#include <ioleast.h>
|
||||
#endif
|
||||
#include <sortix/seek.h>
|
||||
#include <sortix/unistd.h>
|
||||
|
@ -366,12 +367,6 @@ int getdtablesize(void);
|
|||
size_t getpagesize(void);
|
||||
int memstat(size_t* memused, size_t* memtotal);
|
||||
int mkpartition(int fd, off_t start, off_t length);
|
||||
size_t preadall(int fd, void* buf, size_t count, off_t off);
|
||||
size_t preadleast(int fd, void* buf, size_t least, size_t max, off_t off);
|
||||
size_t pwriteall(int fd, const void* buf, size_t count, off_t off);
|
||||
size_t pwriteleast(int fd, const void* buf, size_t least, size_t max, off_t off);
|
||||
size_t readall(int fd, void* buf, size_t count);
|
||||
size_t readleast(int fd, void* buf, size_t least, size_t max);
|
||||
pid_t sfork(int flags);
|
||||
pid_t tfork(int flags, tforkregs_t* regs);
|
||||
size_t writeall(int fd, const void* buf, size_t count);
|
||||
|
|
30
libc/ioleast/preadall.cpp
Normal file
30
libc/ioleast/preadall.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
The Sortix C Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The Sortix C Library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ioleast/preadall.cpp
|
||||
Reads as much data as requested from the given offset.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <ioleast.h>
|
||||
|
||||
extern "C" size_t preadall(int fd, void* buf, size_t count, off_t off)
|
||||
{
|
||||
return preadleast(fd, buf, count, count, off);
|
||||
}
|
47
libc/ioleast/preadleast.cpp
Normal file
47
libc/ioleast/preadleast.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
The Sortix C Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The Sortix C Library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ioleast/preadleast.cpp
|
||||
Reads at least as much data as requested or more from the given offset.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <errno.h>
|
||||
#include <ioleast.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern "C"
|
||||
size_t preadleast(int fd, void* buf, size_t least, size_t max, off_t off)
|
||||
{
|
||||
ssize_t amount = pread(fd, buf, max, off);
|
||||
if ( amount < 0 )
|
||||
return 0;
|
||||
if ( least && !amount )
|
||||
return errno = EEOF, 0;
|
||||
if ( (size_t) amount < least )
|
||||
{
|
||||
void* nextbuf = (uint8_t*) buf + amount;
|
||||
size_t nextleast = least - amount;
|
||||
size_t nextmax = max - amount;
|
||||
off_t nextoff = off + amount;
|
||||
amount += preadleast(fd, nextbuf, nextleast, nextmax, nextoff);
|
||||
}
|
||||
return amount;
|
||||
}
|
30
libc/ioleast/pwriteall.cpp
Normal file
30
libc/ioleast/pwriteall.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
The Sortix C Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The Sortix C Library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ioleast/pwriteall.cpp
|
||||
Writes as much data as requested at the given offset.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <ioleast.h>
|
||||
|
||||
extern "C" size_t pwriteall(int fd, const void* buf, size_t count, off_t off)
|
||||
{
|
||||
return pwriteleast(fd, buf, count, count, off);
|
||||
}
|
47
libc/ioleast/pwriteleast.cpp
Normal file
47
libc/ioleast/pwriteleast.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
The Sortix C Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The Sortix C Library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ioleast/pwriteleast.cpp
|
||||
Writes at least as much data as requested or more at the given offset.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <errno.h>
|
||||
#include <ioleast.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern "C"
|
||||
size_t pwriteleast(int fd, const void* buf, size_t least, size_t max, off_t off)
|
||||
{
|
||||
ssize_t amount = pwrite(fd, buf, max, off);
|
||||
if ( amount < 0 )
|
||||
return 0;
|
||||
if ( least && !amount )
|
||||
return errno = EEOF, 0;
|
||||
if ( (size_t) amount < least )
|
||||
{
|
||||
const void* nextbuf = (const uint8_t*) buf + amount;
|
||||
size_t nextleast = least - amount;
|
||||
size_t nextmax = max - amount;
|
||||
off_t nextoff = off + amount;
|
||||
amount += pwriteleast(fd, nextbuf, nextleast, nextmax, nextoff);
|
||||
}
|
||||
return amount;
|
||||
}
|
30
libc/ioleast/readall.cpp
Normal file
30
libc/ioleast/readall.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
The Sortix C Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The Sortix C Library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ioleast/readall.cpp
|
||||
Reads as much data as requested.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <ioleast.h>
|
||||
|
||||
extern "C" size_t readall(int fd, void* buf, size_t count)
|
||||
{
|
||||
return readleast(fd, buf, count, count);
|
||||
}
|
45
libc/ioleast/readleast.cpp
Normal file
45
libc/ioleast/readleast.cpp
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
The Sortix C Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The Sortix C Library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ioleast/readleast.cpp
|
||||
Reads at least as much data as requested or more.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <errno.h>
|
||||
#include <ioleast.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern "C" size_t readleast(int fd, void* buf, size_t least, size_t max)
|
||||
{
|
||||
ssize_t amount = read(fd, buf, max);
|
||||
if ( amount < 0 )
|
||||
return 0;
|
||||
if ( least && !amount )
|
||||
return errno = EEOF, 0;
|
||||
if ( (size_t) amount < least )
|
||||
{
|
||||
void* nextbuf = (uint8_t*) buf + amount;
|
||||
size_t nextleast = least - amount;
|
||||
size_t nextmax = max - amount;
|
||||
amount += readleast(fd, nextbuf, nextleast, nextmax);
|
||||
}
|
||||
return amount;
|
||||
}
|
30
libc/ioleast/writeall.cpp
Normal file
30
libc/ioleast/writeall.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
The Sortix C Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The Sortix C Library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ioleast/writeall.cpp
|
||||
Writes as much data as requested.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <ioleast.h>
|
||||
|
||||
extern "C" size_t writeall(int fd, const void* buf, size_t count)
|
||||
{
|
||||
return writeleast(fd, buf, count, count);
|
||||
}
|
45
libc/ioleast/writeleast.cpp
Normal file
45
libc/ioleast/writeleast.cpp
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
The Sortix C Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The Sortix C Library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ioleast/writeleast.cpp
|
||||
Writes at least as much data as requested or more.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <errno.h>
|
||||
#include <ioleast.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern "C" size_t writeleast(int fd, const void* buf, size_t least, size_t max)
|
||||
{
|
||||
ssize_t amount = write(fd, buf, max);
|
||||
if ( amount < 0 )
|
||||
return 0;
|
||||
if ( least && !amount )
|
||||
return errno = EEOF, 0;
|
||||
if ( (size_t) amount < least )
|
||||
{
|
||||
const void* nextbuf = (const uint8_t*) buf + amount;
|
||||
size_t nextleast = least - amount;
|
||||
size_t nextmax = max - amount;
|
||||
amount += writeleast(fd, nextbuf, nextleast, nextmax);
|
||||
}
|
||||
return amount;
|
||||
}
|
|
@ -11,9 +11,8 @@ ifndef CXXFLAGS
|
|||
endif
|
||||
|
||||
SORTIXKERNEL=../sortix
|
||||
LIBC=../libc
|
||||
|
||||
CPPFLAGS:=$(CPPFLAGS) -I$(SORTIXKERNEL)/include
|
||||
CPPFLAGS:=$(CPPFLAGS) -I$(SORTIXKERNEL)/include -I.
|
||||
CXXFLAGS:=$(CXXFLAGS) -Wall -Wextra -fno-exceptions -fno-rtti
|
||||
|
||||
BINARIES=mkinitrd initrdfs
|
||||
|
@ -24,8 +23,8 @@ all: $(BINARIES)
|
|||
|
||||
.PHONY: all install uninstall clean
|
||||
|
||||
%: %.cpp crc32.cpp rules.cpp $(LIBC)/unistd/ioleast.cpp
|
||||
$(CXX) -std=gnu++11 $(CPPFLAGS) $(CXXFLAGS) $< crc32.cpp rules.cpp $(LIBC)/unistd/ioleast.cpp -o $@
|
||||
%: %.cpp crc32.cpp rules.cpp
|
||||
$(CXX) -std=gnu++11 $(CPPFLAGS) $(CXXFLAGS) $< crc32.cpp rules.cpp -o $@
|
||||
|
||||
clean:
|
||||
rm -f $(BINARIES)
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <errno.h>
|
||||
#include <error.h>
|
||||
#include <fcntl.h>
|
||||
#include <ioleast.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -35,19 +36,6 @@
|
|||
|
||||
#include "crc32.h"
|
||||
|
||||
#if !defined(sortix)
|
||||
__BEGIN_DECLS
|
||||
size_t preadall(int fd, void* buf, size_t count, off_t off);
|
||||
size_t preadleast(int fd, void* buf, size_t least, size_t max, off_t off);
|
||||
size_t pwriteall(int fd, const void* buf, size_t count, off_t off);
|
||||
size_t pwriteleast(int fd, const void* buf, size_t least, size_t max, off_t off);
|
||||
size_t readall(int fd, void* buf, size_t count);
|
||||
size_t readleast(int fd, void* buf, size_t least, size_t max);
|
||||
size_t writeall(int fd, const void* buf, size_t count);
|
||||
size_t writeleast(int fd, const void* buf, size_t least, size_t max);
|
||||
__END_DECLS
|
||||
#endif
|
||||
|
||||
char* Substring(const char* str, size_t start, size_t length)
|
||||
{
|
||||
char* result = (char*) malloc(length+1);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012.
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
|
||||
|
||||
This file is part of the Sortix C Library.
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
|||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
unistd/ioleast.cpp
|
||||
ioleast.h
|
||||
Versions of {,p}{read,write} that don't return until it has returned as much
|
||||
data as requested, end of file, or an error occurs. This is sometimes needed
|
||||
as read(2) and write(2) is not always guaranteed to fill up the entire
|
||||
|
@ -25,20 +25,34 @@
|
|||
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef SORTIX_COMPATIBILITY_INCLUDE_IOLEAST_H
|
||||
#define SORTIX_COMPATIBILITY_INCLUDE_IOLEAST_H
|
||||
|
||||
#if defined(__sortix__) || defined(__sortix_libc__)
|
||||
|
||||
#include_next <ioleast.h>
|
||||
|
||||
#else
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifndef EEOF
|
||||
#if !defined(EEOF) && defined(EIO)
|
||||
#define EEOF EIO
|
||||
#endif
|
||||
|
||||
extern "C" size_t readleast(int fd, void* buf, size_t least, size_t max)
|
||||
__attribute__((unused)) static inline
|
||||
size_t readleast(int fd, void* buf, size_t least, size_t max)
|
||||
{
|
||||
ssize_t amount = read(fd, buf, max);
|
||||
if ( amount < 0 ) { return 0; }
|
||||
if ( least && !amount ) { errno = EEOF; return 0; }
|
||||
if ( amount < 0 )
|
||||
return 0;
|
||||
if ( least && !amount )
|
||||
return errno = EEOF, 0;
|
||||
if ( (size_t) amount < least )
|
||||
{
|
||||
void* nextbuf = (uint8_t*) buf + amount;
|
||||
|
@ -49,17 +63,32 @@ extern "C" size_t readleast(int fd, void* buf, size_t least, size_t max)
|
|||
return amount;
|
||||
}
|
||||
|
||||
extern "C" size_t readall(int fd, void* buf, size_t count)
|
||||
__attribute__((unused)) static inline
|
||||
size_t writeleast(int fd, const void* buf, size_t least, size_t max)
|
||||
{
|
||||
return readleast(fd, buf, count, count);
|
||||
ssize_t amount = write(fd, buf, max);
|
||||
if ( amount < 0 )
|
||||
return 0;
|
||||
if ( least && !amount )
|
||||
return errno = EEOF, 0;
|
||||
if ( (size_t) amount < least )
|
||||
{
|
||||
const void* nextbuf = (const uint8_t*) buf + amount;
|
||||
size_t nextleast = least - amount;
|
||||
size_t nextmax = max - amount;
|
||||
amount += writeleast(fd, nextbuf, nextleast, nextmax);
|
||||
}
|
||||
return amount;
|
||||
}
|
||||
|
||||
extern "C" size_t preadleast(int fd, void* buf, size_t least, size_t max,
|
||||
off_t off)
|
||||
__attribute__((unused)) static inline
|
||||
size_t preadleast(int fd, void* buf, size_t least, size_t max, off_t off)
|
||||
{
|
||||
ssize_t amount = pread(fd, buf, max, off);
|
||||
if ( amount < 0 ) { return 0; }
|
||||
if ( least && !amount ) { errno = EEOF; return 0; }
|
||||
if ( amount < 0 )
|
||||
return 0;
|
||||
if ( least && !amount )
|
||||
return errno = EEOF, 0;
|
||||
if ( (size_t) amount < least )
|
||||
{
|
||||
void* nextbuf = (uint8_t*) buf + amount;
|
||||
|
@ -71,37 +100,14 @@ extern "C" size_t preadleast(int fd, void* buf, size_t least, size_t max,
|
|||
return amount;
|
||||
}
|
||||
|
||||
extern "C" size_t preadall(int fd, void* buf, size_t count, off_t off)
|
||||
{
|
||||
return preadleast(fd, buf, count, count, off);
|
||||
}
|
||||
|
||||
extern "C" size_t writeleast(int fd, const void* buf, size_t least, size_t max)
|
||||
{
|
||||
ssize_t amount = write(fd, buf, max);
|
||||
if ( amount < 0 ) { return 0; }
|
||||
if ( least && !amount ) { errno = EEOF; return 0; }
|
||||
if ( (size_t) amount < least )
|
||||
{
|
||||
const void* nextbuf = (const uint8_t*) buf + amount;
|
||||
size_t nextleast = least - amount;
|
||||
size_t nextmax = max - amount;
|
||||
amount += writeleast(fd, nextbuf, nextleast, nextmax);
|
||||
}
|
||||
return amount;
|
||||
}
|
||||
|
||||
extern "C" size_t writeall(int fd, const void* buf, size_t count)
|
||||
{
|
||||
return writeleast(fd, buf, count, count);
|
||||
}
|
||||
|
||||
extern "C" size_t pwriteleast(int fd, const void* buf, size_t least, size_t max,
|
||||
off_t off)
|
||||
__attribute__((unused)) static inline
|
||||
size_t pwriteleast(int fd, const void* buf, size_t least, size_t max, off_t off)
|
||||
{
|
||||
ssize_t amount = pwrite(fd, buf, max, off);
|
||||
if ( amount < 0 ) { return 0; }
|
||||
if ( least && !amount ) { errno = EEOF; return 0; }
|
||||
if ( amount < 0 )
|
||||
return 0;
|
||||
if ( least && !amount )
|
||||
return errno = EEOF, 0;
|
||||
if ( (size_t) amount < least )
|
||||
{
|
||||
const void* nextbuf = (const uint8_t*) buf + amount;
|
||||
|
@ -113,7 +119,30 @@ extern "C" size_t pwriteleast(int fd, const void* buf, size_t least, size_t max,
|
|||
return amount;
|
||||
}
|
||||
|
||||
extern "C" size_t pwriteall(int fd, const void* buf, size_t count, off_t off)
|
||||
__attribute__((unused)) static inline
|
||||
size_t readall(int fd, void* buf, size_t count)
|
||||
{
|
||||
return readleast(fd, buf, count, count);
|
||||
}
|
||||
|
||||
__attribute__((unused)) static inline
|
||||
size_t writeall(int fd, const void* buf, size_t count)
|
||||
{
|
||||
return writeleast(fd, buf, count, count);
|
||||
}
|
||||
|
||||
__attribute__((unused)) static inline
|
||||
size_t preadall(int fd, void* buf, size_t count, off_t off)
|
||||
{
|
||||
return preadleast(fd, buf, count, count, off);
|
||||
}
|
||||
|
||||
__attribute__((unused)) static inline
|
||||
size_t pwriteall(int fd, const void* buf, size_t count, off_t off)
|
||||
{
|
||||
return pwriteleast(fd, buf, count, count, off);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -27,6 +27,7 @@
|
|||
#include <errno.h>
|
||||
#include <error.h>
|
||||
#include <fcntl.h>
|
||||
#include <ioleast.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -38,19 +39,6 @@
|
|||
#include "crc32.h"
|
||||
#include "rules.h"
|
||||
|
||||
#if !defined(sortix)
|
||||
__BEGIN_DECLS
|
||||
size_t preadall(int fd, void* buf, size_t count, off_t off);
|
||||
size_t preadleast(int fd, void* buf, size_t least, size_t max, off_t off);
|
||||
size_t pwriteall(int fd, const void* buf, size_t count, off_t off);
|
||||
size_t pwriteleast(int fd, const void* buf, size_t least, size_t max, off_t off);
|
||||
size_t readall(int fd, void* buf, size_t count);
|
||||
size_t readleast(int fd, void* buf, size_t least, size_t max);
|
||||
size_t writeall(int fd, const void* buf, size_t count);
|
||||
size_t writeleast(int fd, const void* buf, size_t least, size_t max);
|
||||
__END_DECLS
|
||||
#endif
|
||||
|
||||
uint32_t HostModeToInitRD(mode_t mode)
|
||||
{
|
||||
uint32_t result = mode & 0777; // Lower 9 bits per POSIX and tradition.
|
||||
|
|
Loading…
Reference in a new issue