目录操作:
头文件:
#include <sys/types.h>
#include <dirent.h>
1.创建目录
int mkdir(const char *path, mode_t mode);
功能:根据路径创建目录
参数:path 目录路径,mode文件夹权限
返回:返回0 表示成功, 返回 -1表示错误,并且会设置errno值
注:在创建时设置权限需要使用umask(0);取消权限掩码限制,否则只能使用系统默认属性创建
2.打开目录
DIR * opendir(const char * name);
函数说明:opendir()用来打开参数name 指定的目录, 并返回DIR*形态的目录流, 和open()类似, 接下来对目录的读取和搜索都要使用此返回值.
返回值:成功则返回DIR* 型态的目录流, 打开失败则返回NULL.
DIR结构体
struct __dirstream
{
void *__fd; /* `struct hurd_fd' pointer for descriptor. */
char *__data; /* Directory block. */
int __entry_data; /* Entry number `__data' corresponds to. */
char *__ptr; /* Current pointer into the block. */
int __entry_ptr; /* Entry number `__ptr' corresponds to. */
size_t __allocation; /* Space allocated for the block. */
size_t __size; /* Total valid data in the block. */
__libc_lock_define (, __lock) /* Mutex lock for this structure. */
};
typedef struct __dirstream DIR;
3.遍历目录
struct dirent * readdir(DIR * dir);
功能:从指定的drip目录指针中获取一次当前目录中的文件信息
参数: dir要读的目录指针
返回值:成功则返回struct dirent. 结构体指针 有错误发生或读取到目录文件尾则返回NULL
struct dirent
{
long d_ino; /* inode number 索引节点号 */
off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
unsigned short d_reclen; /* length of this d_name 文件名长 */
unsigned char d_type; /* the type of d_name 文件类型 */
char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}
d_type 定义
enum
{
DT_UNKNOWN = 0,
# define DT_UNKNOWN DT_UNKNOWN //未知文件
DT_FIFO = 1,
# define DT_FIFO DT_FIFO //FIFO有名管道文件
DT_CHR = 2,
# define DT_CHR DT_CHR //字符设备文件
DT_DIR = 4,
# define DT_DIR DT_DIR //目录文件
DT_BLK = 6,
# define DT_BLK DT_BLK //块设备文件
DT_REG = 8,
# define DT_REG DT_REG //普通文件
DT_LNK = 10,
# define DT_LNK DT_LNK //链接文件
DT_SOCK = 12,
# define DT_SOCK DT_SOCK //socket文件
DT_WHT = 14
# define DT_WHT DT_WHT //whiteout-base文件
};
4.删除目录
int remove(char * filename);
功能:删除指定路径的文件或目录
参数:文件名或目录路径
filename为要删除的文件名,可以为一目录。如果参数filename 为一文件,则调用unlink()处理;若参数filename 为目录,则调用rmdir()来处理,且该目录必须为空。
返回值:成功则返回0,失败则返回-1,错误原因存于errno
int rmdir(const char *pathname);
使用rmdir()函数时,目录必须为空,否则调用失败,函数返回-1.成功时,函数返回0.
int unlink(const char *pathname);
在使用时由于删除目录比较麻烦需要遍历挨个删除,此处可以使用system("rm -rf /dir")
5.关闭目录
int closedir(DIR * dir);
功能:关闭之前打开的dir目录
返回值:关闭成功则返回0,,失败返回-1,,错误原因存于errno
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
int hsm_osm_save_object(HSM_OBJECT_PROPERTY* pObjectProperty, unsigned char* pObjectData, unsigned int nDataLength)
{
int ret;
unsigned char name_buf[256];
FILE *pFile = NULL;
DIR *pDIR = NULL;
//mkdir
umask(0);
pDIR = opendir(PATH_ROOT);
if(NULL == pDIR)
{
ret = mkdir(PATH_ROOT,0777);
if(ret < 0)
{
LOGE("errno %d",errno);
}
}
closedir(pDIR);
pDIR = opendir(PATH_HSM);
if(NULL == pDIR)
{
ret = mkdir(PATH_HSM,0777);
if(ret < 0)
{
LOGE("errno %d",errno);
}
}
closedir(pDIR);
//
MyMemset(name_buf,0,sizeof(name_buf));
if(pObjectProperty->nObjectType == HSM_OBJECT_TYPE_private_key)
{
pDIR = opendir(PATH_PRIV_CERT);
if(NULL == pDIR)
{
ret = mkdir(PATH_PRIV_CERT,0777);
if(ret < 0)
{
LOGE("errno %d",errno);
}
}
closedir(pDIR);
MyMemcpy(name_buf,PATH_PRIV_CERT,strlen(PATH_PRIV_CERT));
}
else if(pObjectProperty->nObjectType == HSM_OBJECT_TYPE_public_key)
{
pDIR = opendir(PATH_PUB_CERT);
if(NULL == pDIR)
{
ret = mkdir(PATH_PUB_CERT,0777);
if(ret < 0)
{
LOGE("errno %d",errno);
}
}
closedir(pDIR);
MyMemcpy(name_buf,PATH_PUB_CERT,strlen(PATH_PUB_CERT));
}
else if(pObjectProperty->nObjectType == HSM_OBJECT_TYPE_cert)
{
pDIR = opendir(PATH_ROOT_CERT);
if(NULL == pDIR)
{
ret = mkdir(PATH_ROOT_CERT,0777);
if(ret < 0)
{
LOGE("errno %d",errno);
}
}
closedir(pDIR);
MyMemcpy(name_buf,PATH_ROOT_CERT,strlen(PATH_ROOT_CERT));
}
else
{
return -1;
}
//mkfile
strcat(name_buf,pObjectProperty->strLabel);
strcat(name_buf,".pem.");
strcat(name_buf,pObjectProperty->strID);
LOGD("%s",name_buf);
pFile = fopen(name_buf,"w+");
if(NULL == pFile)
{
LOGE("fopen failed,errno = %#x",errno);
return -1;
}
int fd = fileno(pFile );
fchmod(fd ,0777);
ret = fwrite((void *)pObjectData,1,nDataLength,pFile);
if(ret != nDataLength)
{
LOGE("fwrite failed,errno = %#x",errno);
return -2;
}
fclose(pFile);
return 0;
}
int hsm_delete_file(char * name)
{
int ret;
unsigned char name_buf[128];
FILE *pFile = NULL;
DIR *pDIR = NULL;
struct dirent* pdirent;
pDIR = opendir(name);
if(NULL != pDIR)
{
while((pdirent = readdir(pDIR)) != NULL)
{
LOGD("d_name:%s,d_type:%d",pdirent->d_name,pdirent->d_type);
memset(name_buf,0,sizeof(name_buf));
strcat(name_buf,name);
strcat(name_buf,pdirent->d_name);
if(pdirent->d_type == DT_REG)
{
LOGD("name_buf:%s",name_buf);
ret = remove(name_buf);
if(ret != 0)
{
LOGE("remove error %d",errno);
}
}
}
}
closedir(pDIR);
return 0;
}
int hsm_osm_delete_all()
{
int ret;
ret = hsm_delete_file(PATH_PRIV_CERT);
if(ret != 0)
{
LOGE("delete PRIV_CERT error %d",errno);
}
ret = hsm_delete_file(PATH_PUB_CERT);
if(ret != 0)
{
LOGE("delete PUB_CERT error %d",errno);
}
ret = hsm_delete_file(PATH_ROOT_CERT);
if(ret != 0)
{
LOGE("delete ROOT_CERT error %d",errno);
}
//system("rm priv_cert/*");
//system("rm pub_cert/*");
//system("rm root_cert/*");
return 0;
}