Пример #1
0
int duet_print_list(int numtasks)
{
	int duet_fd, i, ret = 0;
	struct duet_ioctl_status_args *args;
	size_t args_size;

	if (numtasks <= 0 || numtasks > 65535) {
		fprintf(stderr, "duet_print_list: invalid number of tasks\n");
		return 1;
	}

	args_size = sizeof(struct duet_ioctl_status_args) + (numtasks *
		    sizeof(struct duet_task_attrs));
	args = malloc(args_size);
	if (!args) {
		perror("duet_print_list: task list allocation failed");
		return 1;
	}

	memset(args, 0, args_size);
	args->size = sizeof(*args);
	args->flags = DUET_STATUS_PRINT_LIST;
	args->numtasks = numtasks;

	/* Open the duet device */
	duet_fd = open_duet_dev();
	if (duet_fd == -1) {
		fprintf(stderr, "Error: failed to open duet device\n");
		return -1;
	}

	ret = ioctl(duet_fd, DUET_IOC_STATUS, args);
	if (ret < 0) {
		perror("duet_print_list: ioctl failed");
		close_duet_dev(duet_fd);
		goto out;
	}

	/* Print out the list we received */
	fprintf(stdout, "Duet task listing:\n\n");

	for (i = 0; i < args->numtasks; i++) {
		if (!args->tasks[i].id)
			break;

		fprintf(stdout, "Task Id: %d\n", args->tasks[i].id);
		fprintf(stdout, "Task fd: %d\n", args->tasks[i].fd);
		fprintf(stdout, "Task name: %s\n", args->tasks[i].name);
		PRINT_MASK(args->tasks[i].regmask);
		fprintf(stdout, "Reg. path: %s\n\n", args->tasks[i].path);
	}

	fprintf(stdout, "Listed %d tasks.\n", i);

out:
	free(args);
	close_duet_dev(duet_fd);
	return ret;
}
Пример #2
0
int duet_print_list(int numtasks)
{
	int i, ret = 0;
	struct duet_status_args *args;
	size_t args_size;

	if (numtasks <= 0 || numtasks > 65535) {
		fprintf(stderr, "duet_print_list: invalid number of tasks\n");
		return 1;
	}

	args_size = sizeof(struct duet_status_args) + (numtasks *
		    sizeof(struct duet_task_attrs));
	args = malloc(args_size);
	if (!args) {
		perror("duet_print_list: task list allocation failed");
		return 1;
	}

	memset(args, 0, args_size);
	args->size = sizeof(*args);
	args->numtasks = numtasks;

	/* Call syscall x86_64 #329: duet_status */
	ret = syscall(329, DUET_STATUS_PRINT_LIST, args);
	if (ret < 0) {
		perror("duet_print_list: syscall failed");
		goto out;
	}

	/* Print out the list we received */
	fprintf(stdout, "Duet task listing:\n\n");

	for (i = 0; i < args->numtasks; i++) {
		if (!args->tasks[i].id)
			break;

		fprintf(stdout, "Task Id: %d\n", args->tasks[i].id);
		fprintf(stdout, "Task fd: %d\n", args->tasks[i].fd);
		fprintf(stdout, "Task name: %s\n", args->tasks[i].name);
		PRINT_MASK(args->tasks[i].regmask);
		fprintf(stdout, "Reg. path: %s\n\n", args->tasks[i].path);
	}

	fprintf(stdout, "Listed %d tasks.\n", i);

out:
	free(args);
	return ret;
}