u3: restages #6062 for release

This commit is contained in:
Joe Bryan 2022-11-17 23:44:12 -05:00
parent 5c3daa265d
commit 97e7a14123
14 changed files with 329 additions and 327 deletions

View File

@ -2,6 +2,7 @@ include config.mk
compat_mks := $(foreach dir,$(compat),$(wildcard compat/$(dir)/*.mk)) compat_mks := $(foreach dir,$(compat),$(wildcard compat/$(dir)/*.mk))
include $(compat_mks) include $(compat_mks)
c = $(wildcard c/*.c)
jets = jets/tree.c $(wildcard jets/*/*.c) jets = jets/tree.c $(wildcard jets/*/*.c)
noun = $(wildcard noun/*.c) noun = $(wildcard noun/*.c)
ur = $(wildcard ur/*.c) ur = $(wildcard ur/*.c)
@ -13,7 +14,7 @@ bench = $(wildcard bench/*.c)
compat := $(foreach dir,$(compat),$(wildcard compat/$(dir)/*.c)) compat := $(foreach dir,$(compat),$(wildcard compat/$(dir)/*.c))
common = $(jets) $(noun) $(ur) $(vere) $(compat) common = $(c) $(jets) $(noun) $(ur) $(vere) $(compat)
headers = $(shell find include -type f) headers = $(shell find include -type f)
common_objs = $(shell echo $(common) | sed 's/\.c/.o/g') common_objs = $(shell echo $(common) | sed 's/\.c/.o/g')

96
pkg/urbit/c/defs.c Normal file
View File

@ -0,0 +1,96 @@
/// @file defs.c
#include "c/defs.h"
/* c3_pread(): full positioned read(), up to eof, retrying errors.
*/
ssize_t
c3_pread(c3_i fid_i, void* buf_v, size_t len_i, off_t off_i)
{
c3_w max_w = 128;
c3_w try_w = 0;
size_t rem_i = len_i;
ssize_t ret_i;
do {
if ( (0 > (ret_i = pread(fid_i, buf_v, rem_i, off_i)))
&& ( (++try_w == max_w)
|| ( (EINTR != errno)
&& (EAGAIN != errno)
&& (EWOULDBLOCK != errno) )))
{
return -1;
}
else if ( 0 == ret_i ) {
break;
}
else {
buf_v = (void*)((c3_c*)buf_v + ret_i);
rem_i -= ret_i;
off_i += ret_i;
}
}
while ( rem_i );
return len_i - rem_i;
}
/* c3_pwrite(): full positioned write(), retrying errors.
*/
ssize_t
c3_pwrite(c3_i fid_i, const void* buf_v, size_t len_i, off_t off_i)
{
c3_w max_w = 128;
c3_w try_w = 0;
size_t rem_i = len_i;
ssize_t ret_i;
do {
if ( (0 > (ret_i = pwrite(fid_i, buf_v, rem_i, off_i)))
&& ( (++try_w == max_w)
|| ( (EINTR != errno)
&& (EAGAIN != errno)
&& (EWOULDBLOCK != errno) )))
{
return -1;
}
else {
buf_v = (void*)((c3_c*)buf_v + ret_i);
rem_i -= ret_i;
off_i += ret_i;
}
}
while ( rem_i );
return len_i;
}
/* c3_write(): full write(), retrying errors.
*/
ssize_t
c3_write(c3_i fid_i, const void* buf_v, size_t len_i)
{
c3_w max_w = 128;
c3_w try_w = 0;
size_t rem_i = len_i;
ssize_t ret_i;
do {
if ( (0 > (ret_i = write(fid_i, buf_v, rem_i)))
&& ( (++try_w == max_w)
|| ( (EINTR != errno)
&& (EAGAIN != errno)
&& (EWOULDBLOCK != errno) )))
{
return -1;
}
else {
buf_v = (void*)((c3_c*)buf_v + ret_i);
rem_i -= ret_i;
}
}
while ( rem_i );
return len_i;
}

View File

@ -144,6 +144,63 @@ int link(const char *path1, const char *path2)
return -1; return -1;
} }
ssize_t pread(int fd, void *buf, size_t count, off_t offset)
{
DWORD len = 0;
OVERLAPPED overlapped = {0};
overlapped.OffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
(DWORD)0 : (DWORD)((offset >> 32) & 0xFFFFFFFFL);
overlapped.Offset = (sizeof(off_t) <= sizeof(DWORD)) ?
(DWORD)offset : (DWORD)(offset & 0xFFFFFFFFL);
HANDLE h = (HANDLE)_get_osfhandle(fd);
if ( INVALID_HANDLE_VALUE == h ) {
errno = EBADF;
return -1;
}
if ( !ReadFile(h, buf, count, &len, &overlapped) ) {
DWORD err = GetLastError();
if ( ERROR_HANDLE_EOF != err ) {
errno = err_win_to_posix(err);
return -1;
}
}
return (ssize_t)len;
}
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
{
DWORD len = 0;
OVERLAPPED overlapped = {0};
overlapped.OffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
(DWORD)0 : (DWORD)((offset >> 32) & 0xFFFFFFFFL);
overlapped.Offset = (sizeof(off_t) <= sizeof(DWORD)) ?
(DWORD)offset : (DWORD)(offset & 0xFFFFFFFFL);
HANDLE h = (HANDLE)_get_osfhandle(fd);
if ( INVALID_HANDLE_VALUE == h ) {
errno = EBADF;
return -1;
}
if ( !WriteFile(h, buf, count, &len, &overlapped) ) {
errno = err_win_to_posix(GetLastError());
return -1;
}
return (ssize_t)len;
}
// from msys2 mingw-packages-dev patches // from msys2 mingw-packages-dev patches
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------

View File

@ -4,6 +4,8 @@
#define mkdir(A, B) mkdir(A) #define mkdir(A, B) mkdir(A)
int link(const char *path1, const char *path2); int link(const char *path1, const char *path2);
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
char *realpath(const char *path, char *resolved_path); char *realpath(const char *path, char *resolved_path);
int fdatasync(int fd); int fdatasync(int fd);
int utimes(const char *path, const struct timeval times[2]); int utimes(const char *path, const struct timeval times[2]);

View File

@ -1,6 +1,11 @@
#ifndef C3_DEFS_H #ifndef C3_DEFS_H
#define C3_DEFS_H #define C3_DEFS_H
#include "c/portable.h"
#include "c/types.h"
#include <errno.h>
/** Loobeans - inverse booleans to match nock. /** Loobeans - inverse booleans to match nock.
**/ **/
# define c3y 0 # define c3y 0
@ -157,4 +162,28 @@
# define c3_fopen(a, b) ({ \ # define c3_fopen(a, b) ({ \
fopen(a, b);}) fopen(a, b);})
/** i/o wrappers
***
*** these handle partial success and retry ephemeral errors
*** up to hardcoded max try count, either reading/writing fully
*** (up to EOF on read) or returning on error.
***
*** a wrapper for read() is not provided, as file cursor position
*** is undefined on error. use pread() or loop yourself.
**/
/* c3_pread(): full positioned read(), up to eof, retrying errors.
*/
ssize_t
c3_pread(c3_i fid_i, void* buf_v, size_t len_i, off_t off_i);
/* c3_pwrite(): full positioned write(), retrying errors.
*/
ssize_t
c3_pwrite(c3_i fid_i, const void* buf_v, size_t len_i, off_t off_i);
/* c3_write(): full write(), retrying errors.
*/
ssize_t
c3_write(c3_i fid_i, const void* buf_v, size_t len_i);
#endif /* ifndef C3_DEFS_H */ #endif /* ifndef C3_DEFS_H */

View File

@ -1461,11 +1461,6 @@
void void
u3_daemon_init(); u3_daemon_init();
/* u3_write_fd(): retry interrupts, continue partial writes, assert errors.
*/
void
u3_write_fd(c3_i fid_i, const void* buf_v, size_t len_i);
c3_w c3_w
u3_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); u3_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

View File

@ -354,17 +354,11 @@ _ce_image_open(u3e_image* img_u)
static void static void
_ce_patch_write_control(u3_ce_patch* pat_u) _ce_patch_write_control(u3_ce_patch* pat_u)
{ {
ssize_t ret_i; c3_w len_w = sizeof(u3e_control) +
c3_w len_w = sizeof(u3e_control) + (pat_u->con_u->pgs_w * sizeof(u3e_line));
(pat_u->con_u->pgs_w * sizeof(u3e_line));
if ( len_w != (ret_i = write(pat_u->ctl_i, pat_u->con_u, len_w)) ) { if ( 0 > c3_pwrite(pat_u->ctl_i, pat_u->con_u, len_w, 0) ) {
if ( 0 < ret_i ) { fprintf(stderr, "loom: patch write: %s\r\n", strerror(errno));
fprintf(stderr, "loom: patch ctl partial write: %zu\r\n", (size_t)ret_i);
}
else {
fprintf(stderr, "loom: patch ctl write: %s\r\n", strerror(errno));
}
c3_assert(0); c3_assert(0);
} }
} }
@ -388,8 +382,9 @@ _ce_patch_read_control(u3_ce_patch* pat_u)
} }
pat_u->con_u = c3_malloc(len_w); pat_u->con_u = c3_malloc(len_w);
if ( (len_w != read(pat_u->ctl_i, pat_u->con_u, len_w)) ||
(len_w != sizeof(u3e_control) + if ( (len_w != c3_pread(pat_u->ctl_i, pat_u->con_u, len_w, 0))
|| (len_w != sizeof(u3e_control) +
(pat_u->con_u->pgs_w * sizeof(u3e_line))) ) (pat_u->con_u->pgs_w * sizeof(u3e_line))) )
{ {
c3_free(pat_u->con_u); c3_free(pat_u->con_u);
@ -450,8 +445,10 @@ _ce_patch_delete(void)
static c3_o static c3_o
_ce_patch_verify(u3_ce_patch* pat_u) _ce_patch_verify(u3_ce_patch* pat_u)
{ {
ssize_t ret_i; c3_w i_w, pag_w, mug_w;
c3_w i_w; c3_w mem_w[pag_wiz_i];
size_t off_i, siz_i = pag_siz_i;
ssize_t ret_i;
if ( u3e_version != pat_u->con_u->ver_y ) { if ( u3e_version != pat_u->con_u->ver_y ) {
fprintf(stderr, "loom: patch version mismatch: have %u, need %u\r\n", fprintf(stderr, "loom: patch version mismatch: have %u, need %u\r\n",
@ -461,15 +458,11 @@ _ce_patch_verify(u3_ce_patch* pat_u)
} }
for ( i_w = 0; i_w < pat_u->con_u->pgs_w; i_w++ ) { for ( i_w = 0; i_w < pat_u->con_u->pgs_w; i_w++ ) {
c3_w pag_w = pat_u->con_u->mem_u[i_w].pag_w; pag_w = pat_u->con_u->mem_u[i_w].pag_w;
c3_w mug_w = pat_u->con_u->mem_u[i_w].mug_w; mug_w = pat_u->con_u->mem_u[i_w].mug_w;
c3_w mem_w[1 << u3a_page]; off_i = i_w << (u3a_page + 2);
if ( -1 == lseek(pat_u->mem_i, (i_w << (u3a_page + 2)), SEEK_SET) ) { if ( siz_i != (ret_i = c3_pread(pat_u->mem_i, mem_w, siz_i, off_i)) ) {
fprintf(stderr, "loom: patch seek: %s\r\n", strerror(errno));
return c3n;
}
if ( pag_siz_i != (ret_i = read(pat_u->mem_i, mem_w, pag_siz_i)) ) {
if ( 0 < ret_i ) { if ( 0 < ret_i ) {
fprintf(stderr, "loom: patch partial read: %zu\r\n", (size_t)ret_i); fprintf(stderr, "loom: patch partial read: %zu\r\n", (size_t)ret_i);
} }
@ -562,21 +555,10 @@ _ce_patch_write_page(u3_ce_patch* pat_u,
c3_w pgc_w, c3_w pgc_w,
c3_w* mem_w) c3_w* mem_w)
{ {
ssize_t ret_i; size_t off_i = pgc_w << (u3a_page + 2);
if ( -1 == lseek(pat_u->mem_i, pgc_w * pag_siz_i, SEEK_SET) ) { if ( 0 > c3_pwrite(pat_u->mem_i, mem_w, pag_siz_i, off_i) ) {
fprintf(stderr, "loom: patch page seek: %s\r\n", strerror(errno)); fprintf(stderr, "loom: patch write: %s\r\n", strerror(errno));
c3_assert(0);
}
if ( pag_siz_i != (ret_i = write(pat_u->mem_i, mem_w, pag_siz_i)) ) {
if ( 0 < ret_i ) {
fprintf(stderr, "loom: patch page partial write: %zu\r\n",
(size_t)ret_i);
}
else {
fprintf(stderr, "loom: patch page write: %s\r\n", strerror(errno));
}
c3_assert(0); c3_assert(0);
} }
} }
@ -753,31 +735,20 @@ _ce_image_resize(u3e_image* img_u, c3_w pgs_w)
static void static void
_ce_patch_apply(u3_ce_patch* pat_u) _ce_patch_apply(u3_ce_patch* pat_u)
{ {
ssize_t ret_i; c3_w i_w, pag_w, off_w, mem_w[pag_wiz_i];
c3_w i_w; c3_i fid_i;
size_t rof_i, wof_i, siz_i = pag_siz_i;
ssize_t ret_i;
// resize images // resize images
// //
_ce_image_resize(&u3P.nor_u, pat_u->con_u->nor_w); _ce_image_resize(&u3P.nor_u, pat_u->con_u->nor_w);
_ce_image_resize(&u3P.sou_u, pat_u->con_u->sou_w); _ce_image_resize(&u3P.sou_u, pat_u->con_u->sou_w);
// seek to begining of patch and images
//
if ( (-1 == lseek(pat_u->mem_i, 0, SEEK_SET))
|| (-1 == lseek(u3P.nor_u.fid_i, 0, SEEK_SET))
|| (-1 == lseek(u3P.sou_u.fid_i, 0, SEEK_SET)) )
{
fprintf(stderr, "loom: patch apply seek 0: %s\r\n", strerror(errno));
c3_assert(0);
}
// write patch pages into the appropriate image // write patch pages into the appropriate image
// //
for ( i_w = 0; i_w < pat_u->con_u->pgs_w; i_w++ ) { for ( i_w = 0; i_w < pat_u->con_u->pgs_w; i_w++ ) {
c3_w pag_w = pat_u->con_u->mem_u[i_w].pag_w; pag_w = pat_u->con_u->mem_u[i_w].pag_w;
c3_w mem_w[pag_wiz_i];
c3_i fid_i;
c3_w off_w;
if ( pag_w < pat_u->con_u->nor_w ) { if ( pag_w < pat_u->con_u->nor_w ) {
fid_i = u3P.nor_u.fid_i; fid_i = u3P.nor_u.fid_i;
@ -788,7 +759,10 @@ _ce_patch_apply(u3_ce_patch* pat_u)
off_w = (u3P.pag_w - (pag_w + 1)); off_w = (u3P.pag_w - (pag_w + 1));
} }
if ( pag_siz_i != (ret_i = read(pat_u->mem_i, mem_w, pag_siz_i)) ) { rof_i = (size_t)i_w << (u3a_page + 2);
wof_i = (size_t)off_w << (u3a_page + 2);
if ( siz_i != (ret_i = c3_pread(pat_u->mem_i, mem_w, siz_i, rof_i))) {
if ( 0 < ret_i ) { if ( 0 < ret_i ) {
fprintf(stderr, "loom: patch apply partial read: %zu\r\n", fprintf(stderr, "loom: patch apply partial read: %zu\r\n",
(size_t)ret_i); (size_t)ret_i);
@ -798,21 +772,10 @@ _ce_patch_apply(u3_ce_patch* pat_u)
} }
c3_assert(0); c3_assert(0);
} }
else {
if ( -1 == lseek(fid_i, (off_w << (u3a_page + 2)), SEEK_SET) ) { if ( 0 > c3_pwrite(fid_i, mem_w, siz_i, wof_i) ) {
fprintf(stderr, "loom: patch apply seek: %s\r\n", strerror(errno)); fprintf(stderr, "loom: patch apply write: %s\r\n", strerror(errno));
c3_assert(0); c3_assert(0);
}
if ( pag_siz_i != (ret_i = write(fid_i, mem_w, pag_siz_i)) ) {
if ( 0 < ret_i ) {
fprintf(stderr, "loom: patch apply partial write: %zu\r\n",
(size_t)ret_i);
}
else {
fprintf(stderr, "loom: patch apply write: %s\r\n", strerror(errno));
}
c3_assert(0);
}
} }
#if 0 #if 0
u3l_log("apply: %d, %x\n", pag_w, u3r_mug_words(mem_w, pag_wiz_i)); u3l_log("apply: %d, %x\n", pag_w, u3r_mug_words(mem_w, pag_wiz_i));
@ -827,22 +790,18 @@ _ce_image_blit(u3e_image* img_u,
c3_w* ptr_w, c3_w* ptr_w,
c3_ws stp_ws) c3_ws stp_ws)
{ {
c3_w i_w;
size_t off_i, siz_i = pag_siz_i;
ssize_t ret_i;
if ( 0 == img_u->pgs_w ) { if ( 0 == img_u->pgs_w ) {
return; return;
} }
ssize_t ret_i;
c3_w i_w;
c3_w siz_w = pag_siz_i;
if ( -1 == lseek(img_u->fid_i, 0, SEEK_SET) ) {
fprintf(stderr, "loom: image (%s) blit seek 0: %s\r\n",
img_u->nam_c, strerror(errno));
c3_assert(0);
}
for ( i_w = 0; i_w < img_u->pgs_w; i_w++ ) { for ( i_w = 0; i_w < img_u->pgs_w; i_w++ ) {
if ( siz_w != (ret_i = read(img_u->fid_i, ptr_w, siz_w)) ) { off_i = (size_t)i_w << (u3a_page + 2);
if ( siz_i != (ret_i = c3_pread(img_u->fid_i, ptr_w, siz_i, off_i)) ) {
if ( 0 < ret_i ) { if ( 0 < ret_i ) {
fprintf(stderr, "loom: image (%s) blit partial read: %zu\r\n", fprintf(stderr, "loom: image (%s) blit partial read: %zu\r\n",
img_u->nam_c, (size_t)ret_i); img_u->nam_c, (size_t)ret_i);
@ -854,7 +813,7 @@ _ce_image_blit(u3e_image* img_u,
c3_assert(0); c3_assert(0);
} }
if ( 0 != mprotect(ptr_w, siz_w, PROT_READ) ) { if ( 0 != mprotect(ptr_w, siz_i, PROT_READ) ) {
fprintf(stderr, "loom: live mprotect: %s\r\n", strerror(errno)); fprintf(stderr, "loom: live mprotect: %s\r\n", strerror(errno));
c3_assert(0); c3_assert(0);
} }
@ -876,19 +835,15 @@ _ce_image_fine(u3e_image* img_u,
c3_w* ptr_w, c3_w* ptr_w,
c3_ws stp_ws) c3_ws stp_ws)
{ {
ssize_t ret_i; c3_w i_w, mem_w, fil_w;
c3_w i_w; c3_w buf_w[pag_wiz_i];
c3_w buf_w[pag_wiz_i]; size_t off_i, siz_i = pag_siz_i;
ssize_t ret_i;
if ( -1 == lseek(img_u->fid_i, 0, SEEK_SET) ) {
fprintf(stderr, "loom: image fine seek 0: %s\r\n", strerror(errno));
c3_assert(0);
}
for ( i_w=0; i_w < img_u->pgs_w; i_w++ ) { for ( i_w=0; i_w < img_u->pgs_w; i_w++ ) {
c3_w mem_w, fil_w; off_i = (size_t)i_w << (u3a_page + 2);
if ( pag_siz_i != (ret_i = read(img_u->fid_i, buf_w, pag_siz_i)) ) { if ( siz_i != (ret_i = c3_pread(img_u->fid_i, buf_w, siz_i, off_i)) ) {
if ( 0 < ret_i ) { if ( 0 < ret_i ) {
fprintf(stderr, "loom: image (%s) fine partial read: %zu\r\n", fprintf(stderr, "loom: image (%s) fine partial read: %zu\r\n",
img_u->nam_c, (size_t)ret_i); img_u->nam_c, (size_t)ret_i);
@ -899,6 +854,7 @@ _ce_image_fine(u3e_image* img_u,
} }
c3_assert(0); c3_assert(0);
} }
mem_w = u3r_mug_words(ptr_w, pag_wiz_i); mem_w = u3r_mug_words(ptr_w, pag_wiz_i);
fil_w = u3r_mug_words(buf_w, pag_wiz_i); fil_w = u3r_mug_words(buf_w, pag_wiz_i);
@ -924,31 +880,21 @@ _ce_image_fine(u3e_image* img_u,
static c3_o static c3_o
_ce_image_copy(u3e_image* fom_u, u3e_image* tou_u) _ce_image_copy(u3e_image* fom_u, u3e_image* tou_u)
{ {
c3_w i_w;
c3_w mem_w[pag_wiz_i];
size_t off_i, siz_i = pag_siz_i;
ssize_t ret_i; ssize_t ret_i;
c3_w i_w;
// resize images // resize images
// //
_ce_image_resize(tou_u, fom_u->pgs_w); _ce_image_resize(tou_u, fom_u->pgs_w);
// seek to begining of patch and images
//
if ( (-1 == lseek(fom_u->fid_i, 0, SEEK_SET))
|| (-1 == lseek(tou_u->fid_i, 0, SEEK_SET)) )
{
fprintf(stderr, "loom: image (%s) copy seek: %s\r\n",
fom_u->nam_c,
strerror(errno));
return c3n;
}
// copy pages into destination image // copy pages into destination image
// //
for ( i_w = 0; i_w < fom_u->pgs_w; i_w++ ) { for ( i_w = 0; i_w < fom_u->pgs_w; i_w++ ) {
c3_w mem_w[pag_wiz_i]; off_i = (size_t)i_w << (u3a_page + 2);
c3_w off_w = i_w;
if ( pag_siz_i != (ret_i = read(fom_u->fid_i, mem_w, pag_siz_i)) ) { if ( siz_i != (ret_i = c3_pread(fom_u->fid_i, mem_w, siz_i, off_i)) ) {
if ( 0 < ret_i ) { if ( 0 < ret_i ) {
fprintf(stderr, "loom: image (%s) copy partial read: %zu\r\n", fprintf(stderr, "loom: image (%s) copy partial read: %zu\r\n",
fom_u->nam_c, (size_t)ret_i); fom_u->nam_c, (size_t)ret_i);
@ -959,23 +905,11 @@ _ce_image_copy(u3e_image* fom_u, u3e_image* tou_u)
} }
return c3n; return c3n;
} }
else {
if ( -1 == lseek(tou_u->fid_i, (off_w << (u3a_page + 2)), SEEK_SET) ) { if ( 0 > c3_pwrite(tou_u->fid_i, mem_w, siz_i, off_i) ) {
fprintf(stderr, "loom: image (%s) copy seek: %s\r\n", fprintf(stderr, "loom: image (%s) copy write: %s\r\n",
tou_u->nam_c, strerror(errno)); tou_u->nam_c, strerror(errno));
return c3n; return c3n;
}
if ( pag_siz_i != (ret_i = write(tou_u->fid_i, mem_w, pag_siz_i)) ) {
if ( 0 < ret_i ) {
fprintf(stderr, "loom: image (%s) copy partial write: %zu\r\n",
tou_u->nam_c, (size_t)ret_i);
}
else {
fprintf(stderr, "loom: image (%s) copy write: %s\r\n",
tou_u->nam_c, strerror(errno));
}
return c3n;
}
} }
} }

View File

@ -435,7 +435,7 @@ u3m_file(c3_c* pas_c)
{ {
struct stat buf_b; struct stat buf_b;
c3_i fid_i = c3_open(pas_c, O_RDONLY, 0644); c3_i fid_i = c3_open(pas_c, O_RDONLY, 0644);
c3_w fln_w, red_w; c3_w fln_w;
c3_y* pad_y; c3_y* pad_y;
if ( (fid_i < 0) || (fstat(fid_i, &buf_b) < 0) ) { if ( (fid_i < 0) || (fstat(fid_i, &buf_b) < 0) ) {
@ -445,10 +445,10 @@ u3m_file(c3_c* pas_c)
fln_w = buf_b.st_size; fln_w = buf_b.st_size;
pad_y = c3_malloc(buf_b.st_size); pad_y = c3_malloc(buf_b.st_size);
red_w = read(fid_i, pad_y, fln_w); ssize_t red_i = c3_pread(fid_i, pad_y, fln_w, 0);
close(fid_i); close(fid_i);
if ( fln_w != red_w ) { if ( red_i != fln_w ) {
c3_free(pad_y); c3_free(pad_y);
return u3m_bail(c3__fail); return u3m_bail(c3__fail);
} }

View File

@ -564,56 +564,14 @@ _cu_rock_save(c3_c* dir_c, c3_d eve_d, c3_d len_d, c3_y* byt_y)
// write jam-buffer into [fid_i] // write jam-buffer into [fid_i]
// //
// XX deduplicate with _write() wrapper in term.c ssize_t rit_i = c3_pwrite(fid_i, byt_y, len_d, 0);
// if ( rit_i < 0 ) {
{ fprintf(stderr, "rock: write failed: %s\r\n", strerror(errno));
ssize_t ret_i;
while ( len_d > 0 ) {
c3_w lop_w = 0;
// retry interrupt/async errors
//
do {
// abort pathological retry loop
//
if ( 100 == ++lop_w ) {
fprintf(stderr, "rock: write loop: %s\r\n", strerror(errno));
close(fid_i);
// XX unlink file?
//
return c3n;
}
ret_i = write(fid_i, byt_y, len_d);
}
while ( (ret_i < 0)
&& ( (errno == EINTR)
|| (errno == EAGAIN)
|| (errno == EWOULDBLOCK) ));
// assert on true errors
//
// NB: can't call u3l_log here or we would re-enter _write()
//
if ( ret_i < 0 ) {
fprintf(stderr, "rock: write failed %s\r\n", strerror(errno));
close(fid_i);
// XX unlink file?
//
return c3n;
}
// continue partial writes
//
else {
len_d -= ret_i;
byt_y += ret_i;
}
}
} }
close(fid_i); close(fid_i);
return c3y; return rit_i < 0 ? c3n : c3y;
} }
/* u3u_cram(): globably deduplicate memory, and write a rock to disk. /* u3u_cram(): globably deduplicate memory, and write a rock to disk.

View File

@ -1677,24 +1677,30 @@ _http_init_tls(uv_buf_t key_u, uv_buf_t cer_u)
static void static void
_http_write_ports_file(u3_httd* htd_u, c3_c *pax_c) _http_write_ports_file(u3_httd* htd_u, c3_c *pax_c)
{ {
c3_c* nam_c = ".http.ports";
c3_w len_w = 1 + strlen(pax_c) + 1 + strlen(nam_c);
c3_c* paf_c = c3_malloc(len_w);
snprintf(paf_c, len_w, "%s/%s", pax_c, nam_c);
c3_i por_i = c3_open(paf_c, O_WRONLY | O_CREAT | O_TRUNC, 0666);
c3_free(paf_c);
u3_http* htp_u = htd_u->htp_u; u3_http* htp_u = htd_u->htp_u;
u3_pier* pir_u = htd_u->car_u.pir_u; u3_pier* pir_u = htd_u->car_u.pir_u;
size_t off_i = 0;
c3_i por_i;
{
c3_c* nam_c = ".http.ports";
c3_w len_w = 1 + strlen(pax_c) + 1 + strlen(nam_c);
c3_c* paf_c = c3_malloc(len_w);
snprintf(paf_c, len_w, "%s/%s", pax_c, nam_c);
por_i = c3_open(paf_c, O_WRONLY | O_CREAT | O_TRUNC, 0666);
c3_free(paf_c);
}
c3_c temp[32];
while ( 0 != htp_u ) { while ( 0 != htp_u ) {
if ( 0 < htp_u->por_s ) { if ( 0 < htp_u->por_s ) {
u3_write_fd(por_i, temp, snprintf(temp, 32, "%u %s %s\n", htp_u->por_s, c3_c tmp_c[32];
(c3y == htp_u->sec) ? "secure" : "insecure", c3_i len_i = snprintf(tmp_c, 32, "%u %s %s\n",
(c3y == htp_u->lop) ? "loopback" : "public")); htp_u->por_s,
(c3y == htp_u->sec) ? "secure" : "insecure",
(c3y == htp_u->lop) ? "loopback" : "public");
c3_assert( 0 < len_i);
c3_assert( c3_pwrite(por_i, tmp_c, len_i, off_i) == len_i );
off_i += len_i;
} }
htp_u = htp_u->nex_u; htp_u = htp_u->nex_u;
@ -1710,13 +1716,12 @@ static void
_http_release_ports_file(c3_c *pax_c) _http_release_ports_file(c3_c *pax_c)
{ {
c3_c* nam_c = ".http.ports"; c3_c* nam_c = ".http.ports";
c3_w len_w = 1 + strlen(pax_c) + 1 + strlen(nam_c); c3_w len_w = 1 + strlen(pax_c) + 1 + strlen(nam_c);
c3_c* paf_c = c3_malloc(len_w); c3_c* paf_c = c3_malloc(len_w);
c3_i wit_i; c3_i wit_i;
wit_i = snprintf(paf_c, len_w, "%s/%s", pax_c, nam_c); wit_i = snprintf(paf_c, len_w, "%s/%s", pax_c, nam_c);
c3_assert(wit_i > 0); c3_assert( len_w == (c3_w)wit_i + 1 );
c3_assert(len_w == (c3_w)wit_i + 1);
c3_unlink(paf_c); c3_unlink(paf_c);
c3_free(paf_c); c3_free(paf_c);

View File

@ -17,48 +17,6 @@ static void _term_read_cb(uv_stream_t* tcp_u,
ssize_t siz_i, ssize_t siz_i,
const uv_buf_t* buf_u); const uv_buf_t* buf_u);
/* u3_write_fd(): retry interrupts, continue partial writes, assert errors.
*/
void
u3_write_fd(c3_i fid_i, const void* buf_v, size_t len_i)
{
ssize_t ret_i;
while ( len_i > 0 ) {
c3_w lop_w = 0;
// retry interrupt/async errors
//
do {
// abort pathological retry loop
//
if ( 100 == ++lop_w ) {
fprintf(stderr, "term: write loop: %s\r\n", strerror(errno));
return;
}
ret_i = write(fid_i, buf_v, len_i);
}
while ( (ret_i < 0)
&& ( (errno == EINTR)
|| (errno == EAGAIN)
|| (errno == EWOULDBLOCK) ));
// assert on true errors
//
// NB: can't call u3l_log here or we would re-enter u3_write_fd()
//
if ( ret_i < 0 ) {
fprintf(stderr, "term: write failed %s\r\n", strerror(errno));
c3_assert(0);
}
// continue partial writes
//
else {
len_i -= ret_i;
buf_v += ret_i;
}
}
}
/* _term_msc_out_host(): unix microseconds from current host time. /* _term_msc_out_host(): unix microseconds from current host time.
*/ */
static c3_d static c3_d
@ -255,7 +213,7 @@ u3_term_log_exit(void)
if ( c3n == uty_u->sto_f(uty_u) ) { if ( c3n == uty_u->sto_f(uty_u) ) {
c3_assert(!"exit-tcsetattr"); c3_assert(!"exit-tcsetattr");
} }
u3_write_fd(uty_u->fid_i, "\r\n", 2); c3_assert(c3_write(uty_u->fid_i, "\r\n", 2) == 2);
} }
} }
@ -864,7 +822,7 @@ _term_spin_step(u3_utty* uty_u)
c3_w i_w; c3_w i_w;
for ( i_w = bac_w; i_w < sol_w; i_w++ ) { for ( i_w = bac_w; i_w < sol_w; i_w++ ) {
if ( lef_u.len != write(fid_i, lef_u.base, lef_u.len) ) { if ( c3_write(fid_i, lef_u.base, lef_u.len) < 0 ) {
return; return;
} }
} }
@ -874,7 +832,7 @@ _term_spin_step(u3_utty* uty_u)
{ {
c3_w len_w = cur_c - buf_c; c3_w len_w = cur_c - buf_c;
if ( len_w != write(fid_i, buf_c, len_w) ) { if ( c3_write(fid_i, buf_c, len_w) < 0 ) {
return; return;
} }
} }
@ -882,7 +840,7 @@ _term_spin_step(u3_utty* uty_u)
// Cursor stays on spinner. // Cursor stays on spinner.
// //
while ( sol_w-- ) { while ( sol_w-- ) {
if ( lef_u.len != write(fid_i, lef_u.base, lef_u.len) ) { if ( c3_write(fid_i, lef_u.base, lef_u.len) < 0 ) {
return; return;
} }
} }
@ -1382,10 +1340,10 @@ u3_term_io_hija(void)
if ( c3y != uty_u->hij_f(uty_u) ) { if ( c3y != uty_u->hij_f(uty_u) ) {
c3_assert(!"hija-tcsetattr"); c3_assert(!"hija-tcsetattr");
} }
u3_write_fd(uty_u->fid_i, "\r", 1); c3_assert(c3_write(uty_u->fid_i, "\r", 1) == 1);
{ {
uv_buf_t* buf_u = &uty_u->ufo_u.out.el_u; uv_buf_t* buf_u = &uty_u->ufo_u.out.el_u;
u3_write_fd(uty_u->fid_i, buf_u->base, buf_u->len); c3_assert(c3_write(uty_u->fid_i, buf_u->base, buf_u->len) == buf_u->len);
} }
} }
} }

View File

@ -342,11 +342,11 @@ u3_unix_save(c3_c* pax_c, u3_atom pad)
pad_y = c3_malloc(fln_w); pad_y = c3_malloc(fln_w);
u3r_bytes(0, fln_w, pad_y, pad); u3r_bytes(0, fln_w, pad_y, pad);
u3z(pad); u3z(pad);
rit_w = write(fid_i, pad_y, fln_w); ssize_t rit_i = c3_pwrite(fid_i, pad_y, fln_w, 0);
close(fid_i); close(fid_i);
c3_free(pad_y); c3_free(pad_y);
if ( rit_w != fln_w ) { if ( rit_i < 0 ) {
u3l_log("%s: %s\n", ful_c, strerror(errno)); u3l_log("%s: %s\n", ful_c, strerror(errno));
c3_free(ful_c); c3_free(ful_c);
u3m_bail(c3__fail); u3m_bail(c3__fail);
@ -427,7 +427,7 @@ static c3_w
_unix_write_file_hard(c3_c* pax_c, u3_noun mim) _unix_write_file_hard(c3_c* pax_c, u3_noun mim)
{ {
c3_i fid_i = c3_open(pax_c, O_WRONLY | O_CREAT | O_TRUNC, 0666); c3_i fid_i = c3_open(pax_c, O_WRONLY | O_CREAT | O_TRUNC, 0666);
c3_w len_w, rit_w, siz_w, mug_w = 0; c3_w len_w, siz_w, mug_w = 0;
c3_y* dat_y; c3_y* dat_y;
u3_noun dat = u3t(u3t(mim)); u3_noun dat = u3t(u3t(mim));
@ -446,11 +446,10 @@ _unix_write_file_hard(c3_c* pax_c, u3_noun mim)
u3r_bytes(0, len_w, dat_y, dat); u3r_bytes(0, len_w, dat_y, dat);
u3z(mim); u3z(mim);
rit_w = write(fid_i, dat_y, siz_w); ssize_t rit_i = c3_pwrite(fid_i, dat_y, siz_w, 0);
if ( rit_w != siz_w ) { if ( rit_i < 0 ) {
u3l_log("error writing %s: %s\r\n", u3l_log("error writing %s: %s\r\n", pax_c, strerror(errno));
pax_c, strerror(errno));
mug_w = 0; mug_w = 0;
} }
else { else {
@ -470,7 +469,7 @@ _unix_write_file_soft(u3_ufil* fil_u, u3_noun mim)
{ {
struct stat buf_u; struct stat buf_u;
c3_i fid_i = c3_open(fil_u->pax_c, O_RDONLY, 0644); c3_i fid_i = c3_open(fil_u->pax_c, O_RDONLY, 0644);
c3_ws len_ws, red_ws; c3_ws len_ws;
c3_w old_w; c3_w old_w;
c3_y* old_y; c3_y* old_y;
@ -489,21 +488,21 @@ _unix_write_file_soft(u3_ufil* fil_u, u3_noun mim)
len_ws = buf_u.st_size; len_ws = buf_u.st_size;
old_y = c3_malloc(len_ws); old_y = c3_malloc(len_ws);
red_ws = read(fid_i, old_y, len_ws); ssize_t red_i = c3_pread(fid_i, old_y, len_ws, 0);
if ( close(fid_i) < 0 ) { if ( close(fid_i) < 0 ) {
u3l_log("error closing file (soft) %s: %s\r\n", u3l_log("error closing file (soft) %s: %s\r\n",
fil_u->pax_c, strerror(errno)); fil_u->pax_c, strerror(errno));
} }
if ( len_ws != red_ws ) { if ( red_i != len_ws ) {
if ( red_ws < 0 ) { if ( red_i < 0 ) {
u3l_log("error reading file (soft) %s: %s\r\n", u3l_log("error reading file (soft) %s: %s\r\n",
fil_u->pax_c, strerror(errno)); fil_u->pax_c, strerror(-red_i));
} }
else { else {
u3l_log("wrong # of bytes read in file %s: %d %d\r\n", u3l_log("wrong # of bytes read in file %s: %u %zu\r\n",
fil_u->pax_c, len_ws, red_ws); fil_u->pax_c, len_ws, red_i);
} }
c3_free(old_y); c3_free(old_y);
u3z(mim); u3z(mim);
@ -893,7 +892,7 @@ _unix_update_file(u3_unix* unx_u, u3_ufil* fil_u)
struct stat buf_u; struct stat buf_u;
c3_i fid_i = c3_open(fil_u->pax_c, O_RDONLY, 0644); c3_i fid_i = c3_open(fil_u->pax_c, O_RDONLY, 0644);
c3_ws len_ws, red_ws; c3_ws len_ws;
c3_y* dat_y; c3_y* dat_y;
if ( fid_i < 0 || fstat(fid_i, &buf_u) < 0 ) { if ( fid_i < 0 || fstat(fid_i, &buf_u) < 0 ) {
@ -910,21 +909,21 @@ _unix_update_file(u3_unix* unx_u, u3_ufil* fil_u)
len_ws = buf_u.st_size; len_ws = buf_u.st_size;
dat_y = c3_malloc(len_ws); dat_y = c3_malloc(len_ws);
red_ws = read(fid_i, dat_y, len_ws); ssize_t red_i = c3_pread(fid_i, dat_y, len_ws, 0);
if ( close(fid_i) < 0 ) { if ( close(fid_i) < 0 ) {
u3l_log("error closing file %s: %s\r\n", u3l_log("error closing file %s: %s\r\n",
fil_u->pax_c, strerror(errno)); fil_u->pax_c, strerror(errno));
} }
if ( len_ws != red_ws ) { if ( red_i != len_ws ) {
if ( red_ws < 0 ) { if ( red_i < 0 ) {
u3l_log("error reading file %s: %s\r\n", u3l_log("error reading file %s: %s\r\n",
fil_u->pax_c, strerror(errno)); fil_u->pax_c, strerror(-red_i));
} }
else { else {
u3l_log("wrong # of bytes read in file %s: %d %d\r\n", u3l_log("wrong # of bytes read in file %s: %u %zu\r\n",
fil_u->pax_c, len_ws, red_ws); fil_u->pax_c, len_ws, red_i);
} }
c3_free(dat_y); c3_free(dat_y);
return u3_nul; return u3_nul;
@ -1159,7 +1158,7 @@ _unix_initial_update_file(c3_c* pax_c, c3_c* bas_c)
{ {
struct stat buf_u; struct stat buf_u;
c3_i fid_i = c3_open(pax_c, O_RDONLY, 0644); c3_i fid_i = c3_open(pax_c, O_RDONLY, 0644);
c3_ws len_ws, red_ws; c3_ws len_ws;
c3_y* dat_y; c3_y* dat_y;
if ( fid_i < 0 || fstat(fid_i, &buf_u) < 0 ) { if ( fid_i < 0 || fstat(fid_i, &buf_u) < 0 ) {
@ -1176,21 +1175,21 @@ _unix_initial_update_file(c3_c* pax_c, c3_c* bas_c)
len_ws = buf_u.st_size; len_ws = buf_u.st_size;
dat_y = c3_malloc(len_ws); dat_y = c3_malloc(len_ws);
red_ws = read(fid_i, dat_y, len_ws); ssize_t red_i = c3_pread(fid_i, dat_y, len_ws, 0);
if ( close(fid_i) < 0 ) { if ( close(fid_i) < 0 ) {
u3l_log("error closing initial file %s: %s\r\n", u3l_log("error closing initial file %s: %s\r\n",
pax_c, strerror(errno)); pax_c, strerror(errno));
} }
if ( len_ws != red_ws ) { if ( red_i != len_ws ) {
if ( red_ws < 0 ) { if ( red_i < 0 ) {
u3l_log("error reading initial file %s: %s\r\n", u3l_log("error reading initial file %s: %s\r\n",
pax_c, strerror(errno)); pax_c, strerror(-red_i));
} }
else { else {
u3l_log("wrong # of bytes read in initial file %s: %d %d\r\n", u3l_log("wrong # of bytes read in initial file %s: %u %zu\r\n",
pax_c, len_ws, red_ws); pax_c, len_ws, red_i);
} }
c3_free(dat_y); c3_free(dat_y);
return u3_nul; return u3_nul;

View File

@ -307,7 +307,7 @@ _king_get_pace(void)
{ {
struct stat buf_u; struct stat buf_u;
c3_c* pat_c; c3_c* pat_c;
c3_w red_w, len_w; c3_w len_w;
c3_i ret_i, fid_i; c3_i ret_i, fid_i;
ret_i = asprintf(&pat_c, "%s/.bin/pace", u3_Host.dir_c); ret_i = asprintf(&pat_c, "%s/.bin/pace", u3_Host.dir_c);
@ -324,10 +324,10 @@ _king_get_pace(void)
len_w = buf_u.st_size; len_w = buf_u.st_size;
pat_c = c3_malloc(len_w + 1); pat_c = c3_malloc(len_w + 1);
red_w = read(fid_i, pat_c, len_w); ssize_t red_i = c3_pread(fid_i, pat_c, len_w, 0);
close(fid_i); close(fid_i);
if ( len_w != red_w ) { if ( red_i != len_w ) {
c3_free(pat_c); c3_free(pat_c);
u3l_log("unable to read pace file, " u3l_log("unable to read pace file, "
"falling back to default (\"live\")\n"); "falling back to default (\"live\")\n");
@ -1038,9 +1038,6 @@ _king_make_pace(c3_c* pac_c)
return 0; return 0;
} }
static c3_i
_king_write_raw(c3_i fid_i, c3_y* buf_y, size_t len_i);
/* _king_init_pace(): save pace file if not present /* _king_init_pace(): save pace file if not present
*/ */
static c3_i static c3_i
@ -1064,8 +1061,11 @@ _king_init_pace(c3_c* pac_c)
} }
} }
if ( _king_write_raw(fid_i, (c3_y*)pac_c, strlen(pac_c)) ) { size_t len_i = strlen(pac_c);
u3l_log("dock: init pace (%s): write %s\n", pac_c, strerror(errno)); ssize_t wit_i = c3_pwrite(fid_i, pac_c, len_i, 0);
if ( wit_i != len_i ) {
u3l_log("dock: init pace (%s) write failed: %s\n",
pac_c, strerror(errno));
close(fid_i); close(fid_i);
c3_free(bin_c); c3_free(bin_c);
return -1; return -1;
@ -1239,62 +1239,24 @@ _king_do_upgrade(c3_c* pac_c, c3_c* ver_c)
// XX print restart instructions // XX print restart instructions
} }
/* _king_read_raw: read (up to) [len_i] from [fid_i] to [buf_y]
*/
static ssize_t
_king_read_raw(c3_i fid_i, c3_y* buf_y, size_t len_i)
{
ssize_t ret_i;
do {
ret_i = read(fid_i, buf_y, len_i);
}
while ( (ret_i < 0) && (errno == EINTR) );
return ret_i;
}
/* _king_read_raw: write [len_i] from [buf_y] to [fid_i].
*/
static c3_i
_king_write_raw(c3_i fid_i, c3_y* buf_y, size_t len_i)
{
ssize_t ret_i;
while ( len_i ) {
do {
ret_i = write(fid_i, buf_y, len_i);
}
while ( (ret_i < 0) && (errno == EINTR) );
if ( ret_i < 0 ) {
return -1;
}
else {
len_i -= ret_i;
buf_y += ret_i;
}
}
return 0;
}
static c3_i static c3_i
_king_copy_raw(c3_i src_i, c3_i dst_i, c3_y* buf_y, size_t pag_i) _king_copy_raw(c3_i src_i, c3_i dst_i, c3_y* buf_y, size_t pag_i)
{ {
ssize_t red_i; size_t off_i = 0;
ssize_t ret_i;
do { do {
if ( 0 > (red_i = _king_read_raw(src_i, buf_y, pag_i)) ) { if ( 0 > (ret_i = c3_pread(src_i, buf_y, pag_i, off_i)) ) {
return -1; return ret_i;
} }
if ( _king_write_raw(dst_i, buf_y, (size_t)red_i) ) { if ( 0 > (ret_i = c3_pwrite(dst_i, buf_y, (size_t)ret_i, off_i)) ) {
return -1; return ret_i;
} }
off_i += (size_t)ret_i;
} }
while ( red_i ); while ( ret_i );
return 0; return 0;
} }
@ -1337,6 +1299,8 @@ _king_copy_file(c3_c* src_c, c3_c* dst_c)
goto done1; goto done1;
} }
// XX O_TRUNC?
//
if ( -1 == (dst_i = open(dst_c, O_RDWR | O_CREAT, 0755)) ) { if ( -1 == (dst_i = open(dst_c, O_RDWR | O_CREAT, 0755)) ) {
err_i = errno; err_i = errno;
ret_i = -1; ret_i = -1;
@ -1403,8 +1367,12 @@ _king_copy_file(c3_c* src_c, c3_c* dst_c)
{ {
size_t pag_i = 1 << 14;; size_t pag_i = 1 << 14;;
c3_y* buf_y = c3_malloc(pag_i); c3_y* buf_y = c3_malloc(pag_i);
ret_i = _king_copy_raw(src_i, dst_i, buf_y, pag_i);
err_i = errno; if ( 0 > (ret_i = _king_copy_raw(src_i, dst_i, buf_y, pag_i)) ) {
err_i = errno;
ret_i = -1;
}
c3_free(buf_y); c3_free(buf_y);
} }

View File

@ -1051,7 +1051,7 @@ _lord_on_serf_err_cb(uv_stream_t* pyp_u,
// serf used to write to 2 directly // serf used to write to 2 directly
// this can't be any worse than that // this can't be any worse than that
// //
u3_write_fd(2, buf_u->base, siz_i); c3_assert(c3_write(STDERR_FILENO, buf_u->base, siz_i) == siz_i);
} else { } else {
uv_read_stop(pyp_u); uv_read_stop(pyp_u);