Hello, I've run into a few rough edges with installmgr; I have patches for one of them.
First, when built with musl the "enable? [no]" prompt doesn't show up until after you type in the response. This is because stdio can buffer writes indefinately until fflush() is called (the relevant standards explicitly state this); the solution is to call fflush() before reading the response. Second, when sword.conf points to a read-only directory (for example, when SWORD is installed systemwide with default /etc/sword.conf, and the user has not yet set DataPath in ~/.sword/sword.conf), installmgr fails to install the module but reports success. I have not tested whether this happens on other *nix-like systems recently, though I seem to recall seeing it on Debian in the past. This _may_ be because installMgr::installModule() calls fileMgr::copyFile() without checking the result. I've tried patching this, but the patch I have so far (installModule.diff) breaks installmgr for reasons I'm not sure of. The third point is a feature request: would it be possible for installmgr -init to check if DataPath is writeable, and if not to add something along the lines of --- [INSTALL] DataPath=~/.sword --- to sword.conf? Where I write ~/.sword, I mean the user directory where sword.conf lives. The second and third points seem to cause a bit of confusion for new users. Thank you and God bless, Isaac Dunham
diff --git a/utilities/installmgr.cpp b/utilities/installmgr.cpp index b705c25..132314a 100644 --- a/utilities/installmgr.cpp +++ b/utilities/installmgr.cpp @@ -73,6 +73,7 @@ virtual bool isUserDisclaimerConfirmed() const { cout << "If you understand this and are willing to enable remote source features\n"; cout << "then type yes at the prompt\n\n"; cout << "enable? [no] "; + fflush(stdout); char prompt[10]; fgets(prompt, 9, stdin);
commit de8c90df1c8b2d8b7aab99444d20c5cdc5aee693 Author: Isaac Dunham <ibid...@gmail.com> Date: Thu Jul 17 14:29:00 2014 -0700 Try to make installmgr realize when it can't write somewhere diff --git a/src/mgr/installmgr.cpp b/src/mgr/installmgr.cpp index 1e83db5..1045e6e 100644 --- a/src/mgr/installmgr.cpp +++ b/src/mgr/installmgr.cpp @@ -401,6 +401,7 @@ int InstallMgr::installModule(SWMgr *destMgr, const char *fromLocation, const ch SWBuf buffer; bool aborted = false; bool cipher = false; + int badcopy = 0; DIR *dir; struct dirent *ent; SWBuf modFile; @@ -456,7 +457,7 @@ int InstallMgr::installModule(SWMgr *destMgr, const char *fromLocation, const ch removeTrailingSlash(dest); dest += '/'; dest += fileBegin->second.c_str(); - FileMgr::copyFile(sourcePath.c_str(), dest.c_str()); + badcopy = FileMgr::copyFile(sourcePath.c_str(), dest.c_str()); fileBegin++; } @@ -526,7 +527,7 @@ int InstallMgr::installModule(SWMgr *destMgr, const char *fromLocation, const ch removeTrailingSlash(targetFile); targetFile += "/"; targetFile += ent->d_name; - FileMgr::copyFile(modFile.c_str(), targetFile.c_str()); + badcopy = FileMgr::copyFile(modFile.c_str(), targetFile.c_str()); if (cipher) { if (getCipherCode(modName, config)) { SWMgr newDest(destMgr->prefixPath); @@ -535,7 +536,7 @@ int InstallMgr::installModule(SWMgr *destMgr, const char *fromLocation, const ch } else { config->Save(); - FileMgr::copyFile(modFile.c_str(), targetFile.c_str()); + badcopy = FileMgr::copyFile(modFile.c_str(), targetFile.c_str()); } } } @@ -545,7 +546,7 @@ int InstallMgr::installModule(SWMgr *destMgr, const char *fromLocation, const ch closedir(dir); } } - return (aborted) ? -1 : 0; + return (aborted) ? -1 : badcopy; } return 1; }
_______________________________________________ sword-devel mailing list: sword-devel@crosswire.org http://www.crosswire.org/mailman/listinfo/sword-devel Instructions to unsubscribe/change your settings at above page