xref: /dflybsd-src/usr.sbin/installer/test/test_storage/test_storage.c (revision 4d4ae2fa84d1285901e8f27b9a41889d3ae67f8d)
16ab64ab6SAntonio Huete Jimenez /*
26ab64ab6SAntonio Huete Jimenez  * Copyright (c) 2014 The DragonFly Project.  All rights reserved.
36ab64ab6SAntonio Huete Jimenez  *
46ab64ab6SAntonio Huete Jimenez  * This code is derived from software contributed to The DragonFly Project
56ab64ab6SAntonio Huete Jimenez  * by Chris Pressey <cpressey@catseye.mine.nu>.
66ab64ab6SAntonio Huete Jimenez  *
76ab64ab6SAntonio Huete Jimenez  * Redistribution and use in source and binary forms, with or without
86ab64ab6SAntonio Huete Jimenez  * modification, are permitted provided that the following conditions
96ab64ab6SAntonio Huete Jimenez  * are met:
106ab64ab6SAntonio Huete Jimenez  *
116ab64ab6SAntonio Huete Jimenez  * 1. Redistributions of source code must retain the above copyright
126ab64ab6SAntonio Huete Jimenez  *    notice, this list of conditions and the following disclaimer.
136ab64ab6SAntonio Huete Jimenez  * 2. Redistributions in binary form must reproduce the above copyright
146ab64ab6SAntonio Huete Jimenez  *    notice, this list of conditions and the following disclaimer in
156ab64ab6SAntonio Huete Jimenez  *    the documentation and/or other materials provided with the
166ab64ab6SAntonio Huete Jimenez  *    distribution.
176ab64ab6SAntonio Huete Jimenez  * 3. Neither the name of The DragonFly Project nor the names of its
186ab64ab6SAntonio Huete Jimenez  *    contributors may be used to endorse or promote products derived
196ab64ab6SAntonio Huete Jimenez  *    from this software without specific, prior written permission.
206ab64ab6SAntonio Huete Jimenez  *
216ab64ab6SAntonio Huete Jimenez  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
226ab64ab6SAntonio Huete Jimenez  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
236ab64ab6SAntonio Huete Jimenez  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
246ab64ab6SAntonio Huete Jimenez  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
256ab64ab6SAntonio Huete Jimenez  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
266ab64ab6SAntonio Huete Jimenez  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
276ab64ab6SAntonio Huete Jimenez  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
286ab64ab6SAntonio Huete Jimenez  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
296ab64ab6SAntonio Huete Jimenez  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
306ab64ab6SAntonio Huete Jimenez  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
316ab64ab6SAntonio Huete Jimenez  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
326ab64ab6SAntonio Huete Jimenez  * SUCH DAMAGE.
336ab64ab6SAntonio Huete Jimenez  */
346ab64ab6SAntonio Huete Jimenez 
356ab64ab6SAntonio Huete Jimenez /*
366ab64ab6SAntonio Huete Jimenez  * test.c
376ab64ab6SAntonio Huete Jimenez  * Test some libinstaller functions.
386ab64ab6SAntonio Huete Jimenez  */
396ab64ab6SAntonio Huete Jimenez 
406ab64ab6SAntonio Huete Jimenez #include <stdio.h>
416ab64ab6SAntonio Huete Jimenez #include <err.h>
426ab64ab6SAntonio Huete Jimenez #include <unistd.h>
436ab64ab6SAntonio Huete Jimenez #include <sys/stat.h>
448be10271SAntonio Huete Jimenez #include <sys/types.h>
456ab64ab6SAntonio Huete Jimenez 
466ab64ab6SAntonio Huete Jimenez #define NEEDS_DFUI_STRUCTURE_DEFINITIONS
478be10271SAntonio Huete Jimenez #define NEEDS_DISKUTIL_STRUCTURE_DEFINITIONS
486ab64ab6SAntonio Huete Jimenez #include "libdfui/dfui.h"
496ab64ab6SAntonio Huete Jimenez 
506ab64ab6SAntonio Huete Jimenez #include "libinstaller/functions.h"
516ab64ab6SAntonio Huete Jimenez #include "libinstaller/diskutil.h"
526ab64ab6SAntonio Huete Jimenez #include "libinstaller/commands.h"
536ab64ab6SAntonio Huete Jimenez 
546ab64ab6SAntonio Huete Jimenez #ifdef DEBUG
556ab64ab6SAntonio Huete Jimenez #include "libdfui/dump.h"
566ab64ab6SAntonio Huete Jimenez #endif
576ab64ab6SAntonio Huete Jimenez #include "libaura/fspred.h"
586ab64ab6SAntonio Huete Jimenez 
598be10271SAntonio Huete Jimenez #define TMPDIR "/tmp/installer/temp"
608be10271SAntonio Huete Jimenez 
616ab64ab6SAntonio Huete Jimenez void test_storage(struct i_fn_args *);
626ab64ab6SAntonio Huete Jimenez void libinstaller_backend(struct i_fn_args **);
636ab64ab6SAntonio Huete Jimenez void libinstaller_frontend(struct dfui_connection **);
646ab64ab6SAntonio Huete Jimenez void libinstaller_form_dump(struct dfui_form *);
656ab64ab6SAntonio Huete Jimenez 
666ab64ab6SAntonio Huete Jimenez void (*tstate)(struct i_fn_args *) = NULL;
676ab64ab6SAntonio Huete Jimenez 
686ab64ab6SAntonio Huete Jimenez void
check_user(void)698be10271SAntonio Huete Jimenez check_user(void)
708be10271SAntonio Huete Jimenez {
718be10271SAntonio Huete Jimenez 	if (getuid() != 0) {
728be10271SAntonio Huete Jimenez 		warnx(
738be10271SAntonio Huete Jimenez 			"\n--------------------------------------------------\n"
748be10271SAntonio Huete Jimenez 			"It is not recommended that you run this program\n"
758be10271SAntonio Huete Jimenez 			"as a regular user since many of the tasks the\n"
768be10271SAntonio Huete Jimenez 			"installer performs must be run as root\n"
778be10271SAntonio Huete Jimenez 			"(such as fdisk, disklabel, ...)\n"
788be10271SAntonio Huete Jimenez 			"Please run as root to get correct results.\n"
798be10271SAntonio Huete Jimenez 			"--------------------------------------------------\n"
808be10271SAntonio Huete Jimenez 			);
818be10271SAntonio Huete Jimenez 		sleep(2);
828be10271SAntonio Huete Jimenez 	}
838be10271SAntonio Huete Jimenez }
848be10271SAntonio Huete Jimenez 
858be10271SAntonio Huete Jimenez void
test_storage(struct i_fn_args * a)866ab64ab6SAntonio Huete Jimenez test_storage(struct i_fn_args *a)
876ab64ab6SAntonio Huete Jimenez {
888be10271SAntonio Huete Jimenez 	struct disk *dsk, *dsk_next;
896ab64ab6SAntonio Huete Jimenez 	int r;
906ab64ab6SAntonio Huete Jimenez 
916ab64ab6SAntonio Huete Jimenez 	r = survey_storage(a);
928be10271SAntonio Huete Jimenez 	printf("survey_storage rc=%d\n", r);
938be10271SAntonio Huete Jimenez 
948be10271SAntonio Huete Jimenez 	printf("Found disks:\n");
958be10271SAntonio Huete Jimenez 
968be10271SAntonio Huete Jimenez 	dsk = a->s->disk_head;
978be10271SAntonio Huete Jimenez 	while (dsk != NULL) {
988be10271SAntonio Huete Jimenez 		dsk_next = dsk->next;
998be10271SAntonio Huete Jimenez 		printf("%s %ld MB\n",
1008be10271SAntonio Huete Jimenez 		       dsk->device, dsk->capacity);
1018be10271SAntonio Huete Jimenez 		dsk = dsk_next;
1028be10271SAntonio Huete Jimenez 	}
1036ab64ab6SAntonio Huete Jimenez 	tstate = NULL;
1046ab64ab6SAntonio Huete Jimenez }
1056ab64ab6SAntonio Huete Jimenez 
1066ab64ab6SAntonio Huete Jimenez void
libinstaller_backend(struct i_fn_args ** a)1076ab64ab6SAntonio Huete Jimenez libinstaller_backend(struct i_fn_args **a)
1086ab64ab6SAntonio Huete Jimenez {
1096ab64ab6SAntonio Huete Jimenez 	struct i_fn_args *ap = *a;
1106ab64ab6SAntonio Huete Jimenez 
111*4d4ae2faSAntonio Huete Jimenez 	ap = i_fn_args_new("/", TMPDIR, "tmp/cmdnames.conf",
1126ab64ab6SAntonio Huete Jimenez 	    DFUI_TRANSPORT_TCP, "9999");
1136ab64ab6SAntonio Huete Jimenez 
1148be10271SAntonio Huete Jimenez 	if (ap == NULL)
1158be10271SAntonio Huete Jimenez 		errx(1, "Failed to start the installer backend");
1168be10271SAntonio Huete Jimenez 
1176ab64ab6SAntonio Huete Jimenez 	tstate = test_storage;
1186ab64ab6SAntonio Huete Jimenez 
1196ab64ab6SAntonio Huete Jimenez 	for (; tstate != NULL; ) {
1206ab64ab6SAntonio Huete Jimenez 		tstate(ap);
1216ab64ab6SAntonio Huete Jimenez 	}
1226ab64ab6SAntonio Huete Jimenez 
1236ab64ab6SAntonio Huete Jimenez 	i_fn_args_free(ap);
1246ab64ab6SAntonio Huete Jimenez }
1256ab64ab6SAntonio Huete Jimenez 
1266ab64ab6SAntonio Huete Jimenez void
libinstaller_frontend(struct dfui_connection ** c)1276ab64ab6SAntonio Huete Jimenez libinstaller_frontend(struct dfui_connection **c) {
1286ab64ab6SAntonio Huete Jimenez 	struct dfui_connection *cp = *c;
1296ab64ab6SAntonio Huete Jimenez 	struct dfui_response *r;
1306ab64ab6SAntonio Huete Jimenez 	char msgtype;
1316ab64ab6SAntonio Huete Jimenez 	void *payload;
1326ab64ab6SAntonio Huete Jimenez 	int done = 0;
1336ab64ab6SAntonio Huete Jimenez 
1346ab64ab6SAntonio Huete Jimenez 	usleep(100000);	/* Not really necessary */
1356ab64ab6SAntonio Huete Jimenez 	cp = dfui_connection_new(DFUI_TRANSPORT_TCP, "9999");
1366ab64ab6SAntonio Huete Jimenez 	dfui_fe_connect(cp);
1376ab64ab6SAntonio Huete Jimenez 
1386ab64ab6SAntonio Huete Jimenez 	while (!done) {
1396ab64ab6SAntonio Huete Jimenez 		dfui_fe_receive(cp, &msgtype, &payload);
1406ab64ab6SAntonio Huete Jimenez 		switch (msgtype) {
1416ab64ab6SAntonio Huete Jimenez 		case DFUI_BE_MSG_PRESENT:
1426ab64ab6SAntonio Huete Jimenez #ifdef DEBUG
1436ab64ab6SAntonio Huete Jimenez 			struct dfui_form *f;
1446ab64ab6SAntonio Huete Jimenez 			f = (struct dfui_form *)payload;
1456ab64ab6SAntonio Huete Jimenez 			dfui_form_dump(f);
1466ab64ab6SAntonio Huete Jimenez #endif
1476ab64ab6SAntonio Huete Jimenez 			r = dfui_response_new("dialog", "Cancel");
1486ab64ab6SAntonio Huete Jimenez 			dfui_fe_submit(cp, r);
1496ab64ab6SAntonio Huete Jimenez 			dfui_response_free(r);
1506ab64ab6SAntonio Huete Jimenez 			sleep(1);
1516ab64ab6SAntonio Huete Jimenez 			break;
1526ab64ab6SAntonio Huete Jimenez 		case DFUI_BE_MSG_PROG_BEGIN:
1536ab64ab6SAntonio Huete Jimenez 		case DFUI_BE_MSG_PROG_UPDATE:
1546ab64ab6SAntonio Huete Jimenez 		case DFUI_BE_MSG_PROG_END:
1556ab64ab6SAntonio Huete Jimenez 			/* Details about the progress can go here */
1566ab64ab6SAntonio Huete Jimenez 			dfui_fe_progress_continue(cp);
1576ab64ab6SAntonio Huete Jimenez 			break;
1586ab64ab6SAntonio Huete Jimenez 		case DFUI_BE_MSG_STOP:
1596ab64ab6SAntonio Huete Jimenez 			dfui_fe_confirm_stop(cp);
1606ab64ab6SAntonio Huete Jimenez 			done = 1;
1616ab64ab6SAntonio Huete Jimenez 			break;
1626ab64ab6SAntonio Huete Jimenez 		default:
1636ab64ab6SAntonio Huete Jimenez 			printf("msgtype=%c\n", msgtype);
1646ab64ab6SAntonio Huete Jimenez 			sleep(1);
1656ab64ab6SAntonio Huete Jimenez 		}
1666ab64ab6SAntonio Huete Jimenez 	}
1676ab64ab6SAntonio Huete Jimenez 	dfui_fe_disconnect(cp);
1686ab64ab6SAntonio Huete Jimenez }
1696ab64ab6SAntonio Huete Jimenez 
1706ab64ab6SAntonio Huete Jimenez int
main(int argc __unused,char ** argv __unused)1716ab64ab6SAntonio Huete Jimenez main(int argc __unused, char **argv __unused)
1726ab64ab6SAntonio Huete Jimenez {
1736ab64ab6SAntonio Huete Jimenez 	struct dfui_connection *c;
1746ab64ab6SAntonio Huete Jimenez 	struct i_fn_args *a;
1758be10271SAntonio Huete Jimenez 	int error;
1768be10271SAntonio Huete Jimenez 	char *path;
1776ab64ab6SAntonio Huete Jimenez 	int r;
1786ab64ab6SAntonio Huete Jimenez 
1798be10271SAntonio Huete Jimenez 	check_user();
1806ab64ab6SAntonio Huete Jimenez 
1818be10271SAntonio Huete Jimenez 	asprintf(&path, "mkdir -p %s", TMPDIR);
1828be10271SAntonio Huete Jimenez 	system(path);
1838be10271SAntonio Huete Jimenez 	free(path);
1846ab64ab6SAntonio Huete Jimenez 
1856ab64ab6SAntonio Huete Jimenez 	r = fork();
1866ab64ab6SAntonio Huete Jimenez 	switch(r) {
1876ab64ab6SAntonio Huete Jimenez 	case -1:
1886ab64ab6SAntonio Huete Jimenez 		err(1, "Failed to fork");
1896ab64ab6SAntonio Huete Jimenez 		/* NOT REACHED */
1906ab64ab6SAntonio Huete Jimenez 	case 0:
1916ab64ab6SAntonio Huete Jimenez 		libinstaller_backend(&a);
1926ab64ab6SAntonio Huete Jimenez 		break; 		/* NOT REACHED */
1936ab64ab6SAntonio Huete Jimenez 	default:
1946ab64ab6SAntonio Huete Jimenez 		libinstaller_frontend(&c);
1956ab64ab6SAntonio Huete Jimenez 	}
1966ab64ab6SAntonio Huete Jimenez 
1976ab64ab6SAntonio Huete Jimenez 	return(0);
1986ab64ab6SAntonio Huete Jimenez }
199