/*-------------------------------------------------------------*/ /*************************************************************** * Under Windows, '/' and '\' are recognized as directory * * separator. However, under Unix, only '/' is valid. * * So, if you want your code to be portable, use '/'. * ***************************************************************/ /*-------------------------------------------------------------*/ /* Name : netwib_path_canon Description : Clean a filename ("//"->"/", "/./"->"/", "/aa/../"->"/", etc.). Input parameter(s) : pathname : filename (ex : "/tmp/dir/..//./file") Input/output parameter(s) : Output parameter(s) : *pcanonizedpathname : cleaned filename (ex : "/tmp/file") Normal return values : NETWIB_ERR_OK : ok Examples of canonical paths : ./file ./dir ./dir/file ./dir/dir /file /dir /dir/file /dir/dir ../file ../dir ../dir/file ../dir/dir / . c:./file c:./dir c:./dir/file c:./dir/dir c:/file c:/dir c:/dir/file c:/dir/dir c:../file c:../dir c:../dir/file c:../dir/dir c:/ c:. \\s\sh\file \\s\sh\dir \\s\sh\dir/file \\s\sh\dir/dir \\s\sh\ */ netwib_err netwib_path_canon(netwib_constbuf *pathname, netwib_buf *pcanonizedpathname); /*-------------------------------------------------------------*/ /*************************************************************** * User should canonize paths before using them. Indeed, netwib* * functions do not do it internally, and suppose the given * * path is canonized. * * Note : functions might work but it's not sure. For example, * * opening file "/dir/../dir2/file" can be rejected by the * * underlying system. * ***************************************************************/ /*-------------------------------------------------------------*/ /* Name : netwib_path_check Description : Check is a path is of given type Input parameter(s) : *pathname : pathname type : type to check against Input/output parameter(s) : Output parameter(s) : *pyes : NETWIB_TRUE is true Normal return values : NETWIB_ERR_OK : ok */ typedef enum { NETWIB_PATH_CHECKTYPE_ABSOLUTE = 1, /* see below */ NETWIB_PATH_CHECKTYPE_RELATIVE, /* see below */ NETWIB_PATH_CHECKTYPE_ROOT, /* see below */ NETWIB_PATH_CHECKTYPE_START /* see below */ } netwib_path_checktype; /* Examples for ABSOLUTE, RELATIVE, ROOT, START : pathname absolute relative root start ./file 0 1 0 0 /file 1 0 0 0 ../file 0 1 0 0 / 1 0 1 1 . 0 1 0 1 c:./file 0 0 0 0 c:/file 1 0 0 0 c:../file 0 0 0 0 c:/ 1 0 1 1 c:. 0 0 0 1 \\s\sh\file 1 0 0 0 \\s\sh\ 1 0 1 1 */ netwib_err netwib_path_check(netwib_constbuf *pathname, netwib_path_checktype type, netwib_bool *pyes); #define netwib_path_check_absolute(pathname,pyes) netwib_path_check(pathname,NETWIB_PATH_CHECKTYPE_ABSOLUTE,pyes) #define netwib_path_check_relative(pathname,pyes) netwib_path_check(pathname,NETWIB_PATH_CHECKTYPE_RELATIVE,pyes) #define netwib_path_check_root(pathname,pyes) netwib_path_check(pathname,NETWIB_PATH_CHECKTYPE_ROOT,pyes) #define netwib_path_check_start(pathname,pyes) netwib_path_check(pathname,NETWIB_PATH_CHECKTYPE_START,pyes) /*-------------------------------------------------------------*/ /* Name : netwib_path_decode_xyz Description : Separate a path. Input parameter(s) : pathname : filename (ex : "/tmp/file") Input/output parameter(s) : Output parameter(s) : *proot : root (as defined in NETWIB_PATH_CHECK_ROOT) *pstart : start (as defined in NETWIB_PATH_CHECK_START) *pend : pathname=start+end *pparentdir : parent directory of pathname *plastitem : last part of a path Normal return values : NETWIB_ERR_OK : ok Examples : pathname root start end parentdir lastitem ./file Error1 . ./file . file ./d/f Error1 . ./d/f ./d f /file / / /file / file /d/f / / /d/f /d f ../file Error1 . ../file .. file ../d/f Error1 . ../d/f ../d f / / / / Error2 / . Error1 . . .. . c:./file Error1 c:. ./file c:. file c:./d/f Error1 c:. ./d/f c:./d f c:/file c:/ c:/ /file c:/ file c:/d/f c:/ c:/ /d/f c:/d f c:../file Error1 c:. ../file c:.. file c:../d/f Error1 c:. ../d/f c:../d f c:/ c:/ c:/ / Error2 / c:. Error1 c:. . c:.. . \\s\t\file \\s\t\ \\s\t\ /file \\s\t\ file \\s\t\d/f \\s\t\ \\s\t\ /d/f \\s\t\d f \\s\t\ \\s\t\ \\s\t\ / Error2 / Errors are : Error1 : NETWIB_ERR_PAPATHRELATIVE Error2 : NETWIB_ERR_PAPATHROOTDOTDOT */ typedef enum { NETWIB_PATH_DECODETYPE_ROOT = 1, NETWIB_PATH_DECODETYPE_START, NETWIB_PATH_DECODETYPE_END, NETWIB_PATH_DECODETYPE_PARENTDIR, NETWIB_PATH_DECODETYPE_LASTITEM } netwib_path_decodetype; netwib_err netwib_path_decode(netwib_constbuf *pathname, netwib_path_decodetype type, netwib_buf *pout); #define netwib_path_decode_root(pathname,pout) netwib_path_decode(pathname,NETWIB_PATH_DECODETYPE_ROOT,pout) #define netwib_path_decode_start(pathname,pout) netwib_path_decode(pathname,NETWIB_PATH_DECODETYPE_START,pout) #define netwib_path_decode_end(pathname,pout) netwib_path_decode(pathname,NETWIB_PATH_DECODETYPE_END,pout) #define netwib_path_decode_parentdir(pathname,pout) netwib_path_decode(pathname,NETWIB_PATH_DECODETYPE_PARENTDIR,pout) #define netwib_path_decode_lastitem(pathname,pout) netwib_path_decode(pathname,NETWIB_PATH_DECODETYPE_LASTITEM,pout) /*-------------------------------------------------------------*/ /* Name : netwib_path_init_xyz Description : Initialize a path. Input parameter(s) : See below Input/output parameter(s) : pout : path initialized Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ typedef enum { NETWIB_PATH_INITTYPE_CONCAT = 1, NETWIB_PATH_INITTYPE_ABS, NETWIB_PATH_INITTYPE_RELA, NETWIB_PATH_INITTYPE_RELA2, NETWIB_PATH_INITTYPE_RELB, NETWIB_PATH_INITTYPE_RELB2 } netwib_path_inittype; /* Definitions : concat : path from the beginning of dirname1 to pathname2 [dirname1]-[pathname2] X--------------------> abs : absolute path to pathname2 (pathname2 is in a file located in dirname1 directory) root [dirname1]-[pathname2] X----------------------> rela : relative path to go to pathname2 from a file in dirname1 directory (pathname2 is in a file located in dirname1 directory) [dirname1]-[pathname2] X-----------> rela2 : idem, except dircommon is pathname were dirname1 is located (dircommon is an absolute path permitting to solve cases where Error would be reported) [dircommon][dirname1]-[pathname2] X-----------> relb : relative path to go to pathname2 from a file in dirname1 directory (pathname1 and pathname2 are located in the same directory) [dirname1] [ pathname2 ] X-----> relb2 : idem, except dircommon is pathname were dirname1 and pathname2 are located (dircommon is an absolute path permitting to solve cases where Error would be reported) [dircommon][dirname1] [dircommon][ pathname2 ] X-----> Example : dirname1 pathname2 concat abs ./d1 ./d2/f2 ./d1/d2/f2 Error2 ./d1 ../d2/f2 ./d2/f2 Error2 ./d1 /d2/f2 Error1 /d2/f2 ../d1 ./d2/f2 ../d1/d2/f2 Error2 ../d1 ../d2/f2 ../d2/f2 Error2 ../d1 /d2/f2 Error1 /d2/f2 /d1 ./d2/f2 /d1/d2/f2 /d1/d2/f2 /d ../d2/f2 /d2/f2 /d2/f2 /d1 /d2/f2 Error1 /d2/f2 isroot /d2/f2 x/d2/f2 /d2/f2 Example : dirname1 pathname2 rela relb ./d1 ./d2/f2 ./d2/f2 ../d2/f2 ./d1 ../d2/f2 ../d2/f2 ../../d2/f2 ./d1 /d2/f2 Error3 Error4 ../d1 ./d2/f2 ./d2/f2 Error5 ../d1 ../d2/f2 ../d2/f2 ../d2/f2 ../d1 /d2/f2 Error3 Error4 /d1 ./d2/f2 ./d2/f2 Error4 /d1 ../d2/f2 ../d2/f2 Error4 /d1 /d2/f2 ../d2/f2 ../d2/f2 Example : common dirname1 pathname2 rela2 relb2 /d ./d1 /d2/f2 ../../d2/f2 ../../d2/f2 /d ../d1 ./d2/f2 ./d2/f2 ../d/d2/f2 /d ../d1 /d2/f2 ../d2/f2 ../d2/f2 /d /d1 ./d2/f2 ./d2/f2 ../d/d2/f2 /d /d1 ../d2/f2 ../d2/f2 ../d2/f2 The errors have the same code : NETWIB_ERR_PAPATHCANTINIT */ netwib_err netwib_path_init(netwib_constbuf *dircommon, netwib_constbuf *dirname1, netwib_constbuf *pathname2, netwib_path_inittype type, netwib_buf *pout); #define netwib_path_init_concat(dirname1,pathname2,pout) netwib_path_init(NULL,dirname1,pathname2,NETWIB_PATH_INITTYPE_CONCAT,pout) #define netwib_path_init_abs(dirname1,pathname2,pout) netwib_path_init(NULL,dirname1,pathname2,NETWIB_PATH_INITTYPE_ABS,pout) #define netwib_path_init_rela(dirname1,pathname2,pout) netwib_path_init(NULL,dirname1,pathname2,NETWIB_PATH_INITTYPE_RELA,pout) #define netwib_path_init_rela2(dircommon,dirname1,pathname2,pout) netwib_path_init(dircommon,dirname1,pathname2,NETWIB_PATH_INITTYPE_RELA2,pout) #define netwib_path_init_relb(dirname1,pathname2,pout) netwib_path_init(NULL,dirname1,pathname2,NETWIB_PATH_INITTYPE_RELB,pout) #define netwib_path_init_relb2(dircommon,dirname1,pathname2,pout) netwib_path_init(dircommon,dirname1,pathname2,NETWIB_PATH_INITTYPE_RELB2,pout)