Blame echoaudio/fw_writer.c

Packit Service f0277f
/*
Packit Service f0277f
 *  ALSA driver for Echoaudio soundcards.
Packit Service f0277f
 *  Copyright (C) 2003-2004 Giuliano Pochini <pochini@shiny.it>
Packit Service f0277f
 *
Packit Service f0277f
 *  This program is free software; you can redistribute it and/or modify
Packit Service f0277f
 *  it under the terms of the GNU General Public License as published by
Packit Service f0277f
 *  the Free Software Foundation; version 2 of the License.
Packit Service f0277f
 *
Packit Service f0277f
 *  This program is distributed in the hope that it will be useful,
Packit Service f0277f
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service f0277f
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service f0277f
 *  GNU General Public License for more details.
Packit Service f0277f
 *
Packit Service f0277f
 *  You should have received a copy of the GNU General Public License
Packit Service f0277f
 *  along with this program; if not, write to the Free Software
Packit Service f0277f
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Packit Service f0277f
 */
Packit Service f0277f
Packit Service f0277f
#include <stdio.h>
Packit Service f0277f
#include <sys/stat.h>
Packit Service f0277f
#include <stdint.h>
Packit Service f0277f
#include <stdlib.h>
Packit Service f0277f
#include <unistd.h>
Packit Service f0277f
#include <fcntl.h>
Packit Service f0277f
#include <string.h>
Packit Service f0277f
#include <errno.h>
Packit Service f0277f
Packit Service f0277f
Packit Service f0277f
char *next_number(char *c)
Packit Service f0277f
{
Packit Service f0277f
	while (1) {
Packit Service f0277f
		c++;
Packit Service f0277f
		if (*c==0 || *c == '}')
Packit Service f0277f
			return NULL;
Packit Service f0277f
		if (c[0]=='0' && c[1]=='x')
Packit Service f0277f
			return c;
Packit Service f0277f
	}
Packit Service f0277f
}
Packit Service f0277f
Packit Service f0277f
Packit Service f0277f
Packit Service f0277f
int write_fw(const char *dest, const char *src)
Packit Service f0277f
{
Packit Service f0277f
	uint16_t d16;
Packit Service f0277f
	uint8_t d8;
Packit Service f0277f
	int fd;
Packit Service f0277f
	struct stat stbuf;
Packit Service f0277f
	char *buf, *c;
Packit Service f0277f
Packit Service f0277f
	if ((fd = open(src, O_RDONLY)) < 0) {
Packit Service f0277f
		printf("%s: %s\n", src, strerror(errno));
Packit Service f0277f
		exit(errno);
Packit Service f0277f
	}
Packit Service f0277f
	if (fstat(fd, &stbuf) < 0) {
Packit Service f0277f
		printf("%s: %s\n", src, strerror(errno));
Packit Service f0277f
		exit(errno);
Packit Service f0277f
	}
Packit Service f0277f
	if (!(buf = malloc(stbuf.st_size + 1))) {
Packit Service f0277f
		puts("Out of memory.");
Packit Service f0277f
		exit(ENOMEM);
Packit Service f0277f
	}
Packit Service f0277f
	if (read(fd, buf, stbuf.st_size) < stbuf.st_size) {
Packit Service f0277f
		puts("Read error.");
Packit Service f0277f
		exit(EIO);
Packit Service f0277f
	}
Packit Service f0277f
	close(fd);
Packit Service f0277f
	buf[stbuf.st_size] = 0;
Packit Service f0277f
Packit Service f0277f
	if ((fd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0) {
Packit Service f0277f
		printf("%s: %s\n", dest, strerror(errno));
Packit Service f0277f
		exit(errno);
Packit Service f0277f
	}
Packit Service f0277f
	if ((c = strstr(buf, "u8 ")) || (c = strstr(buf, "BYTE ")) || (c = strstr(buf, "char "))) {
Packit Service f0277f
		while (c = next_number(c)) {
Packit Service f0277f
			d8 = strtol(c, NULL, 16);
Packit Service f0277f
			if (write(fd, &d8, 1) < 1) {
Packit Service f0277f
				printf("Error writing %s\n", dest);
Packit Service f0277f
				exit(EIO);
Packit Service f0277f
			}
Packit Service f0277f
		}
Packit Service f0277f
	} else if ((c = strstr(buf, "u16 ")) || (c = strstr(buf, "WORD "))) {
Packit Service f0277f
		while (c = next_number(c)) {
Packit Service f0277f
			d16 = strtol(c, NULL, 16);
Packit Service f0277f
			if (write(fd, &d16, 2) < 2) {
Packit Service f0277f
				printf("Error writing %s\n", dest);
Packit Service f0277f
				exit(EIO);
Packit Service f0277f
			}
Packit Service f0277f
		}
Packit Service f0277f
	} else {
Packit Service f0277f
		printf("%s currupted ?\n", src);
Packit Service f0277f
		exit(EINVAL);
Packit Service f0277f
	}
Packit Service f0277f
	close(fd);
Packit Service f0277f
	free(buf);
Packit Service f0277f
Packit Service f0277f
	return 0;
Packit Service f0277f
}
Packit Service f0277f
Packit Service f0277f
Packit Service f0277f
Packit Service f0277f
int main(int argc, char *argv[])
Packit Service f0277f
{
Packit Service f0277f
	if (argc != 3) {
Packit Service f0277f
		printf("Syntax: %s <source> <destination>\n", argv[0]);
Packit Service f0277f
		exit(0);
Packit Service f0277f
	}
Packit Service f0277f
	write_fw(argv[2], argv[1]);
Packit Service f0277f
	return 0;
Packit Service f0277f
}