#include "apue.h" #include <errno.h> #include <limits.h> #ifdef PATH_MAX static int pathmax=PATH_MAX; #else static int pathmax=0; #endif #define SUSV3 200112L static long posix_version=0; #define PATH_MAX_GUESS 1024 char * path_alloc(int *sizep) { char *ptr; int size; if(posix_version == 0) posix_version= sysconf(_SC_VERSION); if(pathmax == 0){ errno=0; if((pathmax= pathconf("/",_PC_PATH_MAX))<0){ if(errno == 0) pathmax=PATH_MAX_GUESS; else err_sys("pathconf error for _PC_PATH_MAX"); }else{ pathmax++; } } if(posix_version < SUSV3) size=pathmax+1; else size=pathmax; if((ptr = malloc(size)) == NULL) err_sys("malloc error for pathname"); if(sizep !=NULL) *sizep=size; return ptr; }
如果在<limits.h>中定义了常量PATH_MAX,那么就没有任何;如果没有定义,则需调用pathconf。因为pathconf的返回值是基于工作目录的相对路径名的最大长度,而工作目录是其第一个参数,所以,指定根目录为第一个参数,并将得到的返回值加1作为其结果值。如果pathconf指明PATH_MAX是不确定的,那么我们只能猜测某个值。
对于PATH_MAX是否在路径名末尾包括一个null字符这一点,SUS v3之前的标准表述得不清楚。出于安全方面的考虑,如果操作系统实现遵循先前的标准版本,则需要在为路径名分配的存储数量上加1。