t_stat cpu_set_model (UNIT *uptr, int32 val, char *cptr, void *desc) { #if defined(HAVE_LIBSDL) char gbuf[CBUFSIZE]; if ((cptr == NULL) || (!*cptr)) return SCPE_ARG; cptr = get_glyph (cptr, gbuf, 0); if (MATCH_CMD(gbuf, "MICROVAX") == 0) { sys_model = 0; vc_dev.flags = vc_dev.flags | DEV_DIS; /* disable QVSS */ lk_dev.flags = lk_dev.flags | DEV_DIS; /* disable keyboard */ vs_dev.flags = vs_dev.flags | DEV_DIS; /* disable mouse */ strcpy (sim_name, "MicroVAX I (KA610)"); reset_all (0); /* reset everything */ } else if (MATCH_CMD(gbuf, "VAXSTATION") == 0) { sys_model = 1; vc_dev.flags = vc_dev.flags & ~DEV_DIS; /* enable QVSS */ lk_dev.flags = lk_dev.flags & ~DEV_DIS; /* enable keyboard */ vs_dev.flags = vs_dev.flags & ~DEV_DIS; /* enable mouse */ strcpy (sim_name, "VAXStation I (KA610)"); reset_all (0); /* reset everything */ } else return SCPE_ARG; return SCPE_OK; #else return SCPE_NOFNC; #endif }
t_stat cpu_set_model (UNIT *uptr, int32 val, char *cptr, void *desc) { char gbuf[CBUFSIZE]; if ((cptr == NULL) || (!*cptr)) return SCPE_ARG; cptr = get_glyph (cptr, gbuf, 0); if (MATCH_CMD(gbuf, "MICROVAX") == 0) { sys_model = 0; #if defined(USE_SIM_VIDEO) && defined(HAVE_LIBSDL) vc_dev.flags = vc_dev.flags | DEV_DIS; /* disable QVSS */ lk_dev.flags = lk_dev.flags | DEV_DIS; /* disable keyboard */ vs_dev.flags = vs_dev.flags | DEV_DIS; /* disable mouse */ #endif strcpy (sim_name, "MicroVAX I (KA610)"); reset_all (0); /* reset everything */ } else if (MATCH_CMD(gbuf, "VAXSTATION") == 0) { #if defined(USE_SIM_VIDEO) && defined(HAVE_LIBSDL) sys_model = 1; vc_dev.flags = vc_dev.flags & ~DEV_DIS; /* enable QVSS */ lk_dev.flags = lk_dev.flags & ~DEV_DIS; /* enable keyboard */ vs_dev.flags = vs_dev.flags & ~DEV_DIS; /* enable mouse */ strcpy (sim_name, "VAXStation I (KA610)"); reset_all (0); /* reset everything */ #else return sim_messagef(SCPE_ARG, "Simulator built without Graphic Device Support"); #endif } else return SCPE_ARG; return SCPE_OK; }
static void parse_dynamic(char *line, time_t mtime) { char *x; /* Skip comments, i.e. lines beginning with # */ if (MATCH_CMD(line, "#", x)) return; /* Monitored daemon, will be respawned on exit, as * long as the (optional) service callback returns * non-zero */ if (MATCH_CMD(line, "service ", x)) { service_register(SVC_TYPE_SERVICE, x, mtime, NULL); return; } /* One-shot task, will not be respawned. Only runs if * the (optional) service callback returns true */ if (MATCH_CMD(line, "task ", x)) { service_register(SVC_TYPE_TASK, x, mtime, NULL); return; } /* Like task but waits for completion, useful w/ [S] */ if (MATCH_CMD(line, "run ", x)) { service_register(SVC_TYPE_RUN, x, mtime, NULL); return; } /* Classic inetd service */ if (MATCH_CMD(line, "inetd ", x)) { #ifndef INETD_DISABLED service_register(SVC_TYPE_INETD, x, mtime, NULL); #else _e("Finit built with inetd support disabled, cannot register service inetd %s!", x); #endif return; } }
SLIRP *sim_slirp_open (const char *args, void *opaque, packet_callback callback, DEVICE *dptr, uint32 dbit) { SLIRP *slirp = (SLIRP *)g_malloc0(sizeof(*slirp)); char *targs = g_strdup (args); const char *tptr = targs; const char *cptr; char tbuf[CBUFSIZE], gbuf[CBUFSIZE], abuf[CBUFSIZE]; int err; slirp_dptr = dptr; slirp_dbit = dbit; slirp->args = (char *)g_malloc0(1 + strlen(args)); strcpy (slirp->args, args); slirp->opaque = opaque; slirp->callback = callback; slirp->maskbits = 24; slirp->dhcpmgmt = 1; slirp->db_chime = INVALID_SOCKET; inet_aton(DEFAULT_IP_ADDR,&slirp->vgateway); err = 0; while (*tptr && !err) { tptr = get_glyph_nc (tptr, tbuf, ','); if (!tbuf[0]) break; cptr = tbuf; cptr = get_glyph (cptr, gbuf, '='); if (0 == MATCH_CMD (gbuf, "DHCP")) { slirp->dhcpmgmt = 1; if (cptr && *cptr) inet_aton (cptr, &slirp->vdhcp_start); continue; } if (0 == MATCH_CMD (gbuf, "TFTP")) { if (cptr && *cptr) slirp->tftp_path = g_strdup (cptr); else { sim_printf ("Missing TFTP Path\n"); err = 1; } continue; } if (0 == MATCH_CMD (gbuf, "BOOTFILE")) { if (cptr && *cptr) slirp->boot_file = g_strdup (cptr); else { sim_printf ("Missing DHCP Boot file name\n"); err = 1; } continue; } if ((0 == MATCH_CMD (gbuf, "NAMESERVER")) || (0 == MATCH_CMD (gbuf, "DNS"))) { if (cptr && *cptr) inet_aton (cptr, &slirp->vnameserver); else { sim_printf ("Missing nameserver\n"); err = 1; } continue; } if (0 == MATCH_CMD (gbuf, "DNSSEARCH")) { if (cptr && *cptr) { int count = 0; char *name; slirp->dns_search = g_strdup (cptr); name = slirp->dns_search; do { ++count; slirp->dns_search_domains = (char **)realloc (slirp->dns_search_domains, (count + 1)*sizeof(char *)); slirp->dns_search_domains[count] = NULL; slirp->dns_search_domains[count-1] = name; name = strchr (name, ':'); if (name) { *name = '\0'; ++name; } } while (name && *name); } else { sim_printf ("Missing DNS search list\n"); err = 1; } continue; } if (0 == MATCH_CMD (gbuf, "GATEWAY")) { if (cptr && *cptr) { cptr = get_glyph (cptr, abuf, '/'); if (cptr && *cptr) slirp->maskbits = atoi (cptr); inet_aton (abuf, &slirp->vgateway); } else { sim_printf ("Missing host\n"); err = 1; } continue; } if (0 == MATCH_CMD (gbuf, "NETWORK")) { if (cptr && *cptr) { cptr = get_glyph (cptr, abuf, '/'); if (cptr && *cptr) slirp->maskbits = atoi (cptr); inet_aton (abuf, &slirp->vnetwork); } else { sim_printf ("Missing network\n"); err = 1; } continue; } if (0 == MATCH_CMD (gbuf, "NODHCP")) { slirp->dhcpmgmt = 0; continue; } if (0 == MATCH_CMD (gbuf, "UDP")) { if (cptr && *cptr) err = _parse_redirect_port (&slirp->rtcp, cptr, IS_UDP); else { sim_printf ("Missing UDP port mapping\n"); err = 1; } continue; } if (0 == MATCH_CMD (gbuf, "TCP")) { if (cptr && *cptr) err = _parse_redirect_port (&slirp->rtcp, cptr, IS_TCP); else { sim_printf ("Missing TCP port mapping\n"); err = 1; } continue; } sim_printf ("Unexpected NAT argument: %s\n", gbuf); err = 1; } if (err) { sim_slirp_close (slirp); g_free (targs); return NULL; } slirp->vnetmask.s_addr = htonl(~((1 << (32-slirp->maskbits)) - 1)); slirp->vnetwork.s_addr = slirp->vgateway.s_addr & slirp->vnetmask.s_addr; if ((slirp->vgateway.s_addr & ~slirp->vnetmask.s_addr) == 0) slirp->vgateway.s_addr = htonl(ntohl(slirp->vnetwork.s_addr) | 2); if ((slirp->vdhcp_start.s_addr == 0) && slirp->dhcpmgmt) slirp->vdhcp_start.s_addr = htonl(ntohl(slirp->vnetwork.s_addr) | 15); if (slirp->vnameserver.s_addr == 0) slirp->vnameserver.s_addr = htonl(ntohl(slirp->vnetwork.s_addr) | 3); slirp->slirp = slirp_init (0, slirp->vnetwork, slirp->vnetmask, slirp->vgateway, NULL, slirp->tftp_path, slirp->boot_file, slirp->vdhcp_start, slirp->vnameserver, (const char **)(slirp->dns_search_domains), (void *)slirp); if (_do_redirects (slirp->slirp, slirp->rtcp)) { sim_slirp_close (slirp); slirp = NULL; } else { char db_host[32]; GPollFD pfd; int64_t rnd_val = qemu_clock_get_ns ((QEMUClockType)0) / 1000000; pthread_mutex_init (&slirp->write_buffer_lock, NULL); slirp->gpollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD)); /* setup transmit packet wakeup doorbell */ do { if ((rnd_val & 0xFFFF) == 0) ++rnd_val; sprintf (db_host, "localhost:%d", (int)(rnd_val & 0xFFFF)); slirp->db_chime = sim_connect_sock_ex (db_host, db_host, NULL, NULL, SIM_SOCK_OPT_DATAGRAM); } while (slirp->db_chime == INVALID_SOCKET); memset (&pfd, 0, sizeof (pfd)); pfd.fd = slirp->db_chime; pfd.events = G_IO_IN; g_array_append_val(slirp->gpollfds, pfd); slirp->dbit = dbit; slirp->dptr = dptr; sim_slirp_show(slirp, stdout); if (sim_log && (sim_log != stdout)) sim_slirp_show(slirp, sim_log); if (sim_deb && (sim_deb != stdout) && (sim_deb != sim_log)) sim_slirp_show(slirp, sim_deb); } g_free (targs); return slirp; }
void parse_finit_conf(char *file) { FILE *fp; char line[LINE_SIZE]; char cmd[CMD_SIZE]; username = strdup(DEFUSER); hostname = strdup(DEFHOST); rcsd = strdup(FINIT_RCSD); if ((fp = fopen(file, "r")) != NULL) { char *x; const char *err = NULL; _d("Parse %s ...", file); while (!feof(fp)) { if (!fgets(line, sizeof(line), fp)) continue; chomp(line); _d("conf: %s", line); /* Skip comments. */ if (MATCH_CMD(line, "#", x)) continue; /* Do this before mounting / read-write * XXX: Move to plugin which checks /etc/fstab instead */ if (MATCH_CMD(line, "check ", x)) { char *dev = strip_line(x); strcpy(cmd, "/sbin/fsck -C -a "); strlcat(cmd, dev, sizeof(cmd)); run_interactive(cmd, "Checking file system %s", dev); continue; } if (MATCH_CMD(line, "user ", x)) { if (username) free(username); username = strdup(strip_line(x)); continue; } if (MATCH_CMD(line, "host ", x)) { if (hostname) free(hostname); hostname = strdup(strip_line(x)); continue; } if (MATCH_CMD(line, "module ", x)) { char *mod = strip_line(x); strcpy(cmd, "/sbin/modprobe "); strlcat(cmd, mod, sizeof(cmd)); run_interactive(cmd, "Loading kernel module %s", mod); continue; } if (MATCH_CMD(line, "mknod ", x)) { char *dev = strip_line(x); strcpy(cmd, "/bin/mknod "); strlcat(cmd, dev, sizeof(cmd)); run_interactive(cmd, "Creating device node %s", dev); continue; } if (MATCH_CMD(line, "network ", x)) { if (network) free(network); network = strdup(strip_line(x)); continue; } if (MATCH_CMD(line, "runparts ", x)) { if (rcsd) free(rcsd); rcsd = strdup(strip_line(x)); continue; } if (MATCH_CMD(line, "startx ", x)) { svc_register(SVC_CMD_SERVICE, strip_line(x), username); continue; } if (MATCH_CMD(line, "shutdown ", x)) { if (sdown) free(sdown); sdown = strdup(strip_line(x)); continue; } /* The desired runlevel to start when leaving * bootstrap (S). Finit supports 1-9, but most * systems only use 1-6, where 6 is reserved for * reboot */ if (MATCH_CMD(line, "runlevel ", x)) { char *token = strip_line(x); cfglevel = strtonum(token, 1, 9, &err); if (err) cfglevel = RUNLEVEL; if (cfglevel < 1 || cfglevel > 9 || cfglevel == 6) cfglevel = 2; /* Fallback */ continue; } /* Monitored daemon, will be respawned on exit, as * long as the (optional) service callback returns * non-zero */ if (MATCH_CMD(line, "service ", x)) { svc_register(SVC_CMD_SERVICE, x, NULL); continue; } /* One-shot task, will not be respawned. Only runs if * the (optional) service callback returns true */ if (MATCH_CMD(line, "task ", x)) { svc_register(SVC_CMD_TASK, x, NULL); continue; } /* Like task but waits for completion, useful w/ [S] */ if (MATCH_CMD(line, "run ", x)) { svc_register(SVC_CMD_RUN, x, NULL); continue; } if (MATCH_CMD(line, "console ", x)) { if (console) free(console); console = strdup(strip_line(x)); continue; } if (MATCH_CMD(line, "tty ", x)) { tty_register(strip_line(x)); continue; } } fclose(fp); } }
static void parse_static(char *line) { char *x; char cmd[CMD_SIZE]; /* Do this before mounting / read-write * XXX: Move to plugin which checks /etc/fstab instead */ if (MATCH_CMD(line, "check ", x)) { char *dev = strip_line(x); strcpy(cmd, "/sbin/fsck -C -a "); strlcat(cmd, dev, sizeof(cmd)); run_interactive(cmd, "Checking file system %s", dev); return; } if (MATCH_CMD(line, "user ", x)) { if (username) free(username); username = strdup(strip_line(x)); return; } if (MATCH_CMD(line, "host ", x)) { if (hostname) free(hostname); hostname = strdup(strip_line(x)); return; } if (MATCH_CMD(line, "module ", x)) { char *mod = strip_line(x); strcpy(cmd, "/sbin/modprobe "); strlcat(cmd, mod, sizeof(cmd)); run_interactive(cmd, "Loading kernel module %s", mod); return; } if (MATCH_CMD(line, "mknod ", x)) { char *dev = strip_line(x); strcpy(cmd, "/bin/mknod "); strlcat(cmd, dev, sizeof(cmd)); run_interactive(cmd, "Creating device node %s", dev); return; } if (MATCH_CMD(line, "network ", x)) { if (network) free(network); network = strdup(strip_line(x)); return; } if (MATCH_CMD(line, "runparts ", x)) { if (runparts) free(runparts); runparts = strdup(strip_line(x)); return; } if (MATCH_CMD(line, "include ", x)) { char *file = strip_line(x); strlcpy(cmd, file, sizeof(cmd)); if (!fexist(cmd)) { _e("Cannot find include file %s, absolute path required!", x); return; } parse_conf(cmd); return; } if (MATCH_CMD(line, "startx ", x)) { service_register(SVC_TYPE_SERVICE, strip_line(x), 0, username); return; } if (MATCH_CMD(line, "shutdown ", x)) { if (sdown) free(sdown); sdown = strdup(strip_line(x)); return; } /* The desired runlevel to start when leaving bootstrap (S). * Finit supports 1-9, but most systems only use 1-6, where * 6 is reserved for reboot */ if (MATCH_CMD(line, "runlevel ", x)) { char *token = strip_line(x); const char *err = NULL; cfglevel = strtonum(token, 1, 9, &err); if (err) cfglevel = RUNLEVEL; if (cfglevel < 1 || cfglevel > 9 || cfglevel == 6) cfglevel = 2; /* Fallback */ return; } /* TODO: Make console & tty dynamically loadable from /etc/finit.d */ if (MATCH_CMD(line, "console ", x)) { if (console) free(console); console = strdup(strip_line(x)); return; } /* TODO: Make console & tty dynamically loadable from /etc/finit.d */ if (MATCH_CMD(line, "tty ", x)) { tty_register(strip_line(x)); return; } }