예제 #1
0
파일: conf-bin.c 프로젝트: yanyg/misc
ssize_t conf_read_bin(const char *file,
		      const void *key, size_t key_len,
		      void *value, size_t value_len)
{
	int fd;
	ssize_t r = -1;

	if ((fd = open(file, O_RDONLY)) < 0) {
		DBGE("open %s failed", file);
		return -1;
	}

	if (__check_head(fd) < 0)
		goto RTN;

	if (__find_key(fd, -1, key, key_len, value_len) < 0)
		goto RTN;

	if (readn(fd, value, value_len) != value_len)
		goto RTN;

	r = 0;

RTN:
	close(fd);
	return r;
}
예제 #2
0
파일: conf-bin.c 프로젝트: yanyg/misc
ssize_t conf_op_bin(int type, const char *file,
		       const void *key, size_t key_len,
		       const void *value, size_t value_len)
{
	int fd = -1, fd_new;
	char file_tmp[PATH_MAX];
	ssize_t r = -1;

	if (pathname_tmp(file, file_tmp, PATH_MAX) < 0)
		return -1;

	if ((fd_new = open(file_tmp, O_WRONLY|O_CREAT, ACCESSPERMS)) < 0) {
		DBGE("open %s failed", file_tmp);
		return -1;
	}
	if ((r = __write_head(fd_new)) < 0)
		goto RTN;

	if ((fd = open(file, O_RDONLY)) < 0) {
		if (ENOENT == errno)
			goto NEW_ITEM;

		goto RTN;
	}

	if (__check_head(fd) < 0)
		goto RTN;

	while(!(r = __find_key(fd, fd_new, key, key_len, value_len)))
		__check_copy(fd, -1, value_len); /* discard value here */

	if (r == -2)
		goto RTN;

NEW_ITEM:
	if (CONF_WRITE == type)
		r = __write_item(fd_new, key, key_len, value, value_len);

	/* r = __copy_left(fd, fd_new); */

RTN:
	close(fd_new);
	if (fd >= 0)
		close(fd);
	if (r >= 0)
		r = rename(file_tmp, file);
	if (r < 0)
		unlink(file_tmp);

	return r;
}
예제 #3
0
 id_type find(id_type __id, const key_type& key) const
 {
   return __find_key(__id, key);
 }
예제 #4
0
 id_type __find_dispatch(Integer __id, Integer __key, boost::true_type) const
 {
   return __find_key(__id, __key);
 }