Changeset 3437 for trunk/src/kash/eval.c
- Timestamp:
- Sep 3, 2020, 3:52:14 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kash/eval.c
r3435 r3437 458 458 args.backgnd = backgnd; 459 459 forkshell2(psh, jp, n, backgnd ? FORK_BG : FORK_FG, 460 evalsubshell_child, n, &args, sizeof(args) );460 evalsubshell_child, n, &args, sizeof(args), NULL); 461 461 } 462 462 #else … … 578 578 args.pip[1] = pip[1]; 579 579 forkshell2(psh, jp, lp->n, n->npipe.backgnd ? FORK_BG : FORK_FG, 580 evalpipe_child, lp->n, &args, sizeof(args) );580 evalpipe_child, lp->n, &args, sizeof(args), NULL); 581 581 } 582 582 #else … … 677 677 args.pip[1] = pip[1]; 678 678 forkshell2(psh, jp, n, FORK_NOJOB, 679 evalbackcmd_child, n, &args, sizeof(args) );679 evalbackcmd_child, n, &args, sizeof(args), NULL); 680 680 } 681 681 #else … … 811 811 struct evalcommanddoit 812 812 { 813 struct cmdentry cmdentry; 814 char *lastarg; 815 const char *path; 813 struct stackmark smark; 814 816 815 struct backcmd *backcmd; 817 816 int flags; 818 817 int argc; 819 818 char **argv; 819 char *lastarg; 820 820 struct arglist varlist; 821 struct stackmark smark; 821 const char *path; 822 struct cmdentry cmdentry; 823 824 /* for child stuff only: */ 825 int pip[2]; 822 826 }; 823 827 … … 996 1000 } 997 1001 1002 /* child callback. */ 1003 static int evalcommand_child(shinstance *psh, union node *cmd, void *argp) 1004 { 1005 struct evalcommanddoit *args = (struct evalcommanddoit *)argp; 1006 1007 if (args->flags & EV_BACKCMD) { 1008 FORCEINTON; 1009 shfile_close(&psh->fdtab, args->pip[0]); 1010 if (args->pip[1] != 1) { 1011 movefd(psh, args->pip[1], 1); 1012 } 1013 } 1014 args->flags |= EV_EXIT; 1015 1016 evalcommand_doit(psh, cmd, args); 1017 /* not reached */ /** @todo make it return here */ 1018 return 0; 1019 } 1020 1021 /* Copies data in the argument structure from parent to child. */ 1022 static void evalcommand_setup_child(shinstance *pshchild, shinstance *pshparent, void *argp) 1023 { 1024 struct evalcommanddoit *args = (struct evalcommanddoit *)argp; 1025 char **argv; 1026 char **srcargv; 1027 struct strlist *sp; 1028 int argc, i; 1029 1030 setstackmark(pshchild, &args->smark); 1031 1032 /* copy arguments. */ 1033 srcargv = args->argv; 1034 argc = args->argc; 1035 args->argv = argv = stalloc(pshchild, sizeof(char *) * (argc + 1)); 1036 for (i = 0; i < argc; i++) 1037 argv[i] = stsavestr(pshchild, srcargv[i]); 1038 argv[argc] = NULL; 1039 if (args->lastarg) 1040 args->lastarg = argv[argc - 1]; 1041 1042 /* copy variable list, checking for the 'path'. */ 1043 sp = args->varlist.list; 1044 args->varlist.list = NULL; 1045 args->varlist.lastp = &args->varlist.list; 1046 for (; sp; sp = sp->next) { 1047 struct strlist *snew = (struct strlist *)stalloc(pshchild, sizeof(*snew)); 1048 char *text; 1049 snew->next = NULL; 1050 snew->text = text = stsavestr(pshchild, sp->text); 1051 1052 if (&text[5] == args->path) 1053 args->path = &text[sizeof("PATH=") - 1]; 1054 1055 *args->varlist.lastp = snew; 1056 args->varlist.lastp = &snew->next; 1057 } 1058 1059 if (args->path == pathval(pshparent)) 1060 args->path = pathval(pshchild); 1061 1062 /* back tick command should be ignored in this codepath 1063 (flags != EV_BACKCMD as EV_EXIT is ORed in). */ 1064 1065 /* If cmdentry references an internal function, we must duplicates it's nodes. */ 1066 if (args->cmdentry.cmdtype == CMDFUNCTION) 1067 args->cmdentry.u.func = copyparsetree(pshchild, args->cmdentry.u.func); /** @todo isn't this duplicated already? */ 1068 } 1069 998 1070 /* 999 1071 * Execute a simple command. … … 1135 1207 || args.cmdentry.u.bltin == evalcmd))) { 1136 1208 struct job *jp; 1137 int pip[2];1138 1209 int mode; 1210 1139 1211 INTOFF; 1140 1212 jp = makejob(psh, cmd, 1); 1141 1213 mode = cmd->ncmd.backgnd; 1214 args.pip[0] = -1; 1215 args.pip[1] = -1; 1142 1216 if (flags & EV_BACKCMD) { 1143 1217 mode = FORK_NOJOB; 1144 if (sh_pipe(psh, pip) < 0)1218 if (sh_pipe(psh, args.pip) < 0) 1145 1219 error(psh, "Pipe call failed"); 1146 1220 } 1221 1222 args.backcmd = backcmd; 1223 args.flags = flags; 1224 args.path = path; 1225 #ifdef KASH_USE_FORKSHELL2 1226 forkshell2(psh, jp, cmd, mode, evalcommand_child, cmd, 1227 &args, sizeof(args), evalcommand_setup_child); 1228 evalcommand_parent(psh, flags, args.lastarg, &args.smark, mode, jp, 1229 args.pip, backcmd); 1230 #else 1147 1231 if (forkshell(psh, jp, cmd, mode) != 0) { 1148 evalcommand_parent(psh, flags, args.lastarg, &args.smark, mode, jp, pip, backcmd); 1232 evalcommand_parent(psh, flags, args.lastarg, &args.smark, mode, jp, 1233 args.pip, backcmd); 1149 1234 return; /* at end of routine */ 1150 1235 } 1151 1152 if (flags & EV_BACKCMD) { 1153 FORCEINTON; 1154 shfile_close(&psh->fdtab, pip[0]); 1155 if (pip[1] != 1) { 1156 movefd(psh, pip[1], 1); 1157 } 1158 } 1159 flags |= EV_EXIT; 1160 1236 evalcommand_child(psh, cmd, &args); 1237 #endif 1238 } else { 1161 1239 args.backcmd = backcmd; 1162 1240 args.flags = flags; … … 1164 1242 evalcommand_doit(psh, cmd, &args); 1165 1243 } 1166 else {1167 args.backcmd = backcmd;1168 args.flags = flags;1169 args.path = path;1170 evalcommand_doit(psh, cmd, &args);1171 }1172 1244 } 1173 1245 … … 1188 1260 if (goodname(n->ncmd.args->narg.text)) 1189 1261 find_command(psh, n->ncmd.args->narg.text, &entry, 0, 1190 pathval(psh));1262 pathval(psh)); 1191 1263 } 1192 1264
Note:
See TracChangeset
for help on using the changeset viewer.