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