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; }
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; }