MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

recursive mkdir support

+58 -15
+58 -15
src/modules/fs.c
··· 1077 1077 complete_request(req); 1078 1078 } 1079 1079 1080 + static int mkdirp(const char *path, mode_t mode) { 1081 + int result = -1; 1082 + char *tmp = strdup(path); 1083 + if (!tmp) goto done; 1084 + 1085 + size_t len = strlen(tmp); 1086 + if (len > 0 && tmp[len - 1] == '/') tmp[len - 1] = '\0'; 1087 + 1088 + for (char *p = tmp + 1; *p; p++) { 1089 + if (*p != '/') continue; 1090 + *p = '\0'; 1091 + #ifdef _WIN32 1092 + _mkdir(tmp); 1093 + #else 1094 + mkdir(tmp, mode); 1095 + #endif 1096 + *p = '/'; 1097 + } 1098 + 1099 + #ifdef _WIN32 1100 + result = _mkdir(tmp); 1101 + #else 1102 + result = mkdir(tmp, mode); 1103 + #endif 1104 + if (result != 0 && errno == EEXIST) result = 0; 1105 + 1106 + free(tmp); 1107 + done: 1108 + return result; 1109 + } 1110 + 1080 1111 static void on_mkdir_complete(uv_fs_t *uv_req) { 1081 1112 fs_request_t *req = (fs_request_t *)uv_req->data; 1082 1113 ··· 1733 1764 char *path_cstr = strndup(path, path_len); 1734 1765 if (!path_cstr) return js_mkerr(js, "Out of memory"); 1735 1766 1767 + int result; 1768 + if (recursive) { 1769 + result = mkdirp(path_cstr, (mode_t)mode); 1770 + } else { 1736 1771 #ifdef _WIN32 1737 - (void)mode; 1738 - int result = _mkdir(path_cstr); 1772 + (void)mode; 1773 + result = _mkdir(path_cstr); 1739 1774 #else 1740 - int result = mkdir(path_cstr, (mode_t)mode); 1775 + result = mkdir(path_cstr, (mode_t)mode); 1741 1776 #endif 1777 + } 1742 1778 free(path_cstr); 1743 1779 1744 1780 if (result != 0) { 1745 - if (recursive && errno == EEXIST) { 1746 - return js_mkundef(); 1747 - } 1748 1781 char err_msg[256]; 1749 1782 snprintf(err_msg, sizeof(err_msg), "Failed to create directory: %s", strerror(errno)); 1750 1783 return js_mkerr(js, "%s", err_msg); ··· 1779 1812 } 1780 1813 } 1781 1814 1815 + if (recursive) { 1816 + ant_value_t promise = js_mkpromise(js); 1817 + char *path_cstr = strndup(path, path_len); 1818 + 1819 + if (!path_cstr) return js_mkerr(js, "Out of memory"); 1820 + int result = mkdirp(path_cstr, (mode_t)mode); 1821 + 1822 + free(path_cstr); 1823 + if (result != 0) { 1824 + js_reject_promise(js, promise, js_mkerr(js, "Failed to create directory: %s", strerror(errno))); 1825 + } else js_resolve_promise(js, promise, js_mkundef()); 1826 + 1827 + return promise; 1828 + } 1829 + 1782 1830 fs_request_t *req = calloc(1, sizeof(fs_request_t)); 1783 1831 if (!req) return js_mkerr(js, "Out of memory"); 1784 - 1832 + 1785 1833 req->js = js; 1786 1834 req->op_type = FS_OP_MKDIR; 1787 1835 req->promise = js_mkpromise(js); ··· 1793 1841 int result = uv_fs_mkdir(uv_default_loop(), &req->uv_req, req->path, mode, on_mkdir_complete); 1794 1842 1795 1843 if (result < 0) { 1796 - if (recursive && result == UV_EEXIST) { 1797 - req->completed = 1; 1798 - complete_request(req); 1799 - } else { 1800 - fs_request_fail(req, result); 1801 - req->completed = 1; 1802 - complete_request(req); 1803 - } 1844 + fs_request_fail(req, result); 1845 + req->completed = 1; 1846 + complete_request(req); 1804 1847 } 1805 1848 1806 1849 return req->promise;