diff rvinterf/etmsync/fsnew.c @ 321:0cb766828d7a

fc-fsio: implemented write-battery-table and write-charging-config commands
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 17 Dec 2017 03:31:54 +0000
parents
children 003e48f8ebe1
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etmsync/fsnew.c	Sun Dec 17 03:31:54 2017 +0000
@@ -0,0 +1,68 @@
+/*
+ * 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");
+}