Blame src/streamdump.c

Packit c32a2d
/*
Packit c32a2d
	streamdump: Dumping a copy of the input data.
Packit c32a2d
Packit c32a2d
	copyright 2010 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Michael Hipp
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#include "streamdump.h"
Packit c32a2d
#include <fcntl.h>
Packit c32a2d
#include <errno.h>
Packit c32a2d
#include "debug.h"
Packit c32a2d
Packit c32a2d
/* Stream dump descriptor. */
Packit c32a2d
static int dump_fd = -1;
Packit c32a2d
Packit c32a2d
/* Read data from input, write copy to dump file. */
Packit c32a2d
static ssize_t dump_read(int fd, void *buf, size_t count)
Packit c32a2d
{
Packit c32a2d
	ssize_t ret = read(fd, buf, count);
Packit c32a2d
	if(ret > 0 && dump_fd > -1)
Packit c32a2d
	{
Packit c32a2d
		write(dump_fd, buf, ret);
Packit c32a2d
	}
Packit c32a2d
	return ret;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* Also mirror seeks, to prevent messed up dumps of seekable streams. */
Packit c32a2d
static off_t dump_seek(int fd, off_t pos, int whence)
Packit c32a2d
{
Packit c32a2d
	off_t ret = lseek(fd, pos, whence);
Packit c32a2d
	if(ret >= 0 && dump_fd > -1)
Packit c32a2d
	{
Packit c32a2d
		lseek(dump_fd, pos, whence);
Packit c32a2d
	}
Packit c32a2d
	return ret;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* External API... open and close. */
Packit c32a2d
int dump_open(mpg123_handle *mh)
Packit c32a2d
{
Packit c32a2d
	int ret;
Packit c32a2d
Packit c32a2d
	if(param.streamdump == NULL) return 0;
Packit c32a2d
Packit c32a2d
	if(!param.quiet) fprintf(stderr, "Note: Dumping stream to %s\n", param.streamdump);
Packit c32a2d
Packit c32a2d
	dump_fd = compat_open(param.streamdump, O_CREAT|O_TRUNC|O_RDWR);
Packit c32a2d
	if(dump_fd < 0)
Packit c32a2d
	{
Packit c32a2d
		error1("Failed to open dump file: %s\n", strerror(errno));
Packit c32a2d
		return -1;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
#ifdef WIN32
Packit c32a2d
	_setmode(dump_fd, _O_BINARY);
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	ret = mpg123_replace_reader(mh, dump_read, dump_seek);
Packit c32a2d
	if(ret != MPG123_OK)
Packit c32a2d
	{
Packit c32a2d
		error1("Unable to replace reader for stream dump: %s\n", mpg123_strerror(mh));
Packit c32a2d
		dump_close();
Packit c32a2d
		return -1;
Packit c32a2d
	}
Packit c32a2d
	else return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
void dump_close(void)
Packit c32a2d
{
Packit c32a2d
	if(dump_fd > -1) compat_close(dump_fd);
Packit c32a2d
Packit c32a2d
	dump_fd = -1;
Packit c32a2d
}