wok-next diff syslinux/stuff/extra/md5sum.c @ rev 20197

syslinux: updates from rolling
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Nov 03 15:07:20 2017 +0100 (2017-11-03)
parents 3432c28d8372
children
line diff
     1.1 --- a/syslinux/stuff/extra/md5sum.c	Thu Jul 14 10:16:48 2016 +0200
     1.2 +++ b/syslinux/stuff/extra/md5sum.c	Fri Nov 03 15:07:20 2017 +0100
     1.3 @@ -248,6 +248,10 @@
     1.4   * Licensed under GPLv2 or later, see file LICENSE in this source tree.
     1.5   */
     1.6  
     1.7 +#ifdef EXTRA
     1.8 +#define WITH_UNROCKRIDGE
     1.9 +#endif
    1.10 +#ifdef WITH_UNROCKRIDGE
    1.11  static char *unrockridge(const char *name)
    1.12  {
    1.13  	static char buffer[256];
    1.14 @@ -270,6 +274,7 @@
    1.15  	buffer[i] = 0;
    1.16  	return buffer;
    1.17  }
    1.18 +#endif
    1.19  
    1.20  static uint8_t *hash_file(const char *filename)
    1.21  {
    1.22 @@ -278,9 +283,12 @@
    1.23  	static uint8_t hash_value[16*2+1];
    1.24  
    1.25  	src_fd = open(filename, O_RDONLY);
    1.26 +#ifdef WITH_UNROCKRIDGE
    1.27  	if (src_fd < 0) {
    1.28  		src_fd = open(unrockridge(filename), O_RDONLY);
    1.29  	}
    1.30 +#endif
    1.31 +
    1.32  	if (src_fd < 0) {
    1.33  		return NULL;
    1.34  	}
    1.35 @@ -301,6 +309,7 @@
    1.36  	return hash_value;
    1.37  }
    1.38  
    1.39 +#ifdef EXTRA
    1.40  static int main_say(int argc, char **argv)
    1.41  {
    1.42  	int i;
    1.43 @@ -310,6 +319,7 @@
    1.44  	sleep(5);
    1.45  	return 0;
    1.46  }
    1.47 +#endif
    1.48  
    1.49  static int main_md5sum(int argc, char **argv)
    1.50  {
    1.51 @@ -323,8 +333,10 @@
    1.52  		FILE *fp;
    1.53  		char eol, *line, buffer[4096];
    1.54  		fp = fopen(*argv,"r");
    1.55 +#ifdef WITH_UNROCKRIDGE
    1.56  		if (fp == NULL)
    1.57  			fp = fopen(unrockridge(*argv),"r");
    1.58 +#endif
    1.59  
    1.60  		while ((line = fgets(buffer,sizeof(buffer),fp)) != NULL) {
    1.61  			uint8_t *hash_value;
    1.62 @@ -494,7 +506,7 @@
    1.63      int i;
    1.64  
    1.65      for (i = 1; i < argc; i++) {
    1.66 -	if (!strcmp(argv[i], "-w") || !strcmp(argv[i], "--warm"))
    1.67 +	if (strstr(argv[i], "-w"))
    1.68  	    warm = 1;
    1.69      }
    1.70  
    1.71 @@ -578,22 +590,40 @@
    1.72  {
    1.73      const struct syslinux_keyboard_map *const kmap = syslinux_keyboard_map();
    1.74      size_t map_size, size, i;
    1.75 -    char *kbdmap, *msg;
    1.76 +    char *kbdmap, *msg, *kbdfile, *kbdname;
    1.77 +    int skip = 3;
    1.78  
    1.79      if (argc < 3)
    1.80 -	usage("Usage: kbdmap archive.cpio mapfile [cmdline]..");
    1.81 +	usage("Usage: kbdmap [archive.cpio] [mapfile] [cmdline]..");
    1.82 +
    1.83 +    if (loadfile(kbdfile = argv[1], (void **) &kbdmap, &map_size)) {
    1.84 +	kbdfile = "kbd";
    1.85 +	skip--;
    1.86 +    }
    1.87 +    else {
    1.88 +	free(kbdmap);
    1.89 +    }
    1.90 +
    1.91 +    if (strchr(kbdname = argv[skip-1],'=')) {
    1.92 +	for (i = --skip; argv[i]; i++) {
    1.93 +	    if (!strncmp(argv[i], "kmap=", 5)) {
    1.94 +		kbdname = argv[i] + 5;
    1.95 +		break;
    1.96 +	    }
    1.97 +	}
    1.98 +    }
    1.99  
   1.100      // Save extra cmdline arguments
   1.101 -    setlinuxarg(1, argc - 3, argv + 3);
   1.102 +    setlinuxarg(1, argc - skip, argv + skip);
   1.103  
   1.104      msg="Append to kernel parameters: ";
   1.105 -    for (i = 3; i < (size_t) argc; i++, msg = " ")
   1.106 +    for (i = skip; i < (size_t) argc; i++, msg = " ")
   1.107  	printf("%s%s",msg,argv[i]);
   1.108      printf("\n\n                            Hit RETURN to continue.\n");
   1.109  
   1.110      msg = "Load error";
   1.111      if (kmap->version != 1 ||
   1.112 -	loadfile(argv[1], (void **) &kbdmap, &map_size))
   1.113 +	loadfile(kbdfile, (void **) &kbdmap, &map_size))
   1.114      	goto kbdmap_error;
   1.115      if (* (short *) kbdmap == 0x005D) {
   1.116  	void *p = malloc(map_size = * (long *) (kbdmap + 5));
   1.117 @@ -623,7 +653,7 @@
   1.118  	len = 1 + strlen(name);
   1.119  	i += len;
   1.120  	i += ((-i)&3);
   1.121 -	if (!strcmp(name, argv[2])) {
   1.122 +	if (!strcmp(name, kbdname)) {
   1.123  	    kbdmap += i;
   1.124  	    break;
   1.125  	}
   1.126 @@ -717,6 +747,9 @@
   1.127  }
   1.128  
   1.129  /* Search for a boolean argument; return its position, or 0 if not present */
   1.130 +#if 1
   1.131 +#define find_boolean(a,b)	(find_argument(a,b) != NULL)
   1.132 +#else
   1.133  static int find_boolean(char **argv, const char *argument)
   1.134  {
   1.135      char **arg;
   1.136 @@ -728,49 +761,45 @@
   1.137  
   1.138      return 0;
   1.139  }
   1.140 +#endif
   1.141  
   1.142  static int got_config;
   1.143  static char *custom_cmdline = "";
   1.144  static int custom_initrdlen;
   1.145 -static char *custom_initrdbase;
   1.146 +static int custom_initrdbase;
   1.147  static char *custom_buffer;
   1.148  static struct disk_info diskinfo;
   1.149  
   1.150  static int has_custom_config(void)
   1.151  {
   1.152      const union syslinux_derivative_info *sdi;
   1.153 -    int retry=0;
   1.154      
   1.155      if (got_config)
   1.156      	goto done;
   1.157 +    got_config = -1;
   1.158      sdi = syslinux_derivative_info();
   1.159      if (sdi->c.filesystem != SYSLINUX_FS_ISOLINUX)
   1.160      	goto fail;
   1.161      disk_get_params(sdi->iso.drive_number, &diskinfo);
   1.162      custom_buffer = disk_read_sectors(&diskinfo, 32768 / diskinfo.bps, 1);
   1.163 -    got_config = (*(unsigned long *) (custom_buffer + 80) * 2048) / diskinfo.bps;
   1.164 -    do {
   1.165 -	free(custom_buffer);
   1.166 -	custom_buffer = disk_read_sectors(&diskinfo, got_config, 1);
   1.167 -	if (!memcmp(custom_buffer,"#!boot ",7)) {
   1.168 -	    char *p = custom_buffer+7+32+1;
   1.169 +    got_config = (*(unsigned long *) (custom_buffer + 80)) 
   1.170 +    		 * 2048 / diskinfo.bps;
   1.171 +    free(custom_buffer);
   1.172 +    custom_buffer = disk_read_sectors(&diskinfo, got_config, 1);
   1.173 +    if (!memcmp(custom_buffer,"#!boot ",7)) {
   1.174 +	char *p = custom_buffer+7+32+1;
   1.175  	
   1.176 -    	    if (!memcmp(p,"append=",7)) {
   1.177 -		custom_cmdline = p + 7;
   1.178 -		p = strchr(p,'\n');
   1.179 -		*p++ = 0;
   1.180 -    	    }
   1.181 -    	    if (!memcmp(p,"initrd:",7)) {
   1.182 -    		custom_initrdlen = strtoul(p + 7, &custom_initrdbase, 10);
   1.183 -    		custom_initrdbase++;
   1.184 -    	    }
   1.185 -    	    return 1;
   1.186 -	}
   1.187 -	got_config += 16UL;
   1.188 -	retry = 1 - retry;
   1.189 -    } while (retry);
   1.190 +    	if (!memcmp(p,"append=",7)) {
   1.191 +	    custom_cmdline = p + 7;
   1.192 +	    p = strchr(p,'\n');
   1.193 +	    *p++ = 0;
   1.194 +    	}
   1.195 +    	if (!memcmp(p,"initrd:",7)) {
   1.196 +    	    custom_initrdlen = strtoul(p + 7, &custom_initrdbase, 10);
   1.197 +    	    custom_initrdbase += (got_config << 11) + 1 - (int) custom_buffer;
   1.198 +    	}
   1.199 +    }
   1.200  fail:
   1.201 -    got_config = -1;
   1.202  done:
   1.203      return got_config > 0;
   1.204  }
   1.205 @@ -782,20 +811,15 @@
   1.206      
   1.207      p = *data = malloc(custom_initrdlen);
   1.208      if (!p) return 0;
   1.209 -    len = custom_initrdlen;
   1.210 -    while (1) {
   1.211 -	n = 2048 + custom_buffer - custom_initrdbase;
   1.212 +    for (len = custom_initrdlen; len != 0; len -= n, p += n) {
   1.213 +	free(custom_buffer);
   1.214 +	custom_buffer = disk_read_sectors(&diskinfo, custom_initrdbase >> 11,
   1.215 +					  2048 / diskinfo.bps);
   1.216 +	n = 2048 - (custom_initrdbase & 2047);
   1.217      	if (n > len)
   1.218      	    n = len;
   1.219 -	memcpy(p, custom_initrdbase, n);
   1.220 -	p += n;
   1.221 -	len -= n;
   1.222 -	if (len == 0)
   1.223 -	    break;
   1.224 -	free(custom_buffer);
   1.225 -	got_config += 2048 / diskinfo.bps;
   1.226 -	custom_initrdbase = custom_buffer = 
   1.227 -		disk_read_sectors(&diskinfo, got_config, 2048 / diskinfo.bps);
   1.228 +	memcpy(p, custom_buffer + (custom_initrdbase & 2047), n);
   1.229 +	custom_initrdbase += n;
   1.230      }
   1.231      return 1;
   1.232  }
   1.233 @@ -823,10 +847,10 @@
   1.234  	return NULL;
   1.235  
   1.236      for (arg = argv; *arg; arg++) {
   1.237 -	int len = strlen(*arg);
   1.238 -	memcpy(p, *arg, len);
   1.239 -	p[len] = ' ';
   1.240 -	p += len + 1;
   1.241 +	size = strlen(*arg);
   1.242 +	memcpy(p, *arg, size);
   1.243 +	p[size] = ' ';
   1.244 +	p += size + 1;
   1.245      }
   1.246  
   1.247      for (i = 0; i < 255; i++) {
   1.248 @@ -849,10 +873,7 @@
   1.249      return cmdline;
   1.250  }
   1.251  
   1.252 -static bool __constfunc cpu_has_cpuid(void)
   1.253 -{
   1.254 -    return cpu_has_eflag(X86_EFLAGS_ID);
   1.255 -}
   1.256 +#define cpu_has_cpuid() cpu_has_eflag(X86_EFLAGS_ID)
   1.257  
   1.258  static bool __constfunc cpu_has_level(uint32_t level)
   1.259  {
   1.260 @@ -896,8 +917,10 @@
   1.261  		if (cpu_has_feature(feature)) {
   1.262  			strcat(newfilename, ext);
   1.263  			fd = open(new, O_RDONLY);
   1.264 +#ifdef WITH_UNROCKRIDGE
   1.265  			if (fd < 0)
   1.266  				fd = open(new = unrockridge(new), O_RDONLY);
   1.267 +#endif
   1.268  			if (fd >= 0) {
   1.269  				found = new;
   1.270  				close(fd);
   1.271 @@ -945,6 +968,7 @@
   1.272      const char *initrd_name;
   1.273      struct initramfs *initramfs;
   1.274      struct setup_data *setup_data;
   1.275 +    char *errmsg;
   1.276      char *cmdline;
   1.277      char *boot_image;
   1.278      void *kernel_data;
   1.279 @@ -958,20 +982,20 @@
   1.280      openconsole(&dev_null_r, &dev_stdcon_w);
   1.281  
   1.282      (void)argc;
   1.283 -    argp = argv + 1;
   1.284  
   1.285 -    while ((arg = *argp) && arg[0] == '-') {
   1.286 +    for (argp = argv + 1; (arg = *argp) && arg[0] == '-'; argp++) {
   1.287  	if (!strcmp("-dhcpinfo", arg)) {
   1.288  	    opt_dhcpinfo = true;
   1.289  	} else {
   1.290 -	    fprintf(stderr, "%s: unknown option: %s\n", progname, arg);
   1.291 -	    return 1;
   1.292 +	    errmsg = "%s: unknown option: %s\n";
   1.293 +	    goto unknown_option;
   1.294  	}
   1.295 -	argp++;
   1.296      }
   1.297  
   1.298      if (!arg) {
   1.299 -	fprintf(stderr, "%s: missing kernel name\n", progname);
   1.300 +	errmsg = "%s: missing kernel name\n";
   1.301 +unknown_option:
   1.302 +	fprintf(stderr, errmsg, progname, arg);
   1.303  	return 1;
   1.304      }
   1.305  
   1.306 @@ -980,8 +1004,8 @@
   1.307      errno = 0;
   1.308      boot_image = malloc(strlen(kernel_name) + 12);
   1.309      if (!boot_image) {
   1.310 -	fprintf(stderr, "Error allocating BOOT_IMAGE string: ");
   1.311 -	goto bail;
   1.312 +	errmsg = "Error allocating BOOT_IMAGE string: ";
   1.313 +	goto bailmsg;
   1.314      }
   1.315      strcpy(boot_image, "BOOT_IMAGE=");
   1.316      strcpy(boot_image + 11, kernel_name);
   1.317 @@ -1008,20 +1032,20 @@
   1.318      errno = 0;
   1.319      cmdline = make_cmdline(argp);
   1.320      if (!cmdline) {
   1.321 -	fprintf(stderr, "make_cmdline() failed: ");
   1.322 -	goto bail;
   1.323 +	errmsg = "make_cmdline() failed: ";
   1.324 +	goto bailmsg;
   1.325      }
   1.326  
   1.327      /* Initialize the initramfs chain */
   1.328      errno = 0;
   1.329      initramfs = initramfs_init();
   1.330      if (!initramfs) {
   1.331 -	fprintf(stderr, "initramfs_init() failed: ");
   1.332 -	goto bail;
   1.333 +	errmsg = "initramfs_init() failed: ";
   1.334 +	goto bailmsg;
   1.335      }
   1.336  
   1.337      if ((arg = find_argument(argp, "initrd="))) {
   1.338 -	do {
   1.339 +	while (1) {
   1.340  	    p = strchr(arg, ',');
   1.341  	    if (p)
   1.342  		*p = '\0';
   1.343 @@ -1039,9 +1063,12 @@
   1.344  	    if (!opt_quiet)
   1.345  		printf("ok\n");
   1.346  
   1.347 -	    if (p)
   1.348 -		*p++ = ',';
   1.349 -	} while ((arg = p));
   1.350 +	    if (!p)
   1.351 +		break;
   1.352 +
   1.353 +	    *p++ = ',';
   1.354 +	    arg = p;
   1.355 +	}
   1.356      }
   1.357  
   1.358      /* Append the DHCP info */
   1.359 @@ -1050,8 +1077,8 @@
   1.360  	errno = 0;
   1.361  	if (initramfs_add_file(initramfs, dhcpdata, dhcplen, dhcplen,
   1.362  			       "/dhcpinfo.dat", 0, 0755)) {
   1.363 -	    fprintf(stderr, "Unable to add DHCP info: ");
   1.364 -	    goto bail;
   1.365 +	    errmsg = "Unable to add DHCP info: ";
   1.366 +	    goto bailmsg;
   1.367  	}
   1.368      }
   1.369  
   1.370 @@ -1078,10 +1105,7 @@
   1.371  	    char *ep;
   1.372  
   1.373  	    type = strtoul(arg + 5, &ep, 10);
   1.374 -	    if (ep[0] != '=' || !ep[1])
   1.375 -		continue;
   1.376 -
   1.377 -	    if (!type)
   1.378 +	    if (!type || ep[0] != '=' || !ep[1])
   1.379  		continue;
   1.380  
   1.381  	    if (setup_data_file(setup_data, type, ep+1, opt_quiet))
   1.382 @@ -1093,27 +1117,28 @@
   1.383      errno = 0;
   1.384      syslinux_boot_linux(kernel_data, kernel_len, initramfs,
   1.385  			setup_data, cmdline);
   1.386 -    fprintf(stderr, "syslinux_boot_linux() failed: ");
   1.387 +    errmsg = "syslinux_boot_linux() failed: ";
   1.388  
   1.389 +bailmsg:
   1.390 +    fprintf(stderr, errmsg);
   1.391  bail:
   1.392 +    errmsg = "Error %d";
   1.393      switch(errno) {
   1.394      case ENOENT:
   1.395 -	fprintf(stderr, "File not found\n");
   1.396 +	errmsg = "File not found";
   1.397  	break;
   1.398      case ENOMEM:
   1.399 -	fprintf(stderr, "Out of memory\n");
   1.400 -	break;
   1.401 -    default:
   1.402 -	fprintf(stderr, "Error %d\n", errno);
   1.403 -	break;
   1.404 +	errmsg = "Out of memory";
   1.405      }
   1.406 -    fprintf(stderr, "%luM RAM found on this %s bits machine.\n",
   1.407 +    fprintf(stderr, errmsg, errno);
   1.408 +    fprintf(stderr, "\n%luM RAM and %s bit cpu found.\n%s: Boot aborted!\n",
   1.409  		    memory_size() >> 10,
   1.410 -    		    cpu_has_feature(X86_FEATURE_LM) ? "64": "32");
   1.411 -    fprintf(stderr, "%s: Boot aborted!\n", progname);
   1.412 +    		    cpu_has_feature(X86_FEATURE_LM) ? "64": "32",
   1.413 +		    progname);
   1.414      return 1;
   1.415  }
   1.416  
   1.417 +#ifdef EXTRA
   1.418  static int main_setarg(int argc, char *argv[])
   1.419  {
   1.420  	if (argc < 3) {
   1.421 @@ -1191,6 +1216,7 @@
   1.422      sleep(5);
   1.423      return 0;
   1.424  }
   1.425 +#endif
   1.426  
   1.427  int main(int argc, char *argv[])
   1.428  {
   1.429 @@ -1199,16 +1225,19 @@
   1.430  		char *name;
   1.431  		int (*main)(int argc, char *argv[]);
   1.432  	} bin[] = {
   1.433 +#ifdef EXTRA
   1.434  		{ "say",	main_say      },
   1.435 -		{ "md5sum",	main_md5sum   },
   1.436 -		{ "ifmem",	main_ifmem    },
   1.437 -		{ "reboot",	main_reboot   },
   1.438 -		{ "poweroff",	main_poweroff },
   1.439 -		{ "kbdmap",	main_kbdmap   },
   1.440 -		{ "linux",	main_linux    },
   1.441  		{ "setarg",	main_setarg   },
   1.442  		{ "ifarg",	main_ifarg    },
   1.443 -		{ "listarg",	main_listarg  }
   1.444 +		{ "listarg",	main_listarg  },
   1.445 +#endif
   1.446 +		{ "kbdmap",	main_kbdmap   },
   1.447 +		{ "kbd",	main_kbdmap   },
   1.448 +		{ "ifmem",	main_ifmem    },
   1.449 +		{ "linux",	main_linux    },
   1.450 +		{ "md5sum",	main_md5sum   },
   1.451 +		{ "reboot",	main_reboot   },
   1.452 +		{ "poweroff",	main_poweroff }
   1.453  	};
   1.454  
   1.455  	openconsole(&dev_null_r, &dev_stdcon_w);