예제 #1
0
파일: file_locking.c 프로젝트: vgmoose/lvm
int init_file_locking(struct locking_type *locking, struct cmd_context *cmd,
		      int suppress_messages)
{
	int r;
	const char *locking_dir;

	init_flock(cmd);

	locking->lock_resource = _file_lock_resource;
	locking->reset_locking = _reset_file_locking;
	locking->fin_locking = _fin_file_locking;
	locking->flags = 0;

	/* Get lockfile directory from config file */
	locking_dir = find_config_tree_str(cmd, global_locking_dir_CFG, NULL);
	if (strlen(locking_dir) >= sizeof(_lock_dir)) {
		log_error("Path for locking_dir %s is invalid.", locking_dir);
		return 0;
	}

	strcpy(_lock_dir, locking_dir);

	(void) dm_prepare_selinux_context(_lock_dir, S_IFDIR);
	r = dm_create_dir(_lock_dir);
	(void) dm_prepare_selinux_context(NULL, 0);

	if (!r)
		return 0;

	/* Trap a read-only file system */
	if ((access(_lock_dir, R_OK | W_OK | X_OK) == -1) && (errno == EROFS))
		return 0;

	return 1;
}
예제 #2
0
int main(int argc, char **argv)
{
	struct flock	fl;
	char	*device_name;
	int	fd, c, f_opt = 0, do_rdwr = 0, end_immediately = 0;
	int	flags = O_NONBLOCK|O_LARGEFILE;
	
	progname = argv[0];

	/* ts A70417: added -w , -r , -i */
	while ((c = getopt (argc, argv, "feirw")) != EOF) {
		switch (c) {
		case 'e':
			flags |= O_EXCL;
			break;
		case 'f':
			f_opt++;
			break;
		case 'i':
			end_immediately = 1;
			break;
		case 'r':
			do_rdwr = 0;
			break;
		case 'w':
			do_rdwr = 1;
			break;
		case '?':
			usage();
			exit(1);
		}
	}

	if (optind == argc)
		usage();
	device_name = argv[optind++];

	/* ts A70417 : made read-write adjustable independently of f_opt */
	if (do_rdwr) {
		flags |= O_RDWR;
		printf("Using O_RDWR\n");
	} else {
		flags |= O_RDONLY;
		printf("Using O_RDONLY\n");
	}

	if (flags & O_EXCL)
		printf("Trying to open %s with O_EXCL ...\n", device_name);
	fd = open(device_name, flags, 0);
	if (fd < 0) {
		perror("open");
		printf("failed\n");
		exit(1);
	}
	if (flags & O_EXCL)
		printf("succeeded\n");
		
	if (f_opt) {
		init_flock(&fl, do_rdwr);
		if (fcntl(fd, F_GETLK, &fl) < 0) {
			perror("fcntl: F_GETLK: ");
			exit(1);
		}
		printf("fcntl lock apparently %sLOCKED\n", 
		       (fl.l_type == F_UNLCK) ? "NOT " : "");

		init_flock(&fl, do_rdwr);
		printf("Trying to grab fcntl lock...\n");
		if (fcntl(fd, F_SETLK, &fl) < 0) {
			perror("fcntl: F_SETLK: ");
			printf("failed\n");
			exit(1);
		}
		printf("succeeded\n");
	}

	/* ts A70417: added end_immediately */
	printf("Holding %s open.\n", device_name);
	usleep(100000);
	if (end_immediately)
		exit(0);
	printf("Press ^C to exit.\n");
	while (1) {
		sleep(300);
	} 
	/* NOTREACHED */
	return 0;
}