/* subq_test.c -- isolate CDIOCREADSUBCHANNEL parameters */
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/cdio.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int
main(int argc, char **argv)
{
	const char *dev = argv[1];
	int len = atoi(argv[2]);
	int track = atoi(argv[3]);
	int af = argc > 4 ? atoi(argv[4]) : CD_MSF_FORMAT;
	int df = argc > 5 ? atoi(argv[5]) : CD_CURRENT_POSITION;
	struct cd_sub_channel_info data;
	struct ioc_read_subchannel args;
	int fd = open(dev, O_RDONLY | O_NONBLOCK);

	printf("sizeof(cd_sub_channel_info)=%zu header=%zu\n",
	       sizeof(data), sizeof(struct cd_sub_channel_header));
	if (fd < 0) { printf("open: %s\n", strerror(errno)); return (2); }
	memset(&args, 0, sizeof(args));
	memset(&data, 0, sizeof(data));
	args.address_format = af;
	args.data_format = df;
	args.track = (u_char)track;
	args.data_len = len;
	args.data = &data;
	if (ioctl(fd, CDIOCREADSUBCHANNEL, &args) != 0) {
		printf("len=%d track=%d af=%d df=%d -> %s\n", len, track,
		       af, df, strerror(errno));
		return (1);
	}
	printf("len=%d track=%d af=%d df=%d -> OK returned track=%u "
	       "audio_status=0x%02x\n", len, track, af, df,
	       (unsigned)args.track, (unsigned)data.header.audio_status);
	return (0);
}
