Beispiel #1
0
void Pod::watch() {
    watcher_t w = create_watcher();
    shm_watch(switches, w);
    shm_watch(mission_start_switch, w);
    shm_watch(merge_status, w);

    // Initial write:
    // TODO: resync before this?
    sendInt16(30, mission_start_switch.mission_light);

    while (isActive()) {
        wait_watcher(w, false); // Don't block if there has been an update
                                // we want to make sure it gets through
        shm_getg(switches, switches_new);
        shm_getg(mission_start_switch, mission_start_switch_new);
        shm_getg(merge_status, merge_status_new);

        if (mission_start_switch_new.mission_light != mission_start_switch.mission_light) {
            sendInt16(30, (mission_start_switch_new.mission_light));
            mission_start_switch.mission_light = mission_start_switch_new.mission_light;
        }
    }

    destroy_watcher(w);
}
Beispiel #2
0
void Him::watch() {
    watcher_t w = create_watcher();
    shm_watch(him_settings, w);
    shm_watch(him, w);

    // Initial write:
    // TODO: resync before this?
    sendFloat(16, him_settings.heading_offset);
    sendFloat(18, him_settings.pitchoffset);
    sendFloat(20, him_settings.rolloffset);
    sendFloat(22, him_settings.xacceloffset);
    sendFloat(24, him_settings.yacceloffset);
    sendFloat(26, him_settings.zacceloffset);
    sendInt16(28, him_settings.xcompoffset);
    sendInt16(29, him_settings.ycompoffset);
    sendInt16(30, him_settings.zcompoffset);

    while (isActive()) {
        wait_watcher(w, false); // Don't block if there has been an update
                                // we want to make sure it gets through
        shm_getg(him_settings, him_settings_new);
        shm_getg(him, him_new);

        if (him_settings_new.heading_offset != him_settings.heading_offset) {
            sendFloat(16, (him_settings_new.heading_offset));
            him_settings.heading_offset = him_settings_new.heading_offset;
        }
        if (him_settings_new.pitchoffset != him_settings.pitchoffset) {
            sendFloat(18, (him_settings_new.pitchoffset));
            him_settings.pitchoffset = him_settings_new.pitchoffset;
        }
        if (him_settings_new.rolloffset != him_settings.rolloffset) {
            sendFloat(20, (him_settings_new.rolloffset));
            him_settings.rolloffset = him_settings_new.rolloffset;
        }
        if (him_settings_new.xacceloffset != him_settings.xacceloffset) {
            sendFloat(22, (him_settings_new.xacceloffset));
            him_settings.xacceloffset = him_settings_new.xacceloffset;
        }
        if (him_settings_new.yacceloffset != him_settings.yacceloffset) {
            sendFloat(24, (him_settings_new.yacceloffset));
            him_settings.yacceloffset = him_settings_new.yacceloffset;
        }
        if (him_settings_new.zacceloffset != him_settings.zacceloffset) {
            sendFloat(26, (him_settings_new.zacceloffset));
            him_settings.zacceloffset = him_settings_new.zacceloffset;
        }
        if (him_settings_new.xcompoffset != him_settings.xcompoffset) {
            sendInt16(28, (him_settings_new.xcompoffset));
            him_settings.xcompoffset = him_settings_new.xcompoffset;
        }
        if (him_settings_new.ycompoffset != him_settings.ycompoffset) {
            sendInt16(29, (him_settings_new.ycompoffset));
            him_settings.ycompoffset = him_settings_new.ycompoffset;
        }
        if (him_settings_new.zcompoffset != him_settings.zcompoffset) {
            sendInt16(30, (him_settings_new.zcompoffset));
            him_settings.zcompoffset = him_settings_new.zcompoffset;
        }
    }

    destroy_watcher(w);
}
Beispiel #3
0
void Actuators::watch() {
    watcher_t w = create_watcher();
    shm_watch(switches, w);
    shm_watch(actuator_desires, w);
    shm_watch(actuator_status, w);

    // Initial write:
    // TODO: resync before this?
    sendInt16(16, actuator_desires.trigger_01);
    sendInt16(17, actuator_desires.trigger_02);
    sendInt16(18, actuator_desires.trigger_03);
    sendInt16(19, actuator_desires.trigger_04);
    sendInt16(20, actuator_desires.trigger_05);
    sendInt16(21, actuator_desires.trigger_06);
    sendInt16(22, actuator_desires.trigger_07);
    sendInt16(23, actuator_desires.trigger_08);
    sendInt16(24, actuator_desires.trigger_09);
    sendInt16(25, actuator_desires.trigger_10);
    sendInt16(26, actuator_desires.trigger_11);
    sendInt16(27, actuator_desires.trigger_12);
    sendInt16(28, actuator_desires.trigger_13);
    sendInt16(29, actuator_desires.trigger_14);
    sendInt16(30, actuator_desires.motor_pwm_1);
    sendInt16(31, actuator_desires.motor_pwm_2);
    sendInt16(32, switches.soft_kill);

    while (isActive()) {
        wait_watcher(w, false); // Don't block if there has been an update
                                // we want to make sure it gets through
        shm_getg(switches, switches_new);
        shm_getg(actuator_desires, actuator_desires_new);
        shm_getg(actuator_status, actuator_status_new);

        if (actuator_desires_new.trigger_01 != actuator_desires.trigger_01) {
            sendInt16(16, (actuator_desires_new.trigger_01));
            actuator_desires.trigger_01 = actuator_desires_new.trigger_01;
        }
        if (actuator_desires_new.trigger_02 != actuator_desires.trigger_02) {
            sendInt16(17, (actuator_desires_new.trigger_02));
            actuator_desires.trigger_02 = actuator_desires_new.trigger_02;
        }
        if (actuator_desires_new.trigger_03 != actuator_desires.trigger_03) {
            sendInt16(18, (actuator_desires_new.trigger_03));
            actuator_desires.trigger_03 = actuator_desires_new.trigger_03;
        }
        if (actuator_desires_new.trigger_04 != actuator_desires.trigger_04) {
            sendInt16(19, (actuator_desires_new.trigger_04));
            actuator_desires.trigger_04 = actuator_desires_new.trigger_04;
        }
        if (actuator_desires_new.trigger_05 != actuator_desires.trigger_05) {
            sendInt16(20, (actuator_desires_new.trigger_05));
            actuator_desires.trigger_05 = actuator_desires_new.trigger_05;
        }
        if (actuator_desires_new.trigger_06 != actuator_desires.trigger_06) {
            sendInt16(21, (actuator_desires_new.trigger_06));
            actuator_desires.trigger_06 = actuator_desires_new.trigger_06;
        }
        if (actuator_desires_new.trigger_07 != actuator_desires.trigger_07) {
            sendInt16(22, (actuator_desires_new.trigger_07));
            actuator_desires.trigger_07 = actuator_desires_new.trigger_07;
        }
        if (actuator_desires_new.trigger_08 != actuator_desires.trigger_08) {
            sendInt16(23, (actuator_desires_new.trigger_08));
            actuator_desires.trigger_08 = actuator_desires_new.trigger_08;
        }
        if (actuator_desires_new.trigger_09 != actuator_desires.trigger_09) {
            sendInt16(24, (actuator_desires_new.trigger_09));
            actuator_desires.trigger_09 = actuator_desires_new.trigger_09;
        }
        if (actuator_desires_new.trigger_10 != actuator_desires.trigger_10) {
            sendInt16(25, (actuator_desires_new.trigger_10));
            actuator_desires.trigger_10 = actuator_desires_new.trigger_10;
        }
        if (actuator_desires_new.trigger_11 != actuator_desires.trigger_11) {
            sendInt16(26, (actuator_desires_new.trigger_11));
            actuator_desires.trigger_11 = actuator_desires_new.trigger_11;
        }
        if (actuator_desires_new.trigger_12 != actuator_desires.trigger_12) {
            sendInt16(27, (actuator_desires_new.trigger_12));
            actuator_desires.trigger_12 = actuator_desires_new.trigger_12;
        }
        if (actuator_desires_new.trigger_13 != actuator_desires.trigger_13) {
            sendInt16(28, (actuator_desires_new.trigger_13));
            actuator_desires.trigger_13 = actuator_desires_new.trigger_13;
        }
        if (actuator_desires_new.trigger_14 != actuator_desires.trigger_14) {
            sendInt16(29, (actuator_desires_new.trigger_14));
            actuator_desires.trigger_14 = actuator_desires_new.trigger_14;
        }
        if (actuator_desires_new.motor_pwm_1 != actuator_desires.motor_pwm_1) {
            sendInt16(30, (actuator_desires_new.motor_pwm_1));
            actuator_desires.motor_pwm_1 = actuator_desires_new.motor_pwm_1;
        }
        if (actuator_desires_new.motor_pwm_2 != actuator_desires.motor_pwm_2) {
            sendInt16(31, (actuator_desires_new.motor_pwm_2));
            actuator_desires.motor_pwm_2 = actuator_desires_new.motor_pwm_2;
        }
        if (switches_new.soft_kill != switches.soft_kill) {
            sendInt16(32, (switches_new.soft_kill));
            switches.soft_kill = switches_new.soft_kill;
        }
    }

    destroy_watcher(w);
}
Beispiel #4
0
static int create_ns(const char *statedir, const char *name)
{
	char str[64];
	uid_t uid = getuid();
	gid_t gid = getgid();

	if (unshare(CLONE_NEWNS | CLONE_NEWNET |
		    CLONE_NEWUTS | CLONE_NEWUSER) < 0)
		pdie("can't unshare namespaces");

	if (access("/proc/self/setgroups", O_RDONLY) == 0)
		write_file("/proc/self/setgroups", "deny");
	snprintf(str, sizeof(str), "0 %d 1", uid);
	write_file("/proc/self/uid_map", str);
	snprintf(str, sizeof(str), "0 %d 1", gid);
	write_file("/proc/self/gid_map", str);

	if (sethostname(name, strlen(name)) < 0)
		pdie("can't set hostname");
	setup_ipv4("lo", "127.0.0.1", "255.0.0.0", false, 0);

	mkdir(statedir, 0755);
	char *local_etc = populate_statedir(statedir, "etc", true);
	char *workdir = populate_statedir(statedir, "workdir", true);
	char *resolv = populate_statedir(statedir, "etc/resolv.conf", false);

	char *mount_opts;
	if (asprintf(&mount_opts, "lowerdir=/etc,upperdir=%s,workdir=%s",
		     local_etc, workdir) < 0) {
		die("can't allocate memory\n");
	}

	/*
	 * overlayfs is only usable on patched kernels (e.g. Ubuntu) due to
	 * permission checks, but it is the cleanest solution because it
	 * overrides symlinks.  If we have to use bind mounts instead,
	 * tell the watcher process to re-create the bind mount if
	 * resolv.conf gets deleted.
	 */
	int inotify_fd = -1, inotify_wd = -1;
	if (mount("overlay", "/etc", "overlay", 0, mount_opts) == 0) {
		/* pass through */
	} else {
		inotify_fd = inotify_init();
		if (inotify_fd < 0)
			pdie("can't create inotify socket");

		inotify_wd = watch_and_bind_mount(inotify_fd, resolv);
		if (inotify_wd < 0)
			die("can't watch resolv.conf\n");
	}

	/*
	 * Create the initial watcher connection here so that the parent
	 * process doesn't need to wait for the child process to start up.
	 */
	int initial_conn_fd[2];
	if (socketpair(AF_UNIX, SOCK_STREAM, 0, initial_conn_fd) < 0)
		pdie("socketpair failed");
	write_pid(statedir, create_watcher(statedir, initial_conn_fd[1],
					   resolv, inotify_fd, inotify_wd));
	close(initial_conn_fd[1]);
	close(inotify_fd);

	free(mount_opts);
	free(resolv);
	free(workdir);
	free(local_etc);

	return initial_conn_fd[0];
}