- {
- int len = 0, offset = 0;
- char *result = NULL;
- const char *start;
-
- if(!file_split)
- {
- DSOerr(DSO_F_WIN32_JOINER,
- ERR_R_PASSED_NULL_PARAMETER);
- return(NULL);
- }
- if(file_split->node)
- {
- len += 2 + file_split->nodelen; /* 2 for starting \\ */
- if(file_split->predir || file_split->dir || file_split->file)
- len++; /* 1 for ending \ */
- }
- else if(file_split->device)
- {
- len += file_split->devicelen + 1; /* 1 for ending : */
- }
- len += file_split->predirlen;
- if(file_split->predir && (file_split->dir || file_split->file))
- {
- len++; /* 1 for ending \ */
- }
- len += file_split->dirlen;
- if(file_split->dir && file_split->file)
- {
- len++; /* 1 for ending \ */
- }
- len += file_split->filelen;
-
- if(!len)
- {
- DSOerr(DSO_F_WIN32_JOINER, DSO_R_EMPTY_FILE_STRUCTURE);
- return(NULL);
- }
-
- result = OPENSSL_malloc(len + 1);
- if (!result)
- {
- DSOerr(DSO_F_WIN32_JOINER,
- ERR_R_MALLOC_FAILURE);
- return(NULL);
- }
-
- if(file_split->node)
- {
- strcpy(&result[offset], "\\\\"); offset += 2;
- strncpy(&result[offset], file_split->node,
- file_split->nodelen); offset += file_split->nodelen;
- if(file_split->predir || file_split->dir || file_split->file)
- {
- result[offset] = '\\'; offset++;
- }
- }
- else if(file_split->device)
- {
- strncpy(&result[offset], file_split->device,
- file_split->devicelen); offset += file_split->devicelen;
- result[offset] = ':'; offset++;
- }
- start = file_split->predir;
- while(file_split->predirlen > (start - file_split->predir))
- {
- const char *end = openssl_strnchr(start, '/',
- file_split->predirlen - (start - file_split->predir));
- if(!end)
- end = start
- + file_split->predirlen
- - (start - file_split->predir);
- strncpy(&result[offset], start,
- end - start); offset += end - start;
- result[offset] = '\\'; offset++;
- start = end + 1;
- }
-#if 0 /* Not needed, since the directory converter above already appeneded
- a backslash */
- if(file_split->predir && (file_split->dir || file_split->file))
- {
- result[offset] = '\\'; offset++;
- }
-#endif
- start = file_split->dir;
- while(file_split->dirlen > (start - file_split->dir))
- {
- const char *end = openssl_strnchr(start, '/',
- file_split->dirlen - (start - file_split->dir));
- if(!end)
- end = start
- + file_split->dirlen
- - (start - file_split->dir);
- strncpy(&result[offset], start,
- end - start); offset += end - start;
- result[offset] = '\\'; offset++;
- start = end + 1;
- }
-#if 0 /* Not needed, since the directory converter above already appeneded
- a backslash */
- if(file_split->dir && file_split->file)
- {
- result[offset] = '\\'; offset++;
- }
-#endif
- strncpy(&result[offset], file_split->file,
- file_split->filelen); offset += file_split->filelen;
- result[offset] = '\0';
- return(result);
- }
-
-static char *win32_merger(DSO *dso, const char *filespec1, const char *filespec2)
- {
- char *merged = NULL;
- struct file_st *filespec1_split = NULL;
- struct file_st *filespec2_split = NULL;
-
- if(!filespec1 && !filespec2)
- {
- DSOerr(DSO_F_WIN32_MERGER,
- ERR_R_PASSED_NULL_PARAMETER);
- return(NULL);
- }
- if (!filespec2)
- {
- merged = OPENSSL_malloc(strlen(filespec1) + 1);
- if(!merged)
- {
- DSOerr(DSO_F_WIN32_MERGER,
- ERR_R_MALLOC_FAILURE);
- return(NULL);
- }
- strcpy(merged, filespec1);
- }
- else if (!filespec1)
- {
- merged = OPENSSL_malloc(strlen(filespec2) + 1);
- if(!merged)
- {
- DSOerr(DSO_F_WIN32_MERGER,
- ERR_R_MALLOC_FAILURE);
- return(NULL);
- }
- strcpy(merged, filespec2);
- }
- else
- {
- filespec1_split = win32_splitter(dso, filespec1, 1);
- if (!filespec1_split)
- {
- DSOerr(DSO_F_WIN32_MERGER,
- ERR_R_MALLOC_FAILURE);
- return(NULL);
- }
- filespec2_split = win32_splitter(dso, filespec2, 0);
- if (!filespec2_split)
- {
- DSOerr(DSO_F_WIN32_MERGER,
- ERR_R_MALLOC_FAILURE);
- OPENSSL_free(filespec1_split);
- return(NULL);
- }
-
- /* Fill in into filespec1_split */
- if (!filespec1_split->node && !filespec1_split->device)
- {
- filespec1_split->node = filespec2_split->node;
- filespec1_split->nodelen = filespec2_split->nodelen;
- filespec1_split->device = filespec2_split->device;
- filespec1_split->devicelen = filespec2_split->devicelen;
- }
- if (!filespec1_split->dir)
- {
- filespec1_split->dir = filespec2_split->dir;
- filespec1_split->dirlen = filespec2_split->dirlen;
- }
- else if (filespec1_split->dir[0] != '\\'
- && filespec1_split->dir[0] != '/')
- {
- filespec1_split->predir = filespec2_split->dir;
- filespec1_split->predirlen = filespec2_split->dirlen;
- }
- if (!filespec1_split->file)
- {
- filespec1_split->file = filespec2_split->file;
- filespec1_split->filelen = filespec2_split->filelen;
- }
-
- merged = win32_joiner(dso, filespec1_split);
- }
- return(merged);
- }
+{
+ int len = 0, offset = 0;
+ char *result = NULL;
+ const char *start;
+
+ if (!file_split) {
+ DSOerr(DSO_F_WIN32_JOINER, ERR_R_PASSED_NULL_PARAMETER);
+ return NULL;
+ }
+ if (file_split->node) {
+ len += 2 + file_split->nodelen; /* 2 for starting \\ */
+ if (file_split->predir || file_split->dir || file_split->file)
+ len++; /* 1 for ending \ */
+ } else if (file_split->device) {
+ len += file_split->devicelen + 1; /* 1 for ending : */
+ }
+ len += file_split->predirlen;
+ if (file_split->predir && (file_split->dir || file_split->file)) {
+ len++; /* 1 for ending \ */
+ }
+ len += file_split->dirlen;
+ if (file_split->dir && file_split->file) {
+ len++; /* 1 for ending \ */
+ }
+ len += file_split->filelen;
+
+ if (!len) {
+ DSOerr(DSO_F_WIN32_JOINER, DSO_R_EMPTY_FILE_STRUCTURE);
+ return NULL;
+ }
+
+ result = OPENSSL_malloc(len + 1);
+ if (result == NULL) {
+ DSOerr(DSO_F_WIN32_JOINER, ERR_R_MALLOC_FAILURE);
+ return NULL;
+ }
+
+ if (file_split->node) {
+ strcpy(&result[offset], "\\\\");
+ offset += 2;
+ strncpy(&result[offset], file_split->node, file_split->nodelen);
+ offset += file_split->nodelen;
+ if (file_split->predir || file_split->dir || file_split->file) {
+ result[offset] = '\\';
+ offset++;
+ }
+ } else if (file_split->device) {
+ strncpy(&result[offset], file_split->device, file_split->devicelen);
+ offset += file_split->devicelen;
+ result[offset] = ':';
+ offset++;
+ }
+ start = file_split->predir;
+ while (file_split->predirlen > (start - file_split->predir)) {
+ const char *end = openssl_strnchr(start, '/',
+ file_split->predirlen - (start -
+ file_split->predir));
+ if (!end)
+ end = start
+ + file_split->predirlen - (start - file_split->predir);
+ strncpy(&result[offset], start, end - start);
+ offset += (int)(end - start);
+ result[offset] = '\\';
+ offset++;
+ start = end + 1;
+ }
+ start = file_split->dir;
+ while (file_split->dirlen > (start - file_split->dir)) {
+ const char *end = openssl_strnchr(start, '/',
+ file_split->dirlen - (start -
+ file_split->dir));
+ if (!end)
+ end = start + file_split->dirlen - (start - file_split->dir);
+ strncpy(&result[offset], start, end - start);
+ offset += (int)(end - start);
+ result[offset] = '\\';
+ offset++;
+ start = end + 1;
+ }
+ strncpy(&result[offset], file_split->file, file_split->filelen);
+ offset += file_split->filelen;
+ result[offset] = '\0';
+ return result;
+}
+
+static char *win32_merger(DSO *dso, const char *filespec1,
+ const char *filespec2)
+{
+ char *merged = NULL;
+ struct file_st *filespec1_split = NULL;
+ struct file_st *filespec2_split = NULL;
+
+ if (!filespec1 && !filespec2) {
+ DSOerr(DSO_F_WIN32_MERGER, ERR_R_PASSED_NULL_PARAMETER);
+ return NULL;
+ }
+ if (!filespec2) {
+ merged = OPENSSL_strdup(filespec1);
+ if (merged == NULL) {
+ DSOerr(DSO_F_WIN32_MERGER, ERR_R_MALLOC_FAILURE);
+ return NULL;
+ }
+ } else if (!filespec1) {
+ merged = OPENSSL_strdup(filespec2);
+ if (merged == NULL) {
+ DSOerr(DSO_F_WIN32_MERGER, ERR_R_MALLOC_FAILURE);
+ return NULL;
+ }
+ } else {
+ filespec1_split = win32_splitter(dso, filespec1, 0);
+ if (!filespec1_split) {
+ DSOerr(DSO_F_WIN32_MERGER, ERR_R_MALLOC_FAILURE);
+ return NULL;
+ }
+ filespec2_split = win32_splitter(dso, filespec2, 1);
+ if (!filespec2_split) {
+ DSOerr(DSO_F_WIN32_MERGER, ERR_R_MALLOC_FAILURE);
+ OPENSSL_free(filespec1_split);
+ return NULL;
+ }
+
+ /* Fill in into filespec1_split */
+ if (!filespec1_split->node && !filespec1_split->device) {
+ filespec1_split->node = filespec2_split->node;
+ filespec1_split->nodelen = filespec2_split->nodelen;
+ filespec1_split->device = filespec2_split->device;
+ filespec1_split->devicelen = filespec2_split->devicelen;
+ }
+ if (!filespec1_split->dir) {
+ filespec1_split->dir = filespec2_split->dir;
+ filespec1_split->dirlen = filespec2_split->dirlen;
+ } else if (filespec1_split->dir[0] != '\\'
+ && filespec1_split->dir[0] != '/') {
+ filespec1_split->predir = filespec2_split->dir;
+ filespec1_split->predirlen = filespec2_split->dirlen;
+ }
+ if (!filespec1_split->file) {
+ filespec1_split->file = filespec2_split->file;
+ filespec1_split->filelen = filespec2_split->filelen;
+ }
+
+ merged = win32_joiner(dso, filespec1_split);
+ }
+ OPENSSL_free(filespec1_split);
+ OPENSSL_free(filespec2_split);
+ return merged;
+}