summaryrefslogtreecommitdiffstats
path: root/loader2/loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'loader2/loader.c')
-rw-r--r--loader2/loader.c127
1 files changed, 70 insertions, 57 deletions
diff --git a/loader2/loader.c b/loader2/loader.c
index 1dd55d907..56f2e7860 100644
--- a/loader2/loader.c
+++ b/loader2/loader.c
@@ -21,7 +21,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-
#include <ctype.h>
#include <errno.h>
#include <execinfo.h>
@@ -423,62 +422,76 @@ static void writeVNCPasswordFile(char *pfile, char *password) {
/* read information from /tmp/netinfo (written by linuxrc) */
static void readNetInfo(struct loaderData_s ** ld) {
- struct loaderData_s * loaderData = *ld;
- FILE *f;
- char *end;
- char buf[100], *vname, *vparm;
-
- f = fopen("/tmp/netinfo", "r");
- if (!f) {
- return;
- }
- vname = (char *)malloc(sizeof(char)*15);
- vparm = (char *)malloc(sizeof(char)*85);
-
- while(fgets(buf, 100, f)) {
- if ((vname = strtok(buf, "="))) {
- vparm = strtok(NULL, "=");
- while (isspace(*vparm))
- vparm++;
- end = strchr(vparm, '\0');
- while (isspace(*end))
- end--;
- end++;
- *end = '\0';
- if (strstr(vname, "IPADDR")) {
- loaderData->ip = strdup(vparm);
- loaderData->ipinfo_set = 1;
- }
- if (strstr(vname, "NETMASK")) {
- loaderData->netmask = strdup(vparm);
- }
- if (strstr(vname, "GATEWAY")) {
- loaderData->gateway = strdup(vparm);
- }
- if (strstr(vname, "DNS")) {
- loaderData->dns = strdup(vparm);
- }
- if (strstr(vname, "MTU")) {
- loaderData->mtu = atoi(vparm);
- }
- if (strstr(vname, "PEERID")) {
- loaderData->peerid = strdup(vparm);
- }
- if (strstr(vname, "SUBCHANNELS")) {
- loaderData->subchannels = strdup(vparm);
- }
- if (strstr(vname, "PORTNAME")) {
- loaderData->portname = strdup(vparm);
- }
- if (strstr(vname, "NETTYPE")) {
- loaderData->nettype = strdup(vparm);
- }
- if (strstr(vname, "CTCPROT")) {
- loaderData->ctcprot = strdup(vparm);
- }
- }
- }
- fclose(f);
+ int i;
+ struct loaderData_s * loaderData = *ld;
+ FILE *f;
+ /* FIXME: arbitrary size that works, but could blow up in the future */
+ int bufsiz = 100;
+ char buf[bufsiz], *vname, *vparm;
+
+ f = fopen("/tmp/netinfo", "r");
+ if (!f)
+ return;
+
+ /* FIXME: static buffers lead to pain */
+ vname = (char *)malloc(sizeof(char)*15);
+ vparm = (char *)malloc(sizeof(char)*85);
+
+ /*
+ * The /tmp/netinfo file is written out by /sbin/init on s390x (which is
+ * really the linuxrc.s390 script). It's a shell-sourcable file with
+ * various system settings needing for the system instance.
+ *
+ * The goal of this function is to read in only the network settings
+ * and populate the loaderData structure.
+ */
+ while(fgets(buf, bufsiz, f)) {
+ /* trim whitespace from end */
+ i = 0;
+ while (!isspace(buf[i]) && i < (bufsiz-1))
+ i++;
+ buf[i] = '\0';
+
+ /* break up var name and value */
+ if (strstr(buf, "=")) {
+ vname = strtok(buf, "=");
+ vparm = strtok(NULL, "=");
+
+ if (!strncmp(vname, "IPADDR", 6)) {
+ loaderData->ip = strdup(vparm);
+ loaderData->ipinfo_set = 1;
+ }
+
+ if (!strncmp(vname, "NETMASK", 7))
+ loaderData->netmask = strdup(vparm);
+
+ if (!strncmp(vname, "GATEWAY", 7))
+ loaderData->gateway = strdup(vparm);
+
+ if (!strncmp(vname, "DNS", 3))
+ loaderData->dns = strdup(vparm);
+
+ if (!strncmp(vname, "MTU", 3))
+ loaderData->mtu = atoi(vparm);
+
+ if (!strncmp(vname, "PEERID", 6))
+ loaderData->peerid = strdup(vparm);
+
+ if (!strncmp(vname, "SUBCHANNELS", 12))
+ loaderData->subchannels = strdup(vparm);
+
+ if (!strncmp(vname, "PORTNAME", 8))
+ loaderData->portname = strdup(vparm);
+
+ if (!strncmp(vname, "NETTYPE", 7))
+ loaderData->nettype = strdup(vparm);
+
+ if (!strncmp(vname, "CTCPROT", 7))
+ loaderData->ctcprot = strdup(vparm);
+ }
+ }
+
+ fclose(f);
}
/* parse anaconda or pxelinux-style ip= arguments