Changeset 4410

Show
Ignore:
Timestamp:
10/10/08 13:20:04 (3 months ago)
Author:
martin
Message:

set guest-specific kernel parameters
removed memory setting, use mem= instead

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/dumm/dumm.c

    r4306 r4410  
    5353 */ 
    5454static guest_t* create_guest(private_dumm_t *this, char *name, char *kernel,  
    55                              char *master, int mem
    56 { 
    57     guest_t *guest; 
    58      
    59     guest = guest_create(this->guest_dir, name, kernel, master, mem); 
     55                             char *master, char *args
     56{ 
     57    guest_t *guest; 
     58     
     59    guest = guest_create(this->guest_dir, name, kernel, master, args); 
    6060    if (guest) 
    6161    { 
     
    259259    private_dumm_t *this = malloc_thing(private_dumm_t); 
    260260     
    261     this->public.create_guest = (guest_t*(*)(dumm_t*,char*,char*,char*,int))create_guest; 
     261    this->public.create_guest = (guest_t*(*)(dumm_t*,char*,char*,char*,char*))create_guest; 
    262262    this->public.create_guest_enumerator = (enumerator_t*(*)(dumm_t*))create_guest_enumerator; 
    263263    this->public.delete_guest = (void(*)(dumm_t*,guest_t*))delete_guest; 
  • trunk/src/dumm/dumm.h

    r4306 r4410  
    4141     * @param kernel    UML kernel to use for guest 
    4242     * @param master    mounted read only master filesystem 
    43      * @param mem      amount of memory for guest, in MB 
     43     * @param args     additional args to pass to kernel 
    4444     * @return          guest if started, NULL if failed 
    4545     */ 
    4646    guest_t* (*create_guest) (dumm_t *this, char *name, char *kernel,  
    47                               char *master, int mem); 
     47                              char *master, char *args); 
    4848     
    4949    /** 
  • trunk/src/dumm/ext/dumm.c

    r4306 r4410  
    4747    pid_t pid; 
    4848     
    49     args[argc++] = "con0=xterm"; 
    50     args[argc++] = "xterm=gnome-terminal,-t,-x"; 
    51      
    5249    pid = fork(); 
    5350    switch (pid) 
     
    146143 
    147144static VALUE guest_new(VALUE class, VALUE name, VALUE kernel, 
    148                        VALUE master, VALUE mem
     145                       VALUE master, VALUE args
    149146{ 
    150147    guest_t *guest; 
    151148     
    152149    guest = dumm->create_guest(dumm, StringValuePtr(name), StringValuePtr(kernel), 
    153                                StringValuePtr(master), FIX2INT(mem)); 
     150                               StringValuePtr(master), StringValuePtr(args)); 
    154151    if (!guest) 
    155152    { 
  • trunk/src/dumm/guest.c

    r4306 r4410  
    4343#define DIFF_DIR "diff" 
    4444#define UNION_DIR "union" 
    45 #define MEMORY_FILE "mem
     45#define ARGS_FILE "args
    4646#define PID_FILE "pid" 
    4747#define KERNEL_FILE "linux" 
     
    6161    /** directory name of guest */ 
    6262    char *dirname; 
    63     /** amount of memory for guest, in MB */ 
    64     int mem
     63    /** additional args to pass to guest */ 
     64    char *args
    6565    /** pid of guest child process */ 
    6666    int pid; 
     
    266266    args[i++] = write_arg(&pos, &left, "uml_dir=%s", this->dirname); 
    267267    args[i++] = write_arg(&pos, &left, "umid=%s", this->name); 
    268     args[i++] = write_arg(&pos, &left, "mem=%dM", this->mem); 
    269268    args[i++] = write_arg(&pos, &left, "mconsole=notify:%s", notify); 
    270269    args[i++] = write_arg(&pos, &left, "con=null"); 
     270    if (this->args) 
     271    { 
     272        args[i++] = this->args; 
     273    } 
    271274       
    272275    this->pid = invoke(data, &this->public, args, i); 
     
    491494 
    492495/** 
    493  * load memory configuration from file 
    494  */ 
    495 int loadmem(private_guest_t *this) 
     496 * load args configuration from file 
     497 */ 
     498char *loadargs(private_guest_t *this) 
    496499{ 
    497500    FILE *file; 
    498     int mem = 0
    499      
    500     file = fdopen(openat(this->dir, MEMORY_FILE, O_RDONLY, PERM), "r"); 
     501    char buf[512], *args = NULL
     502     
     503    file = fdopen(openat(this->dir, ARGS_FILE, O_RDONLY, PERM), "r"); 
    501504    if (file) 
    502505    { 
    503         if (fscanf(file, "%d", &mem) <= 0
    504         { 
    505             mem = 0
     506        if (fgets(buf, sizeof(buf), file)
     507        { 
     508            args = strdup(buf)
    506509        } 
    507510        fclose(file); 
    508511    } 
    509     return mem
    510 } 
    511  
    512 /** 
    513  * save memory configuration to file 
    514  */ 
    515 bool savemem(private_guest_t *this, int mem
     512    return args
     513} 
     514 
     515/** 
     516 * save args configuration to file 
     517 */ 
     518bool saveargs(private_guest_t *this, char *args
    516519{ 
    517520    FILE *file; 
    518521    bool retval = FALSE; 
    519522     
    520     file = fdopen(openat(this->dir, MEMORY_FILE, O_RDWR | O_CREAT | O_TRUNC, 
     523    file = fdopen(openat(this->dir, ARGS_FILE, O_RDWR | O_CREAT | O_TRUNC, 
    521524                         PERM), "w"); 
    522525    if (file) 
    523526    { 
    524         if (fprintf(file, "%d", mem) > 0) 
     527        if (fprintf(file, "%s", args) > 0) 
    525528        { 
    526529            retval = TRUE; 
     
    544547    this->ifaces->destroy(this->ifaces); 
    545548    free(this->dirname); 
     549    free(this->args); 
    546550    free(this->name); 
    547551    free(this); 
     
    595599    this->mconsole = NULL; 
    596600    this->ifaces = linked_list_create(); 
    597     this->mem = 0
     601    this->args = NULL
    598602    this->name = strdup(name); 
    599603    this->cowfs = NULL; 
     
    626630 */ 
    627631guest_t *guest_create(char *parent, char *name, char *kernel, 
    628                       char *master, int mem
     632                      char *master, char *args
    629633{ 
    630634    private_guest_t *this = guest_create_generic(parent, name, TRUE); 
     
    651655    } 
    652656     
    653     this->mem = mem
    654     if (!savemem(this, mem)) 
     657    this->args = args
     658    if (args && !saveargs(this, args)) 
    655659    { 
    656660        destroy(this); 
     
    679683    } 
    680684     
    681     this->mem = loadmem(this); 
    682     if (this->mem == 0) 
    683     { 
    684        DBG1("unable to open memory configuration file: %m", name); 
     685    this->args = loadargs(this); 
     686     
     687    if (!mount_unionfs(this)) 
     688    { 
    685689        destroy(this); 
    686690        return NULL; 
    687691    } 
    688692     
    689     if (!mount_unionfs(this)) 
    690     { 
    691         destroy(this); 
    692         return NULL; 
    693     } 
    694      
    695693    return &this->public; 
    696694} 
  • trunk/src/dumm/guest.h

    r4251 r4410  
    188188 * @param kernel    kernel this guest uses 
    189189 * @param master    read-only master filesystem for guest 
     190 * @param args      additional args to pass to kernel 
    190191 * @param mem       amount of memory to give the guest 
    191192 */ 
    192193guest_t *guest_create(char *parent, char *name, char *kernel, 
    193                       char *master, int mem); 
     194                      char *master, char *args); 
    194195 
    195196/** 
  • trunk/src/dumm/main.c

    r3957 r4410  
    101101                    char *args[], int argc) 
    102102{ 
    103     args[argc] = "con0=fd:0,fd:1"; 
    104103    return vte_terminal_fork_command(VTE_TERMINAL(vte), args[0], args, NULL, 
    105104                                     NULL, FALSE, FALSE, FALSE); 
     
    375374{ 
    376375    guest_t *guest; 
    377     GtkWidget *dialog, *table, *label, *name, *kernel, *master, *memory
     376    GtkWidget *dialog, *table, *label, *name, *kernel, *master, *args
    378377     
    379378    dialog = gtk_dialog_new_with_buttons("Create new guest", GTK_WINDOW(window), 
     
    397396    gtk_widget_show(label); 
    398397     
    399     label = gtk_label_new("Memory (MB)"); 
     398    label = gtk_label_new("Kernel arguments"); 
    400399    gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4, 0, 0, 0, 0); 
    401400    gtk_widget_show(label); 
     
    418417    gtk_widget_show(master); 
    419418     
    420     memory = gtk_spin_button_new_with_range(1, 4096, 1); 
    421     gtk_spin_button_set_digits(GTK_SPIN_BUTTON(memory), 0); 
    422     gtk_table_attach(GTK_TABLE(table), memory, 1, 2, 3, 4, 
     419    args = gtk_entry_new(); 
     420    gtk_table_attach(GTK_TABLE(table), args, 1, 2, 3, 4, 
    423421                     GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 0, 0); 
    424     gtk_widget_show(memory); 
     422    gtk_widget_show(args); 
    425423     
    426424    gtk_widget_show(table); 
     
    432430            case GTK_RESPONSE_ACCEPT: 
    433431            { 
    434                 char *sname, *skernel, *smaster
     432                char *sname, *skernel, *smaster, *sargs
    435433                page_t *page; 
    436434                 
     
    438436                skernel = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(kernel)); 
    439437                smaster = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(master)); 
     438                sargs = (char*)gtk_entry_get_text(GTK_ENTRY(args)); 
    440439             
    441440                if (!sname[0] || !skernel || !smaster) 
     
    443442                    continue; 
    444443                } 
    445                 guest = dumm->create_guest(dumm, sname, skernel, smaster,  
    446                             gtk_spin_button_get_value(GTK_SPIN_BUTTON(memory))); 
     444                guest = dumm->create_guest(dumm, sname, skernel, smaster, sargs); 
    447445                if (!guest) 
    448446                {