diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 96 |
1 files changed, 50 insertions, 46 deletions
diff --git a/shell/ash.c b/shell/ash.c index ab2b0628f..b34ed67a7 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -16253,24 +16253,24 @@ tblentry_copy(struct tblentry *tep) | |||
16253 | } | 16253 | } |
16254 | 16254 | ||
16255 | static struct datasize | 16255 | static struct datasize |
16256 | cmdtable_size(struct datasize ds, struct tblentry **cmdtablep) | 16256 | cmdtable_size(struct datasize ds) |
16257 | { | 16257 | { |
16258 | int i; | 16258 | int i; |
16259 | ds.funcblocksize += sizeof(struct tblentry *)*CMDTABLESIZE; | 16259 | ds.funcblocksize += sizeof(struct tblentry *)*CMDTABLESIZE; |
16260 | for (i = 0; i < CMDTABLESIZE; i++) | 16260 | for (i = 0; i < CMDTABLESIZE; i++) |
16261 | ds = tblentry_size(ds, cmdtablep[i]); | 16261 | ds = tblentry_size(ds, cmdtable[i]); |
16262 | return ds; | 16262 | return ds; |
16263 | } | 16263 | } |
16264 | 16264 | ||
16265 | static struct tblentry ** | 16265 | static struct tblentry ** |
16266 | cmdtable_copy(struct tblentry **cmdtablep) | 16266 | cmdtable_copy(void) |
16267 | { | 16267 | { |
16268 | struct tblentry **new = funcblock; | 16268 | struct tblentry **new = funcblock; |
16269 | int i; | 16269 | int i; |
16270 | 16270 | ||
16271 | funcblock = (char *) funcblock + sizeof(struct tblentry *)*CMDTABLESIZE; | 16271 | funcblock = (char *) funcblock + sizeof(struct tblentry *)*CMDTABLESIZE; |
16272 | for (i = 0; i < CMDTABLESIZE; i++) { | 16272 | for (i = 0; i < CMDTABLESIZE; i++) { |
16273 | new[i] = tblentry_copy(cmdtablep[i]); | 16273 | new[i] = tblentry_copy(cmdtable[i]); |
16274 | SAVE_PTR(new[i], xasprintf("cmdtable[%d]", i), FREE); | 16274 | SAVE_PTR(new[i], xasprintf("cmdtable[%d]", i), FREE); |
16275 | } | 16275 | } |
16276 | return new; | 16276 | return new; |
@@ -16294,24 +16294,24 @@ SAVE_PTR((*vpp)->val, xasprintf("(*vpp)->val '%s'", vp->val ?: "NULL"), FREE); | |||
16294 | SLIST_COPY_END() | 16294 | SLIST_COPY_END() |
16295 | 16295 | ||
16296 | static struct datasize | 16296 | static struct datasize |
16297 | atab_size(struct datasize ds, struct alias **atabp) | 16297 | atab_size(struct datasize ds) |
16298 | { | 16298 | { |
16299 | int i; | 16299 | int i; |
16300 | ds.funcblocksize += sizeof(struct alias *)*ATABSIZE; | 16300 | ds.funcblocksize += sizeof(struct alias *)*ATABSIZE; |
16301 | for (i = 0; i < ATABSIZE; i++) | 16301 | for (i = 0; i < ATABSIZE; i++) |
16302 | ds = alias_size(ds, atabp[i]); | 16302 | ds = alias_size(ds, atab[i]); |
16303 | return ds; | 16303 | return ds; |
16304 | } | 16304 | } |
16305 | 16305 | ||
16306 | static struct alias ** | 16306 | static struct alias ** |
16307 | atab_copy(struct alias **atabp) | 16307 | atab_copy(void) |
16308 | { | 16308 | { |
16309 | struct alias **new = funcblock; | 16309 | struct alias **new = funcblock; |
16310 | int i; | 16310 | int i; |
16311 | 16311 | ||
16312 | funcblock = (char *) funcblock + sizeof(struct alias *)*ATABSIZE; | 16312 | funcblock = (char *) funcblock + sizeof(struct alias *)*ATABSIZE; |
16313 | for (i = 0; i < ATABSIZE; i++) { | 16313 | for (i = 0; i < ATABSIZE; i++) { |
16314 | new[i] = alias_copy(atabp[i]); | 16314 | new[i] = alias_copy(atab[i]); |
16315 | SAVE_PTR(new[i], xasprintf("atab[%d]", i), FREE); | 16315 | SAVE_PTR(new[i], xasprintf("atab[%d]", i), FREE); |
16316 | } | 16316 | } |
16317 | return new; | 16317 | return new; |
@@ -16361,9 +16361,10 @@ argv_copy(char **p) | |||
16361 | 16361 | ||
16362 | #if MAX_HISTORY | 16362 | #if MAX_HISTORY |
16363 | static struct datasize | 16363 | static struct datasize |
16364 | history_size(struct datasize ds, line_input_t *st) | 16364 | history_size(struct datasize ds) |
16365 | { | 16365 | { |
16366 | int i; | 16366 | int i; |
16367 | line_input_t *st = line_input_state; | ||
16367 | 16368 | ||
16368 | ds.funcblocksize += sizeof(char *) * st->cnt_history; | 16369 | ds.funcblocksize += sizeof(char *) * st->cnt_history; |
16369 | for (i = 0; i < st->cnt_history; i++) { | 16370 | for (i = 0; i < st->cnt_history; i++) { |
@@ -16373,8 +16374,9 @@ history_size(struct datasize ds, line_input_t *st) | |||
16373 | } | 16374 | } |
16374 | 16375 | ||
16375 | static char ** | 16376 | static char ** |
16376 | history_copy(line_input_t *st) | 16377 | history_copy(void) |
16377 | { | 16378 | { |
16379 | line_input_t *st = line_input_state; | ||
16378 | char **new = funcblock; | 16380 | char **new = funcblock; |
16379 | int i; | 16381 | int i; |
16380 | 16382 | ||
@@ -16421,30 +16423,31 @@ redirtab_copy(struct redirtab *rdtp) | |||
16421 | return start; | 16423 | return start; |
16422 | } | 16424 | } |
16423 | 16425 | ||
16424 | #undef funcname | ||
16425 | #undef shellparam | ||
16426 | #undef redirlist | ||
16427 | #undef vartab | ||
16428 | static struct datasize | 16426 | static struct datasize |
16429 | globals_var_size(struct datasize ds, struct globals_var *gvp) | 16427 | globals_var_size(struct datasize ds) |
16430 | { | 16428 | { |
16431 | int i; | 16429 | int i; |
16432 | 16430 | ||
16433 | ds.funcblocksize += sizeof(struct globals_var); | 16431 | ds.funcblocksize += sizeof(struct globals_var); |
16434 | ds.funcstringsize += align_len(gvp->funcname); | 16432 | ds.funcstringsize += align_len(funcname); |
16435 | ds = argv_size(ds, gvp->shellparam.p); | 16433 | ds = argv_size(ds, shellparam.p); |
16436 | ds.funcblocksize = redirtab_size(ds.funcblocksize, gvp->redirlist); | 16434 | ds.funcblocksize = redirtab_size(ds.funcblocksize, redirlist); |
16437 | for (i = 0; i < VTABSIZE; i++) | 16435 | for (i = 0; i < VTABSIZE; i++) |
16438 | ds = var_size(ds, gvp->vartab[i]); | 16436 | ds = var_size(ds, vartab[i]); |
16439 | return ds; | 16437 | return ds; |
16440 | } | 16438 | } |
16441 | 16439 | ||
16440 | #undef funcname | ||
16441 | #undef shellparam | ||
16442 | #undef redirlist | ||
16443 | #undef vartab | ||
16442 | static struct globals_var * | 16444 | static struct globals_var * |
16443 | globals_var_copy(struct globals_var *gvp) | 16445 | globals_var_copy(void) |
16444 | { | 16446 | { |
16445 | int i; | 16447 | int i; |
16446 | struct globals_var *new; | 16448 | struct globals_var *gvp, *new; |
16447 | 16449 | ||
16450 | gvp = ash_ptr_to_globals_var; | ||
16448 | new = funcblock; | 16451 | new = funcblock; |
16449 | funcblock = (char *) funcblock + sizeof(struct globals_var); | 16452 | funcblock = (char *) funcblock + sizeof(struct globals_var); |
16450 | memcpy(new, gvp, sizeof(struct globals_var)); | 16453 | memcpy(new, gvp, sizeof(struct globals_var)); |
@@ -16468,29 +16471,30 @@ globals_var_copy(struct globals_var *gvp) | |||
16468 | return new; | 16471 | return new; |
16469 | } | 16472 | } |
16470 | 16473 | ||
16471 | #undef minusc | ||
16472 | #undef curdir | ||
16473 | #undef physdir | ||
16474 | #undef arg0 | ||
16475 | #undef commandname | ||
16476 | #undef nullstr | ||
16477 | static struct datasize | 16474 | static struct datasize |
16478 | globals_misc_size(struct datasize ds, struct globals_misc *p) | 16475 | globals_misc_size(struct datasize ds) |
16479 | { | 16476 | { |
16480 | ds.funcblocksize += sizeof(struct globals_misc); | 16477 | ds.funcblocksize += sizeof(struct globals_misc); |
16481 | ds.funcstringsize += align_len(p->minusc); | 16478 | ds.funcstringsize += align_len(minusc); |
16482 | if (p->curdir != p->nullstr) | 16479 | if (curdir != nullstr) |
16483 | ds.funcstringsize += align_len(p->curdir); | 16480 | ds.funcstringsize += align_len(curdir); |
16484 | if (p->physdir != p->nullstr) | 16481 | if (physdir != nullstr) |
16485 | ds.funcstringsize += align_len(p->physdir); | 16482 | ds.funcstringsize += align_len(physdir); |
16486 | ds.funcstringsize += align_len(p->arg0); | 16483 | ds.funcstringsize += align_len(arg0); |
16487 | ds.funcstringsize += align_len(p->commandname); | 16484 | ds.funcstringsize += align_len(commandname); |
16488 | return ds; | 16485 | return ds; |
16489 | } | 16486 | } |
16490 | 16487 | ||
16488 | #undef minusc | ||
16489 | #undef curdir | ||
16490 | #undef physdir | ||
16491 | #undef arg0 | ||
16492 | #undef commandname | ||
16493 | #undef nullstr | ||
16491 | static struct globals_misc * | 16494 | static struct globals_misc * |
16492 | globals_misc_copy(struct globals_misc *p) | 16495 | globals_misc_copy(void) |
16493 | { | 16496 | { |
16497 | struct globals_misc *p = ash_ptr_to_globals_misc; | ||
16494 | struct globals_misc *new = funcblock; | 16498 | struct globals_misc *new = funcblock; |
16495 | 16499 | ||
16496 | funcblock = (char *) funcblock + sizeof(struct globals_misc); | 16500 | funcblock = (char *) funcblock + sizeof(struct globals_misc); |
@@ -16521,20 +16525,20 @@ forkshell_size(struct forkshell *fs) | |||
16521 | if (fs->fpid == FS_OPENHERE) | 16525 | if (fs->fpid == FS_OPENHERE) |
16522 | return ds; | 16526 | return ds; |
16523 | 16527 | ||
16524 | ds = globals_var_size(ds, ash_ptr_to_globals_var); | 16528 | ds = globals_var_size(ds); |
16525 | ds = globals_misc_size(ds, ash_ptr_to_globals_misc); | 16529 | ds = globals_misc_size(ds); |
16526 | ds = cmdtable_size(ds, cmdtable); | 16530 | ds = cmdtable_size(ds); |
16527 | 16531 | ||
16528 | ds.funcblocksize = calcsize(ds.funcblocksize, fs->n); | 16532 | ds.funcblocksize = calcsize(ds.funcblocksize, fs->n); |
16529 | ds = argv_size(ds, fs->argv); | 16533 | ds = argv_size(ds, fs->argv); |
16530 | 16534 | ||
16531 | if ((ENABLE_ASH_ALIAS || MAX_HISTORY) && fs->fpid != FS_SHELLEXEC) { | 16535 | if ((ENABLE_ASH_ALIAS || MAX_HISTORY) && fs->fpid != FS_SHELLEXEC) { |
16532 | #if ENABLE_ASH_ALIAS | 16536 | #if ENABLE_ASH_ALIAS |
16533 | ds = atab_size(ds, atab); | 16537 | ds = atab_size(ds); |
16534 | #endif | 16538 | #endif |
16535 | #if MAX_HISTORY | 16539 | #if MAX_HISTORY |
16536 | if (line_input_state) | 16540 | if (line_input_state) |
16537 | ds = history_size(ds, line_input_state); | 16541 | ds = history_size(ds); |
16538 | #endif | 16542 | #endif |
16539 | } | 16543 | } |
16540 | return ds; | 16544 | return ds; |
@@ -16550,9 +16554,9 @@ forkshell_copy(struct forkshell *fs, struct forkshell *new) | |||
16550 | if (fs->fpid == FS_OPENHERE) | 16554 | if (fs->fpid == FS_OPENHERE) |
16551 | return; | 16555 | return; |
16552 | 16556 | ||
16553 | new->gvp = globals_var_copy(ash_ptr_to_globals_var); | 16557 | new->gvp = globals_var_copy(); |
16554 | new->gmp = globals_misc_copy(ash_ptr_to_globals_misc); | 16558 | new->gmp = globals_misc_copy(); |
16555 | new->cmdtable = cmdtable_copy(cmdtable); | 16559 | new->cmdtable = cmdtable_copy(); |
16556 | SAVE_PTR(new->gvp, "gvp", NO_FREE); | 16560 | SAVE_PTR(new->gvp, "gvp", NO_FREE); |
16557 | SAVE_PTR(new->gmp, "gmp", NO_FREE); | 16561 | SAVE_PTR(new->gmp, "gmp", NO_FREE); |
16558 | SAVE_PTR(new->cmdtable, "cmdtable", NO_FREE); | 16562 | SAVE_PTR(new->cmdtable, "cmdtable", NO_FREE); |
@@ -16564,12 +16568,12 @@ forkshell_copy(struct forkshell *fs, struct forkshell *new) | |||
16564 | 16568 | ||
16565 | if ((ENABLE_ASH_ALIAS || MAX_HISTORY) && fs->fpid != FS_SHELLEXEC) { | 16569 | if ((ENABLE_ASH_ALIAS || MAX_HISTORY) && fs->fpid != FS_SHELLEXEC) { |
16566 | #if ENABLE_ASH_ALIAS | 16570 | #if ENABLE_ASH_ALIAS |
16567 | new->atab = atab_copy(atab); | 16571 | new->atab = atab_copy(); |
16568 | SAVE_PTR(new->atab, "atab", NO_FREE); | 16572 | SAVE_PTR(new->atab, "atab", NO_FREE); |
16569 | #endif | 16573 | #endif |
16570 | #if MAX_HISTORY | 16574 | #if MAX_HISTORY |
16571 | if (line_input_state) { | 16575 | if (line_input_state) { |
16572 | new->history = history_copy(line_input_state); | 16576 | new->history = history_copy(); |
16573 | SAVE_PTR(new->history, "history", NO_FREE); | 16577 | SAVE_PTR(new->history, "history", NO_FREE); |
16574 | new->cnt_history = line_input_state->cnt_history; | 16578 | new->cnt_history = line_input_state->cnt_history; |
16575 | } | 16579 | } |