From 9eaf33656e0cad096355f1f89b94d4dc99345400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kochma=C5=84ski?= Date: Fri, 6 Jan 2017 18:53:03 +0100 Subject: [PATCH] simplify readlink code Fixes #341. --- src/c/unixfsys.d | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/c/unixfsys.d b/src/c/unixfsys.d index ced76ea6f..52edbc4ee 100644 --- a/src/c/unixfsys.d +++ b/src/c/unixfsys.d @@ -150,7 +150,7 @@ current_dir(void) { cl_index size = 128; do { - output = ecl_alloc_adjustable_base_string(size); + output = ecl_alloc_adjustable_base_string(size+2); ecl_disable_interrupts(); ok = getcwd((char*)output->base_string.self, size); if (ok == NULL && errno != ERANGE) { @@ -161,20 +161,14 @@ current_dir(void) { size += 256; } while (ok == NULL); size = strlen((char*)output->base_string.self); - if ((size + 2) >= output->base_string.dim) { - /* Too small to host the trailing '/' and '\0' */ - cl_object other = ecl_alloc_adjustable_base_string(size+2); - strcpy((char*)other->base_string.self, (char*)output->base_string.self); - output = other; - } #ifdef _MSC_VER - for (c = output->base_string.self; *c; c++) - if (*c == '\\') - *c = '/'; + for (c = output->base_string.self; *c; c++) { + if (*c == '\\') *c = '/'; + } #endif if (output->base_string.self[size-1] != '/') { output->base_string.self[size++] = '/'; - output->base_string.self[size] = 0; + output->base_string.self[size] = '\0'; } output->base_string.fillp = size; return output; @@ -234,19 +228,14 @@ si_readlink(cl_object filename) { cl_index size = 128, written; cl_object output, kind; do { - output = ecl_alloc_adjustable_base_string(size); + /* We reserve 2 characters for trailing '/' and '\0' */ + output = ecl_alloc_adjustable_base_string(size+2); ecl_disable_interrupts(); written = readlink((char*)filename->base_string.self, (char*)output->base_string.self, size); ecl_enable_interrupts(); size += 256; } while (written == size-256); - if ((written + 2) > (cl_index)(output->base_string.self)) { - /* Too small to host the trailing '/' and '\0' */ - cl_object other = ecl_alloc_adjustable_base_string(written+2); - strcpy((char*)other->base_string.self, (char*)output->base_string.self); - output = other; - } output->base_string.self[written] = '\0'; kind = file_kind((char*)output->base_string.self, FALSE); if (kind == @':directory') {