← Commit list

02add9e53

Rob Landley
Rob Landley
2006-09-05
SOURCE BUG Duration: 35s

Subject

Might as well commit this to have the history. It's not linked in to the applet list yet (and won't be until it can replace lash, I'm not having five shells in menuconfig at once), but you can build it with scripts/individual and mostly this is checked in so I can bloatcheck future versions against

SOURCE BUG

This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)

→ Bu hatanin tam hikayesini ve duzeltme diffini gor

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/bbsh.c+73 -0
@@ -0,0 +1,73 @@
+/* vi: set ts=4 :
+ *
+ * bbsh - busybox shell
+ *
+ * Copyright 2006 Rob Landley <[email protected]>
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
+ */
+
+// Handle embedded NUL bytes in the command line.
+
+#include <busybox.h>
+
+static int handle(char *command)
+{
+ int argc=0;
+ char *argv[10], *start = command;
+
+ // Parse command into argv[]
+ for (;;) {
+ char *end;
+
+ // Skip leading whitespace and detect EOL.
+ while(isspace(*start)) start++;
+ if(!*start || *start=='#') break;
+
+ // Grab next word. (Add dequote and envvar logic here)
+ end=start;
+ while(*end && !isspace(*end)) end++;
+ argv[argc++]=xstrndup(start,end-start);
+ start=end;
+ }
+ argv[argc]=0;
+
+ if (!argc) return 0;
+ if (argc==2 && !strcmp(argv[0],"cd")) chdir(argv[1]);
+ else if(!strcmp(argv[0],"exit")) exit(argc>1 ? atoi(argv[1]) : 0);
+ else {
+ int status;
+ pid_t pid=fork();
+ if(!pid) {
+ run_applet_by_name(argv[0],argc,argv);
+ execvp(argv[0],argv);
+ printf("No %s",argv[0]);
+ exit(1);
+ } else waitpid(pid, &status, 0);
+ }
+ while(argc) free(argv[--argc]);
+
+ return 0;
+}
+
+int bbsh_main(int argc, char *argv[])
+{
+ char *command=NULL;
+ FILE *f;
+
+ bb_getopt_ulflags(argc, argv, "c:", &command);
+
+ f = argv[optind] ? xfopen(argv[optind],"r") : NULL;
+ if (command) handle(command);
+ else {
+ unsigned cmdlen=0;
+ for (;;) {
+ if(!f) putchar('$');
+ if(1 > getline(&command,&cmdlen,f ? : stdin)) break;
+ handle(command);
+ }
+ if (ENABLE_FEATURE_CLEAN_UP) free(command);
+ }
+
+ return 1;
+}