summaryrefslogtreecommitdiff
path: root/src/cmsio0.c
diff options
context:
space:
mode:
authorMarti Maria <marti.maria@littlecms.com>2022-05-04 20:18:14 +0200
committerMarti Maria <marti.maria@littlecms.com>2022-05-04 20:18:14 +0200
commit6ae2e99a3535417ca5c95b602eb61fdd29d294d0 (patch)
treec73064b9a4695740621c9656c433b0ca2691c96c /src/cmsio0.c
parent8c774ee671adeabb2f1b8d37389748d72e202549 (diff)
downloadlcms2-6ae2e99a3535417ca5c95b602eb61fdd29d294d0.tar.gz
Take PR#121 into account
PR#121 that I just miss out for a long, long time. cmsOpenProfileFormFile now accepts "e" as a modifier for close on exec functionality. Is up to the caller to provide or not the option. Documentation will be updated ASAP.
Diffstat (limited to 'src/cmsio0.c')
-rw-r--r--src/cmsio0.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/src/cmsio0.c b/src/cmsio0.c
index 9d1dd6a..2c24d11 100644
--- a/src/cmsio0.c
+++ b/src/cmsio0.c
@@ -374,18 +374,52 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha
{
cmsIOHANDLER* iohandler = NULL;
FILE* fm = NULL;
- cmsInt32Number fileLen;
+ cmsInt32Number fileLen;
+ char mode[4] = { 0,0,0,0 };
_cmsAssert(FileName != NULL);
_cmsAssert(AccessMode != NULL);
iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
if (iohandler == NULL) return NULL;
+
+ // Validate access mode
+ while (*AccessMode) {
- switch (*AccessMode) {
+ switch (*AccessMode)
+ {
+ case 'r':
+ case 'w':
+
+ if (mode[0] == 0) {
+ mode[0] = *AccessMode;
+ mode[1] = 'b';
+ }
+ else {
+ _cmsFree(ContextID, iohandler);
+ cmsSignalError(ContextID, cmsERROR_FILE, "Access mode already specified '%c'", *AccessMode);
+ return NULL;
+ }
+ break;
+
+ // Close on exec. Not all runtime supports that. Up to the caller to decide.
+ case 'e':
+ mode[2] = 'e';
+ break;
+
+ default:
+ _cmsFree(ContextID, iohandler);
+ cmsSignalError(ContextID, cmsERROR_FILE, "Wrong access mode '%c'", *AccessMode);
+ return NULL;
+ }
+
+ AccessMode++;
+ }
+
+ switch (mode[0]) {
case 'r':
- fm = fopen(FileName, "rb");
+ fm = fopen(FileName, mode);
if (fm == NULL) {
_cmsFree(ContextID, iohandler);
cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' not found", FileName);
@@ -399,12 +433,11 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha
cmsSignalError(ContextID, cmsERROR_FILE, "Cannot get size of file '%s'", FileName);
return NULL;
}
-
iohandler -> ReportedSize = (cmsUInt32Number) fileLen;
break;
case 'w':
- fm = fopen(FileName, "wb");
+ fm = fopen(FileName, mode);
if (fm == NULL) {
_cmsFree(ContextID, iohandler);
cmsSignalError(ContextID, cmsERROR_FILE, "Couldn't create '%s'", FileName);
@@ -414,8 +447,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha
break;
default:
- _cmsFree(ContextID, iohandler);
- cmsSignalError(ContextID, cmsERROR_FILE, "Unknown access mode '%c'", *AccessMode);
+ _cmsFree(ContextID, iohandler); // Would never reach
return NULL;
}