vkernel(7) - Permit multiple -e options to pass environment variables
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Tue, 9 Aug 2011 19:34:35 +0000 (21:34 +0200)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Tue, 9 Aug 2011 19:37:23 +0000 (21:37 +0200)
             to the virtual kernel environment.

* kern_envp is a zero-separated string which ends with two zero chars.
  Now every -e option is added to kern_envp so that when the kenv_init
  parses the static envirorment it can process it properly.

share/man/man7/vkernel.7
sys/platform/vkernel/platform/init.c
sys/platform/vkernel64/platform/init.c

index bbf7356..c21dd56 100644 (file)
@@ -29,7 +29,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd March 28, 2010
+.Dd August 9, 2011
 .Dt VKERNEL 7
 .Os
 .Sh NAME
@@ -83,6 +83,7 @@ option specified on the command line will be the boot disk.
 The CD9660 filesystem is assumed when booting from this media.
 .It Fl e Ar name Ns = Ns Li value : Ns Ar name Ns = Ns Li value : Ns ...
 Specify an environment to be used by the kernel.
+This option can be specified more than once.
 .It Fl h
 Shows a list of available options, each with a short description.
 .It Fl i Ar file
index dc9fb9e..fc5a910 100644 (file)
@@ -148,6 +148,7 @@ main(int ac, char **av)
        char *cdFile[VKDISK_MAX];
        char *suffix;
        char *endp;
+       char *tmp;
        int netifFileNum = 0;
        int diskFileNum = 0;
        int cdFileNum = 0;
@@ -157,12 +158,19 @@ main(int ac, char **av)
        int j;
        int n;
        int isq;
+       int pos;
+       int eflag;
        int real_vkernel_enable;
        int supports_sse;
        size_t vsize;
+       size_t kenv_size;
+       size_t kenv_size2;
        
        save_ac = ac;
        save_av = av;
+       eflag = 0;
+       pos = 0;
+       kenv_size = 0;
 
        /*
         * Process options
@@ -202,8 +210,22 @@ main(int ac, char **av)
                         */
                        n = strlen(optarg);
                        isq = 0;
-                       kern_envp = malloc(n + 2);
-                       for (i = j = 0; i < n; ++i) {
+
+                       if (eflag == 0) {
+                               kenv_size = n + 2;
+                               kern_envp = malloc(kenv_size);
+                               if (kern_envp == NULL)
+                                       errx(1, "Couldn't allocate %zd bytes for kern_envp", kenv_size);
+                       } else {
+                               kenv_size2 = kenv_size + n + 1;
+                               pos = kenv_size - 1;
+                               if ((tmp = realloc(kern_envp, kenv_size2)) == NULL)
+                                       errx(1, "Couldn't reallocate %zd bytes for kern_envp", kenv_size2);
+                               kern_envp = tmp;
+                               kenv_size = kenv_size2;
+                       }
+
+                       for (i = 0, j = pos; i < n; ++i) {
                                if (optarg[i] == '"')
                                        isq ^= 1;
                                else if (optarg[i] == '\'')
@@ -215,6 +237,7 @@ main(int ac, char **av)
                        }
                        kern_envp[j++] = 0;
                        kern_envp[j++] = 0;
+                       eflag++;
                        break;
                case 's':
                        boothowto |= RB_SINGLE;
index 33ed964..e6df1f3 100644 (file)
@@ -147,6 +147,7 @@ main(int ac, char **av)
        char *cdFile[VKDISK_MAX];
        char *suffix;
        char *endp;
+       char *tmp;
        int netifFileNum = 0;
        int diskFileNum = 0;
        int cdFileNum = 0;
@@ -156,12 +157,19 @@ main(int ac, char **av)
        int j;
        int n;
        int isq;
+       int pos;
+       int eflag;
        int real_vkernel_enable;
        int supports_sse;
        size_t vsize;
+       size_t kenv_size;
+       size_t kenv_size2;
 
        save_ac = ac;
        save_av = av;
+       eflag = 0;
+       pos = 0;
+       kenv_size = 0;
 
        /*
         * Process options
@@ -201,8 +209,22 @@ main(int ac, char **av)
                         */
                        n = strlen(optarg);
                        isq = 0;
-                       kern_envp = malloc(n + 2);
-                       for (i = j = 0; i < n; ++i) {
+
+                       if (eflag == 0) {
+                               kenv_size = n + 2;
+                               kern_envp = malloc(kenv_size);
+                               if (kern_envp == NULL)
+                                       errx(1, "Couldn't allocate %zd bytes for kern_envp", kenv_size);
+                       } else {
+                               kenv_size2 = kenv_size + n + 1;
+                               pos = kenv_size - 1;
+                               if ((tmp = realloc(kern_envp, kenv_size2)) == NULL)
+                                       errx(1, "Couldn't reallocate %zd bytes for kern_envp", kenv_size2);
+                               kern_envp = tmp;
+                               kenv_size = kenv_size2;
+                       }
+
+                       for (i = 0, j = pos; i < n; ++i) {
                                if (optarg[i] == '"')
                                        isq ^= 1;
                                else if (optarg[i] == '\'')
@@ -214,6 +236,7 @@ main(int ac, char **av)
                        }
                        kern_envp[j++] = 0;
                        kern_envp[j++] = 0;
+                       eflag++;
                        break;
                case 's':
                        boothowto |= RB_SINGLE;