Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Alexander_Naumov:SLE-12:Update
w3m.27349
0001-handle-EXDEV-during-history-file-rename.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0001-handle-EXDEV-during-history-file-rename.patch of Package w3m.27349
From 93ed62a6cb58b4c90872e28b1306e122ad7668b7 Mon Sep 17 00:00:00 2001 From: Thomas Blume <Thomas.Blume@suse.com> Date: Thu, 24 Nov 2016 14:38:32 +0100 Subject: [PATCH] handle EXDEV during history file rename port of: w3m-history-crossdev.patch --- history.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/history.c b/history.c index 471059e..209385b 100644 --- a/history.c +++ b/history.c @@ -68,12 +68,14 @@ loadHistory(Hist *hist) void saveHistory(Hist *hist, size_t size) { - FILE *f; + FILE *f, *h = NULL; HistItem *item; char *tmpf; int rename_ret; #define FNAMELEN 255 char fname[FNAMELEN+1] = HISTORY_FILE; + char buf[4096]; + size_t rs, ws, remaining; if (hist == NULL || hist->list == NULL) return; @@ -99,7 +101,30 @@ saveHistory(Hist *hist, size_t size) strncat(fname, Session, FNAMELEN -6 - strlen(fname)); } rename_ret = rename(tmpf, rcFile(fname)); - if (rename_ret != 0) { + + if (rename_ret == -1 && errno == EXDEV) { + if ((f = fopen(tmpf, "r")) && (h = fopen(rcFile(fname), "w"))) { + while (1) { + rs = fread(buf, 1, sizeof(buf), f); + if (rs == 0 || rs > sizeof(buf)) + break; + ws = fwrite(buf, 1, rs, h); + if (ws == rs) + continue; + if (ws == 0 || ws > rs) + break; + remaining = rs - ws; + while (remaining > 0) { + ws = fwrite(buf + (rs - remaining), 1, remaining, h); + if (ws == 0 || ws > remaining) + break; + remaining -= ws; + } + } + } + if (f) fclose(f); + if (h) fclose(h); + } else if (rename_ret != 0) { disp_err_message("Can't save history", FALSE); return; } -- 2.6.6
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor