view rvinterf/etmsync/fsnew.c @ 419:67d683a87b1d

rvinterf client refactoring: libinterf created
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 27 Oct 2018 23:35:10 +0000
parents 0cb766828d7a
children 003e48f8ebe1
line wrap: on
line source

/*
 * In this module we are going to implement the commands that upload
 * new FreeCalypso-invented stuff into the FFS of our FC devices.
 */

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "exitcodes.h"

char batterytab_compile_tool[] = "/opt/freecalypso/bin/compile-fc-batt";
char charging_compile_tool[]   = "/opt/freecalypso/bin/compile-fc-chg";

upload_fc_table_from_ascii(asciisrc, compiletool, ffs_pathname)
	char *asciisrc, *compiletool, *ffs_pathname;
{
	char tmpfile[] = "/tmp/fc-fsioXXXXXX";
	int tmpfd;
	pid_t child, waitres;
	int status, rc;

	tmpfd = mkstemp(tmpfile);
	if (tmpfd < 0) {
		fprintf(stderr, "unable to get temp file via mkstemp()\n");
		return(ERROR_UNIX);
	}
	close(tmpfd);
	child = vfork();
	if (child < 0) {
		fprintf(stderr, "unable to vfork to run compiler tool\n");
		unlink(tmpfile);
		return(ERROR_UNIX);
	}
	if (!child) {
		execl(compiletool, compiletool, asciisrc, tmpfile, 0);
		perror(compiletool);
		_exit(ERROR_UNIX);
	}
	waitres = waitpid(child, &status, 0);
	if (waitres != child || !WIFEXITED(status)) {
		fprintf(stderr, "unexpected wait result after compiler run\n");
		unlink(tmpfile);
		return(ERROR_UNIX);
	}
	rc = WEXITSTATUS(status);
	if (rc) {
		unlink(tmpfile);
		return rc;
	}
	rc = fwrite_from_file(ffs_pathname, tmpfile);
	unlink(tmpfile);
	return rc;
}

cmd_write_battery_table(argc, argv)
	char **argv;
{
	return upload_fc_table_from_ascii(argv[1], batterytab_compile_tool,
					  "/etc/batterytab");
}

cmd_write_charging_config(argc, argv)
	char **argv;
{
	return upload_fc_table_from_ascii(argv[1], charging_compile_tool,
					  "/etc/charging");
}