这是一个可以用C ++编译器编译的C函数。
#include "jlss.h"#include "emalloc.h"#include <errno.h>#ifdef HAVE_UNISTD_H#include <unistd.h>#endif #include <string.h>#include "sysstat.h" typedef struct stat Stat;#ifndef lintconst char jlss_id_mkpath_c[] = "@(#)$Id: mkpath.c,v 1.13 2012/07/15 00:40:37 jleffler Exp $";#endif static int do_mkdir(const char *path, mode_t mode){ Stat st; int status = 0; if (stat(path, &st) != 0) { if (mkdir(path, mode) != 0 && errno != EEXIST) status = -1; } else if (!S_ISDIR(st.st_mode)) { errno = ENOTDIR; status = -1; } return(status);}int mkpath(const char *path, mode_t mode){ char*pp; char*sp; int status; char*copypath = STRDUP(path); status = 0; pp = copypath; while (status == 0 && (sp = strchr(pp, '/')) != 0) { if (sp != pp) { *sp = ''; status = do_mkdir(copypath, mode); *sp = '/'; } pp = sp + 1; } if (status == 0) status = do_mkdir(path, mode); FREE(copypath); return (status);}#ifdef TEST#include <stdio.h>int main(int argc, char **argv){ int i; for (i = 1; i < argc; i++) { for (int j = 0; j < 20; j++) { if (fork() == 0) { int rc = mkpath(argv[i], 0777); if (rc != 0) fprintf(stderr, "%d: failed to create (%d: %s): %sn", (int)getpid(), errno, strerror(errno), argv[i]); exit(rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE); } } int status; int fail = 0; while (wait(&status) != -1) { if (WEXITSTATUS(status) != 0) fail = 1; } if (fail == 0) printf("created: %sn", argv[i]); } return(0);}#endif
宏
STRDUP()和
FREE()是对的错误检查版本,
strdup()并
free()在中声明
emalloc.h(并在
emalloc.c和中实现
estrdup.c)。该
"sysstat.h"标头处理的是旧版本,
<sys/stat.h>可以
<sys/stat.h>在现代Unix系统上替换(但是在1990年有很多问题)。并
"jlss.h"声明
mkpath()。
v1.12(上一个)和v1.13(以上)之间的变化是对
EEXISTin
的测试
do_mkdir()。Switch指出了这一点-谢谢Switch。测试代码已经升级,并在MacBook Pro(2.3GHz Intel Core i7,运行Mac OS X10.7.4)上重现了该问题,并表明该问题已在修订版中修复(但测试只能显示存在的错误) ,从来没有他们缺席)。
(特此授权您出于归属将此代码用于任何目的。)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)