Mercurial > pt1.oyama
changeset 61:f1553492e8bb
ensure path of destination file exists. imported Jonathan Leffler's mkpath.
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Fri, 09 Oct 2009 11:04:36 +0900 |
parents | 181737b0533c |
children | c6a5c844c7fd |
files | driver/modules.order recpt1/Makefile recpt1/mkpath.c recpt1/mkpath.h recpt1/recpt1.c |
diffstat | 5 files changed, 70 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/driver/modules.order Sat Oct 03 13:25:13 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -kernel//home/yaz/develop/pt1/driver/pt1_drv.ko
--- a/recpt1/Makefile Sat Oct 03 13:25:13 2009 +0900 +++ b/recpt1/Makefile Fri Oct 09 11:04:36 2009 +0900 @@ -11,7 +11,7 @@ LIBS = $(PCSC_LIBS) $(B25_LIBS) -lm -lpthread LDFLAGS = -OBJS = recpt1.o decoder.o +OBJS = recpt1.o decoder.o mkpath.o DEPEND = .deps all: $(TARGET)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recpt1/mkpath.c Fri Oct 09 11:04:36 2009 +0900 @@ -0,0 +1,54 @@ +/* mkpath is originally written by Jonathan Leffler. + * see "http://stackoverflow.com/questions/675039/how-can-i-create-directory-tree-in-c-linux" for detail. + * copyright: (C) JLSS 1990-91,1997-98,2001,2005,2008 + */ + +#include <sys/stat.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +static int +do_mkdir(const char *path, mode_t mode) +{ + struct stat st; + int status = 0; + + if (stat(path, &st) != 0) { + /* Directory does not exist */ + if (mkdir(path, mode) != 0) + 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) { + /* Neither root nor double slash in path */ + *sp = '\0'; + status = do_mkdir(copypath, mode); + *sp = '/'; + } + pp = sp + 1; + } + if (status == 0) + status = do_mkdir(path, mode); + free(copypath); + return (status); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recpt1/mkpath.h Fri Oct 09 11:04:36 2009 +0900 @@ -0,0 +1,6 @@ +#ifndef _MKPATH_H_ +#define _MKPATH_H_ + +int mkpath(const char *path, mode_t mode); + +#endif
--- a/recpt1/recpt1.c Sat Oct 03 13:25:13 2009 +0900 +++ b/recpt1/recpt1.c Fri Oct 09 11:04:36 2009 +0900 @@ -13,6 +13,7 @@ #include <errno.h> #include <sys/time.h> #include <ctype.h> +#include <libgen.h> #include <netdb.h> #include <arpa/inet.h> @@ -24,6 +25,7 @@ #include "recpt1.h" #include "decoder.h" #include "version.h" +#include "mkpath.h" /* maximum write length at once */ #define SIZE_CHANK 1316 @@ -783,6 +785,13 @@ } else { if(!fileless) { + int status; + char *dir = dirname(strdup(argv[optind + 2])); + status = mkpath(dir, 0777); + if(status == -1) + perror("mkpath"); + free(dir); + wfd = open(argv[optind + 2], (O_RDWR | O_CREAT | O_TRUNC), 0666); if(wfd < 0) { fprintf(stderr, "Cannot open output file: %s\n",