diff --git a/buildroot-v86/board/v86/rootfs_overlay/bin/filemanager b/buildroot-v86/board/v86/rootfs_overlay/bin/filemanager new file mode 100755 index 0000000..e37a0de --- /dev/null +++ b/buildroot-v86/board/v86/rootfs_overlay/bin/filemanager @@ -0,0 +1,1079 @@ +#!/usr/bin/env -S awk -f + +BEGIN { + + ################### + # Configuration # + ################### + + OPENER = ( ENVIRON["FMAWK_OPENER"] == "" ? ( ENVIRON["OSTYPE"] ~ /darwin.*/ ? "open" : "xdg-open" ) : ENVIRON["FMAWK_OPENER"] ) + LASTPATH = ( ENVIRON["LASTPATH"] == "" ? ( ENVIRON["HOME"] "/.cache/lastpath" ) : ENVIRON["LASTPATH"] ) + HISTORY = ( ENVIRON["HISTORY"] == "" ? ( ENVIRON["HOME"] "/.cache/history" ) : ENVIRON["HISTORY"] ) + CMDHIST = ( ENVIRON["CMDHIST"] == "" ? ( ENVIRON["HOME"] "/.cache/cmdhist" ) : ENVIRON["CMDHIST"] ) + CACHE = ( ENVIRON["CACHE"] == "" ? ( ENVIRON["HOME"] "/.cache/imagecache" ) : ENVIRON["CACHE"] ) + FIFO_UEBERZUG = ENVIRON["FIFO_UEBERZUG"] + FMAWK_PREVIEWER = ENVIRON["FMAWK_PREVIEWER"] + PREVIEW = 0 + HIDDEN = 0 + RATIO = 0.35 + HIST_MAX = 5000 + SUBSEP = "," + + #################### + # Initialization # + #################### + + # Credit: https://unix.stackexchange.com/questions/224969/current-date-in-awk/225463#225463 + srand(); old_time = srand(); + init() + RS = "\a" + dir = ( ENVIRON["PWD"] == "/" ? "/" : ENVIRON["PWD"] "/" ) + cursor = 1; curpage = 1; + + # load alias + cmd = "${SHELL:=/bin/sh} -c \". ~/.${SHELL##*/}rc && alias\"" + cmd | getline alias + close(cmd) + split(alias, aliasarr, "\n") + for (line in aliasarr) { + key = aliasarr[line]; gsub(/=.*/, "", key); gsub(/^alias /, "", key) + cmd = aliasarr[line]; gsub(/.*=/, "", cmd); gsub(/^'|'$/, "", cmd) + cmdalias[key] = cmd + } + + # defind [a]ttributes, [b]ackground and [f]oreground + a_bold = "\033\1331m" + a_reverse = "\033\1337m" + a_clean = "\033\1332K" + a_reset = "\033\133m" + b_red = "\033\13341m" + f_red = "\033\13331m" + f_green = "\033\13332m" + f_yellow = "\033\13333m" + f_blue = "\033\13334m" + f_magenta = "\033\13335m" + f_cyan = "\033\13336m" + f_white = "\033\13337m" + + ############# + # Actions # + ############# + + # action = "History" RS \ + # "mv" RS \ + # "cp -R" RS \ + # "ln -sf" RS \ + # "rm -rf" + action = "History" + + help = "\n" \ + "NUMBERS: \n" \ + "\t[num] - move cursor to entry [num] \n" \ + "\t[num]+G - Go to page [num] \n" \ + "\n" \ + "NAVIGATION: \n" \ + "\tk/↑ - up j/↓ - down \n" \ + "\tl/→ - right h/← - left \n" \ + "\tCtrl-f - Half Page Down Ctrl-u - Half Page Up\n" \ + "\tn/PageDown - PageDown p/PageUp - PageUp \n" \ + "\tg/Home - first page G/End - last page \n" \ + "\tH - first entry L - last entry \n" \ + "\tM - middle entry\n" \ + "\n" \ + "MODES: \n" \ + "\t/ - search \n" \ + "\t: - commandline mode \n" \ + "\t commandline mode special function: \n" \ + "\t {}: represent selected files/directories\n" \ + "\t tab completion on path: start with ' /', use tab to complete on that path \n" \ + "\t tab completion on cmd: completion based on command history \n" \ + "\t ><: enter selecting mode for directory (choose ./ to confirm destination)\n" \ + "\n" \ + "SELECTION: \n" \ + "\t␣ - bulk (de-)selection S - bulk (de-)selection all \n" \ + "\ts - show selected\n" \ + "\n" \ + "PREVIEW: \n" \ + "\tv - toggle preview \n" \ + "\t> - more directory ratio < - less directory ratio \n" \ + "\n" \ + "MISC: \n" \ + "\tr - refresh a - actions \n" \ + "\t- - previous directory ! - spawn shell \n" \ + "\t. - toggle hidden ? - show keybinds\n" \ + "\tq - quit \n" \ + + main(); +} + +END { + finale(); + hist_clean(); + cmd_clean(); + system("[ -f " CACHE ".jpg ] && rm " CACHE ".jpg 2>/dev/null") + if (list != "empty") { + printf("%s", dir) > "/dev/stdout"; close("/dev/stdout") + printf("%s", dir) > LASTPATH; close(LASTPATH) + } +} + +function main() { + + do { + + list = ( sind == 1 && openind == 1 ? slist : gen_content(dir, HIDDEN) ) + delim = "\f"; num = 1; tmsg = dir; bmsg = ( bmsg == "" ? "Browsing" : bmsg ); + menu_TUI(list, delim, num, tmsg, bmsg) + response = result[1] + bmsg = result[2] + + ####################### + # Matching: Actions # + ####################### + + if (bmsg == "Actions") { + if (response == "History") { hist_act(); sind = 0; response = result[1]; bmsg = "";} + } + + ######################## + # Matching: Browsing # + ######################## + + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", response) + + if (response == "../") { + parent = ( dir == "/" ? "/" : dir ) + old_dir = parent + if (hist != 1) { + gsub(/[^\/]*\/?$/, "", dir) + gsub(dir, "", parent) + } + # empty_selected() + dir = ( dir == "" ? "/" : dir ); hist = 0; sind = 0; openind = 0; + printf("%s\n", dir) >> HISTORY; close(HISTORY) + continue + } + + if (response == "./") { + finale() + system("cd \"" dir "\" && ${SHELL:=/bin/sh}") + init() + sind = 0; openind = 0; + continue + } + + if (response ~ /.*\/$/) { + # empty_selected() + old_dir = dir + dir = ( hist == 1 ? response : dir response ) + printf("%s\n", dir) >> HISTORY; close(HISTORY) + cursor = 1; curpage = 1; hist = 0; sind = 0; openind = 0; + continue + } + + finale() + system("cd \"" dir "\" && " OPENER " \"" dir response "\"") + init() + openind = 1; old_dir = ""; parent = ""; + + } while (1) + +} + +function hist_act() { + list = "" + getline hisfile < HISTORY; close(HISTORY); + N = split(hisfile, hisarr, "\n") + # for (i = N; i in hisarr; i--) { + for (i = N; i >= 1; i--) { + list = list "\n" hisarr[i] + } + list = substr(list, 3) + list = list "\n../"; delim = "\n"; num = 1; tmsg = "Choose history: "; bmsg = "Action: " response; hist = 1; + menu_TUI(list, delim, num, tmsg, bmsg) +} + +function cmd_clean() { # act like uniq + tmp = ""; + getline cmdhist < CMDHIST; close(CMDHIST); + N = split(cmdhist, cmdarr, "\n") + for (i = 1; i in cmdarr; i++) { # collect items not seen + if (! (cmdarr[i] in seen)) { seen[cmdarr[i]]++ } + } + for (key in seen) { # expand seen array into string + if (key != "") { tmp = tmp "\n" key } + } + tmp = substr(tmp, 2) + printf("%s", tmp) > CMDHIST; close(CMDHIST) +} + +function hist_clean() { + getline hisfile < HISTORY; close(HISTORY); + N = split(hisfile, hisarr, "\n") + if (N > HIST_MAX) { + for (i = N-HIST_MAX+1; i in hisarr; i++) { + histmp = histmp "\n" hisarr[i] + } + hisfile = substr(histmp, 2) + printf("%s", hisfile) > HISTORY; close(HISTORY) + } +} + + +function gen_content(dir, HIDDEN) { + + if (HIDDEN == 0) { + cmd = "for f in \"" dir "\"*; do "\ + "test -L \"$f\" && test -f \"$f\" && symFileList=\"$symFileList$(printf '\f" a_bold f_cyan "%s" a_reset "' \"$f\")\" && continue; "\ + "test -L \"$f\" && test -d \"$f\" && symDirList=\"$symDirList$(printf '\f" a_bold f_cyan "%s" a_reset "' \"$f\"/)\" && continue; "\ + "test -x \"$f\" && test -f \"$f\" && execList=\"$execList$(printf '\f" a_bold f_green "%s" a_reset "' \"$f\")\" && continue; "\ + "test -f \"$f\" && fileList=\"$fileList$(printf '\f%s' \"$f\")\" && continue; "\ + "test -d \"$f\" && dirList=\"$dirList$(printf '\f" a_bold f_blue "%s" a_reset "' \"$f\"/)\" ; "\ + "done; "\ + "printf '%s' \"$dirList\" \"$symDirList\" \"$fileList\" \"$execList\" \"$symFileList\"" + + } + else if (HIDDEN == 1) { + cmd = "for f in \"" dir "\"* \"" dir "\".* ; do "\ + "test -L \"$f\" && test -f \"$f\" && symFileList=\"$symFileList$(printf '\f" a_bold f_cyan "%s" a_reset "' \"$f\")\" && continue; "\ + "test -L \"$f\" && test -d \"$f\" && symDirList=\"$symDirList$(printf '\f" a_bold f_cyan "%s" a_reset "' \"$f\"/)\" && continue; "\ + "test -x \"$f\" && test -f \"$f\" && execList=\"$execList$(printf '\f" a_bold f_green "%s" a_reset "' \"$f\")\" && continue; "\ + "test -f \"$f\" && fileList=\"$fileList$(printf '\f%s' \"$f\")\" && continue; "\ + "test -d \"$f\" && dirList=\"$dirList$(printf '\f" a_bold f_blue "%s" a_reset "' \"$f\"/)\" ; "\ + "done; "\ + "printf '%s' \"$dirList\" \"$symDirList\" \"$fileList\" \"$execList\" \"$symFileList\"" + } + + code = cmd | getline dirlist + close(cmd) + if (code <= 0) { + dirlist = "empty" + } + else if (dir != "/") { + gsub(/[\\.^$(){}\[\]|*+?]/, "\\\\&", dir) # escape special char + gsub(dir, "", dirlist) + dirlist = substr(dirlist, 2) + } + else { + Narr = split(dirlist, dirlistarr, "\f") + delete dirlistarr[1] + dirlist = "" + for (entry = 2; entry in dirlistarr; entry++) { + sub(/\//, "", dirlistarr[entry]) + dirlist = dirlist "\f" dirlistarr[entry] + } + dirlist = substr(dirlist, 2) + } + return dirlist + +} + +# Credit: https://stackoverflow.com/a/20078022 +function isEmpty(arr) { for (idx in arr) return 0; return 1 } + +function len(arr, i) { for (idx in arr) { ++i }; return i } + +function maxidx(arr, idx) { for (idx in selorder) { pidx = (pidx <= idx ? idx : pidx ) }; return pidx } + +################## +# Start of TUI # +################## + +function finale() { + clean_preview() + printf "\033\1332J\033\133H" >> "/dev/stderr" # clear screen + printf "\033\133?7h" >> "/dev/stderr" # line wrap + printf "\033\1338" >> "/dev/stderr" # restore cursor + printf "\033\133?25h" >> "/dev/stderr" # show cursor + printf "\033\133?1049l" >> "/dev/stderr" # back from alternate buffer + system("stty isig icanon echo") + ENVIRON["LANG"] = LANG; # restore LANG +} + +function init() { + system("stty -isig -icanon -echo") + printf "\033\1332J\033\133H" >> "/dev/stderr" # clear screen + printf "\033\133?1049h" >> "/dev/stderr" # alternate buffer + printf "\033\1337" >> "/dev/stderr" # save cursor + printf "\033\133?25l" >> "/dev/stderr" # hide cursor + printf "\033\1335 q" >> "/dev/stderr" # blinking bar + printf "\033\133?7l" >> "/dev/stderr" # line unwrap + LANG = ENVIRON["LANG"]; # save LANG + ENVIRON["LANG"] = C; # simplest locale setting +} + + +function CUP(lines, cols) { + printf("\033\133%s;%sH", lines, cols) >> "/dev/stderr" +} + +function draw_selected() { + for (sel in selected) { + if (selpage[sel] != curpage || selected[sel] != dir seldisp[sel]) continue + selN = selnum[sel] + CUP(top + (selN-dispnum*(curpage-1))*num - num, 1) + for (i = 1; i <= num; i++) { + printf "\033\1332K" >> "/dev/stderr" # clear line + CUP(top + cursor*num - num + i, 1) + } + CUP(top + (selN-dispnum*(curpage-1))*num - num, 1) + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", seldisp[sel]) + + if (cursor == selN-dispnum*(curpage-1)) { + printf "%s %s%s%s%s%s", a_clean, a_reverse, f_red, selN ". ", seldisp[sel], a_reset >> "/dev/stderr" + } + else { + printf "%s %s%s%s%s%s", a_clean, a_bold, f_red, selN ". ", seldisp[sel], a_reset >> "/dev/stderr" + } + } +} + +function empty_selected() { + split("", selected, ":"); split("", seldisp, ":"); + split("", selpage, ":"); split("", selorder, ":") + sellist = ""; order = 0 +} + +function dim_setup() { + cmd = "stty size" + cmd | getline d + close(cmd) + split(d, dim, " ") + top = 3; bottom = dim[1] - 4; + fin = bottom - ( bottom - (top - 1) ) % num; end = fin + 1; + dispnum = (end - top) / num +} + +function menu_TUI_page(list, delim) { + answer = ""; page = 0; split("", pagearr, ":") # delete saved array + dim_setup() + Narr = split(list, disp, delim) + dispnum = (dispnum <= Narr ? dispnum : Narr) + move = int( ( dispnum <= Narr ? dispnum * 0.5 : Narr * 0.5 ) ) + + # generate display content for each page (pagearr) + for (entry = 1; entry in disp; entry++) { + if ((+entry) % (+dispnum) == 1 || Narr == 1) { # if first item in each page + pagearr[++page] = entry ". " disp[entry] + } + else { + pagearr[page] = pagearr[page] "\n" entry ". " disp[entry] + } + loc = disp[entry] + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", loc) + if (parent != "" && loc == parent) { + cursor = entry - dispnum*(page - 1); curpage = page + } + } + +} + +function search(list, delim, str, mode) { + find = ""; str = tolower(str); + if (mode == "dir") { regex = "^" str ".*/" } + else if (mode == "begin") {regex = "^" str ".*"} + else { regex = ".*" str ".*" } + gsub(/[(){}\[\]]/, "\\\\&", regex) # escape special char + + # get rid of coloring to avoid find irrelevant item + tmplist = list + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", tmplist) + split(list, sdisp, delim); split(tmplist, tmpsdisp, delim) + + for (entry = 1; entry in tmpsdisp; entry++) { + match(tolower(tmpsdisp[entry]), regex) + if (RSTART) { find = find delim sdisp[entry]; } + } + + slist = substr(find, 2) + return slist +} + +function key_collect(list, pagerind) { + key = ""; rep = 0 + do { + + cmd = "trap 'printf WINCH' WINCH; dd ibs=1 count=1 2>/dev/null" + cmd | getline ans; + close(cmd) + + if (++rep == 1) { + srand(); time = srand() + if (time - old_time == 0) { sec++ } + else { sec = 0 } + old_time = time + } + + gsub(/[\\^\[\]]/, "\\\\&", ans) # escape special char + # if (ans ~ /.*WINCH/ && pagerind == 0) { # trap SIGWINCH + if (ans ~ /.*WINCH/) { # trap SIGWINCH + cursor = 1; curpage = 1; + if (pagerind == 0) { + menu_TUI_page(list, delim) + redraw(tmsg, bmsg) + } + else if (pagerind == 1) { + printf "\033\1332J\033\133H" >> "/dev/stderr" + dim_setup() + Npager = (Nmsgarr >= dim[1] ? dim[1] : Nmsgarr) + for (i = 1; i <= Npager; i++) { + CUP(i, 1) + printf "%s", msgarr[i] >> "/dev/stderr" + } + } + gsub(/WINCH/, "", ans); + } + if (ans ~ /\033/ && rep == 1) { ans = ""; continue; } # first char of escape seq + else { key = key ans; } + if (key ~ /[^\x00-\x7f]/) { break } # print non-ascii char + if (key ~ /^\\\[5$|^\\\[6$$/) { ans = ""; continue; } # PageUp / PageDown + } while (ans !~ /[\x00-\x5a]|[\x5f-\x7f]/) + # } while (ans !~ /[\006\025\033\003\177[:space:][:alnum:]><\}\{.~\/:!?*+-]|"|[|_$()]/) + return key +} + +function cmd_mode(list, answer) { + + ### comment for scrollable cmd mode: + # |------------b1--------------------b2-------------length(reply) + # b1 to b2 is the show-able region in the whole reply. + # b1 and b2 update according to keyboard inputs. + # keyboard inputs: + # - Left arrow, right arrow, tab completion + + cmd_trigger = answer; + cc = 0; dd = 0; + # b1 = 1; b2 = dim[2] - 50; bb = b2 - b1 - 1; curloc = 0; + b1 = 1; b2 = dim[2]; bb = b2 - b1 - 1; curloc = 0; + while (key = key_collect(list, pagerind)) { + if (key == "\003" || key == "\033" || key == "\n") { + split("", comparr, ":") + if (key == "\003" || key == "\033") { reply = "\003"; break } # cancelled + # if Double enter as confirm current path and exit + if (key_last !~ /\t|\[Z/) break + } + if (key == "\177") { # backspace + reply = substr(reply, 1, length(reply) + cc - 1) substr(reply, length(reply) + cc + 1); + if (length(reply) + cc < b1 && b1 > 1) { b1 = b1 - 1; b2 = b1 + bb; } + else if (curloc > 1) { curloc--; } + split("", comparr, ":") + } + # path completion: $HOME + else if (cmd_trigger reply ~ /:cd |:.* / && key == "~") { reply = reply ENVIRON["HOME"] "/" } + # path completion + else if (cmd_trigger reply ~ /:cd .*|:.* \.?\.?\// && key ~ /\t|\[Z/) { # Tab / Shift-Tab + cc = 0; dd = 0; + if (isEmpty(comparr)) { + comp = reply; + if (cmd_trigger reply ~ /:cd .*/) gsub(/cd /, "", comp) + else { + if (comp ~ /.* \.\.\//) { + match(comp, /.* \.\.\//) + cmd_run = substr(comp, RSTART, RLENGTH-3) + comp = substr(comp, RLENGTH-2) + } + if (comp ~ /.* \.\//) { + match(comp, /.* \.\//) + cmd_run = substr(comp, RSTART, RLENGTH-2) + comp = substr(comp, RLENGTH-1) + } + if (comp ~ /.* \//) { + match(comp, /.* \//) + cmd_run = substr(comp, RSTART, RLENGTH-1) + comp = substr(comp, RLENGTH) + } + } + compdir = comp; + if (compdir ~ /^\.\.\/.*/) { + tmpdir = dir + while (compdir ~ /^\.\.\/.*/) { # relative path + gsub(/[^\/]*\/?$/, "", tmpdir) + gsub(/^\.\.\//, "", compdir) + tmpdir = ( tmpdir == "" ? "/" : tmpdir ) + } + compdir = tmpdir + } + else { + # allow single Enter to confirm current reply + # as completion dir (compdir) + if (key_last ~ /~|\n/) { + comp = "" + } + else { + gsub(/[^\/]*\/?$/, "", compdir); + gsub(compdir, "", comp) + } + } + compdir = (compdir == "" ? dir : compdir); + tmplist = gen_content(compdir, 1) + complist = ( cmd_trigger reply ~ /:cd .*/ ? + search(tmplist, delim, comp, "dir") : + search(tmplist, delim, comp, "begin") ) + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", complist) + Ncomp = split(complist, comparr, delim) + + ## save space for completion + space = length(comparr[1]) + for (item in comparr) { + space = ( space < length(comparr[item]) ? length(comparr[item]) : space ) + } + if (length(compdir) + space > b2) { b2 = b2 + space; b1 = b2 - bb; } + + c = ( key == "\t" ? 1 : Ncomp ) + } + else { + if (key == "\t") c = (c == Ncomp ? 1 : c + 1) + else c = (c == 1 ? Ncomp : c - 1) + } + if (cmd_trigger reply ~ /:cd .*/) reply = "cd " compdir comparr[c] + else reply = cmd_run compdir comparr[c] + CUP(dim[1] - 2, 1) + printf("%s%s%s%s%s", a_clean, a_reverse, f_yellow, "looping through completion", a_reset) + } + # command completion + else if (cmd_trigger == ":" && key ~ /\t|\[Z/) { + if (isEmpty(comparr)) { + getline cmdhist < CMDHIST; close(CMDHIST); + comp = reply; + complist = search(cmdhist, "\n", comp, "begin") + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", complist) + Ncomp = split(complist, comparr, "\n") + c = ( key == "\t" ? 1 : Ncomp ) + } + else { + if (key == "\t") c = (c == Ncomp ? 1 : c + 1) + else c = (c == 1 ? Ncomp : c - 1) + } + reply = comparr[c] + CUP(dim[1] - 2, 1) + printf("%s%s%s%s%s", a_clean, a_reverse, f_yellow, "looping through completion", a_reset) + } + else if (cmd_trigger == ":" && key ~ /\[A|\[B/) { + getline cmdhist < CMDHIST; close(CMDHIST); + Ncmd = split(cmdhist, cmdarr, "\n") + reply = cmdarr[Ncmd - dd] + if (key ~ /\[A/) { dd = (dd < Ncmd - 1 ? dd + 1 : dd) } + if (key ~ /\[B/) { dd = (dd == 0 ? dd : dd - 1) } + } + # search + else if (cmd_trigger == "/" && key ~ /\t|\[Z/) { + cc = 0; dd = 0; + if (isEmpty(comparr)) { + comp = reply; complist = search(list, delim, comp, "begin") + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", complist) + Ncomp = split(complist, comparr, delim) + c = ( key == "\t" ? 1 : Ncomp ) + } + else { + if (key == "\t") c = (c == Ncomp ? 1 : c + 1) + else c = (c == 1 ? Ncomp : c - 1) + } + reply = comparr[c] + } + + else if (key ~ /\[C/) { # Right arrow + if (cc < 0) { + cc++ + if (length(reply) + cc > b2 && b2 < length(reply)) { b2 = b2 + 1; b1 = b2 - bb; } + else if (curloc < bb) { curloc++; } + } + } + else if (key ~ /\[D/) { # Left arrow + if (-cc < length(reply)) { + cc-- + if (length(reply) + cc < b1 && b1 > 1) { b1 = b1 - 1; b2 = b1 + bb; } + else if (curloc > 1) { curloc--; } + } + } + # single Enter clear the completion array (comparr) + else if (key ~ /\n/) { + CUP(dim[1] - 2, 1) + printf("%s%s%s%s%s", a_clean, a_reverse, f_yellow, "confirm current completion", a_reset) + curloc = ( length(reply) > bb ? bb : length(reply) ) + split("", comparr, ":") + } + # Reject other escape sequence + else if (key ~ /\[.+/) { + continue + } + else { + reply = substr(reply, 1, length(reply) + cc) key substr(reply, length(reply) + cc + 1); + if (length(reply) + cc > b2) { b2 = b2 + 1; b1 = b2 - bb } + else if (curloc < bb) { curloc++; } + split("", comparr, ":") + } + + if (cmd_trigger == "/") { + slist = search(list, delim, reply, "") + for (i = top; i <= end; i++) { + CUP(i, 1) + printf "\033\133K" >> "/dev/stderr" # clear line + } + if (slist != "") { + Nsarr = split(slist, sarr, delim) + Nsarr = (Nsarr > dispnum ? dispnum : Nsarr) + for (i = 1; i <= Nsarr; i++) { + CUP(i + 2, 1) + printf "%d. %s", i, sarr[i] >> "/dev/stderr" + } + } + } + if (cmd_trigger ~ /^[[:digit:]]$/) { + status = sprintf("%sChoose [%s1-%d%s], current page num is %s%d%s, total page num is %s%d%s: %s%s", a_clean, a_bold, Narr, a_reset, a_bold, curpage, a_reset, a_bold, page, a_reset, cmd_trigger, reply) + if (cmd_trigger reply ~ /^[[:digit:]]+[Gjk]$/) { split("", comparr, ":"); break; } + } + else { + # status = sprintf("%s%s%s", a_clean, cmd_trigger, reply) + status = sprintf("%s%s%s", a_clean, cmd_trigger, substr(reply, b1, bb)) + } + CUP(dim[1], 1) + # printf(status) >> "/dev/stderr" + # if (cc < 0) { CUP(dim[1], length(status) + cc - 3) } # adjust cursor + # printf(status ", " b1 ", " b2 ", " curloc ", " cc ", " length(reply) ", " space) >> "/dev/stderr" + printf(status) >> "/dev/stderr" + if (cc < 0) { CUP(dim[1], curloc + 2) } # adjust cursor + key_last = key + } + +} + +function yesno(command) { + CUP(dim[1], 1) + printf("%s%s %s? (y/n) ", a_clean, "Really execute command", command) >> "/dev/stderr" + printf "\033\133?25h" >> "/dev/stderr" # show cursor + key = key_collect(list, pagerind) + printf "\033\133?25l" >> "/dev/stderr" # hide cursor + if (key ~ /[Yy]/) return 1 +} + +function redraw(tmsg, bmsg) { + printf "\033\1332J\033\133H" >> "/dev/stderr" # clear screen and move cursor to 0, 0 + CUP(top, 1); print pagearr[curpage] >> "/dev/stderr" + CUP(top + cursor*num - num, 1); printf "%s%s%s%s", Ncursor ". ", a_reverse, disp[Ncursor], a_reset >> "/dev/stderr" + CUP(top - 2, 1); print tmsg >> "/dev/stderr" + CUP(dim[1] - 2, 1); print bmsg >> "/dev/stderr" + CUP(dim[1], 1) + # printf "Choose [\033\1331m1-%d\033\133m], current page num is \033\133;1m%d\033\133m, total page num is \033\133;1m%d\033\133m: ", Narr, curpage, page >> "/dev/stderr" + printf "%sChoose [%s1-%d%s], current page num is %s%d%s, total page num is %s%d%s: ", a_clean, a_bold, Narr, a_reset, a_bold, curpage, a_reset, a_bold, page, a_reset >> "/dev/stderr" + if (bmsg !~ /Action.*|Selecting\.\.\./ && ! isEmpty(selected)) draw_selected() + if (bmsg !~ /Action.*|Selecting\.\.\./ && PREVIEW == 1) draw_preview(disp[Ncursor]) +} + +function menu_TUI(list, delim, num, tmsg, bmsg) { + + menu_TUI_page(list, delim) + while (answer !~ /^[[:digit:]]+$|\.\.\//) { + + oldCursor = 1; + + ## calculate cursor and Ncursor + cursor = ( cursor+dispnum*(curpage-1) > Narr ? Narr - dispnum*(curpage-1) : cursor ) + Ncursor = cursor+dispnum*(curpage-1) + + clean_preview() + redraw(tmsg, bmsg) + + while (1) { + + answer = key_collect(list, pagerind) + + ####################################### + # Key: entry choosing and searching # + ####################################### + + if ( answer ~ /^[[:digit:]]$/ || answer == "/" || answer == ":" ) { + CUP(dim[1], 1) + if (answer ~ /^[[:digit:]]$/) { + # printf "Choose [\033\1331m1-%d\033\133m], current page num is \033\133;1m%d\033\133m, total page num is \033\133;1m%d\033\133m: %s", Narr, curpage, page, answer >> "/dev/stderr" + + printf "%sChoose [%s1-%d%s], current page num is %s%d%s, total page num is %s%d%s: %s", a_clean, a_bold, Narr, a_reset, a_bold, curpage, a_reset, a_bold, page, a_reset, answer >> "/dev/stderr" + } + else { + printf "%s%s", a_clean, answer >> "/dev/stderr" # clear line + } + printf "\033\133?25h" >> "/dev/stderr" # show cursor + + cmd_mode(list, answer) + + printf "\033\133?25l" >> "/dev/stderr" # hide cursor + if (reply == "\003") { answer = ""; key = ""; reply = ""; break; } + answer = cmd_trigger reply; reply = ""; split("", comparr, ":"); cc = 0; dd = 0; + + + ## cd + if (answer ~ /:cd .*/) { + old_dir = dir + gsub(/:cd /, "", answer) + if (answer ~ /^\/.*/) { # full path + dir = ( answer ~ /.*\/$/ ? answer : answer "/" ) + } + else { + while (answer ~ /^\.\.\/.*/) { # relative path + gsub(/[^\/]*\/?$/, "", dir) + gsub(/^\.\.\//, "", answer) + dir = ( dir == "" ? "/" : dir ) + } + dir = ( answer ~ /.*\/$/ || answer == "" ? dir answer : dir answer "/" ) + } + # empty_selected() + tmplist = gen_content(dir, HIDDEN) + if (tmplist == "empty") { + dir = old_dir + # bmsg = sprintf("\033\13338;5;15m\033\13348;5;9m%s\033\133m", "Error: Path Not Exist") + bmsg = sprintf("%s%s%s%s", b_red, f_white, "Error: Path Not Exist", a_reset) + } + else { + list = tmplist + } + menu_TUI_page(list, delim) + tmsg = dir; + cursor = 1; curpage = (+curpage > +page ? page : curpage); + break + } + + ## cmd mode + if (answer ~ /:[^[:cntrl:]*]/) { + command = substr(answer, 2) + savecmd = command; post = "" + match(command, /\{\}/) + if (RSTART) { + post = substr(command, RSTART+RLENGTH+1); + command = substr(command, 1, RSTART-2) + } + if (command ~ /.*\$@.*/) { + idx = maxidx(selorder) + for (j = 1; j <= idx; j++) { + if (selorder[j] == "") continue + sellist = sellist " \"" selected[selorder[j]] "\" " + } + gsub(/\$@/, sellist, command) + empty_selected() + } + if (command in cmdalias) { command = cmdalias[command] } + + if (command ~ /^rm$|rm .*/) { suc = yesno(command); if (suc == 0) break } + + gsub(/["]/, "\\\\&", command) # escape special char + finale() + if (isEmpty(selected)) { + # code = system("cd \"" dir "\" && eval \"" command "\" 2>/dev/null") + code = system("cd \"" dir "\" && eval \"" command "\"") + } + else { + idx = maxidx(selorder) + for (j = 1; j <= idx; j++) { + if (selorder[j] == "") continue + sel = selorder[j] + match(post, /\{\}/) + if (RSTART) { + post = substr(post, 1, RSTART-1) selected[sel] substr(post, RSTART+RLENGTH) + } + if (post) { + # code = system("cd \"" dir "\" && eval \"" command " \\\"" selected[sel] "\\\" \\\"" post "\\\"\" 2>/dev/null") + code = system("cd \"" dir "\" && eval \"" command " \\\"" selected[sel] "\\\" \\\"" post "\\\"\"") + } + else { + # code = system("cd \"" dir "\" && eval \"" command " \\\"" selected[sel] "\\\"\" 2>/dev/null") + code = system("cd \"" dir "\" && eval \"" command " \\\"" selected[sel] "\\\"\"") + } + } + empty_selected() + } + init() + + list = gen_content(dir, HIDDEN); tmsg = dir; + menu_TUI_page(list, delim) + if (code > 0) { printf("\n%s", savecmd) >> CMDHIST; close(CMDHIST) } + break + } + + ## search + if (answer ~ /\/[^[:cntrl:]*]/) { + slist = search(list, delim, substr(answer, 2), "") + if (slist != "") { + menu_TUI_page(slist, delim) + cursor = 1; curpage = 1; sind = 1 + } + break + } + + ## go to page + if (answer ~ /[[:digit:]]+G$/) { + ans = answer; gsub(/G/, "", ans); + curpage = (+ans <= +page ? ans : page) + break + } + + + if (answer ~ /[[:digit:]]+$/) { + if (+answer > +Narr) answer = Narr + if (+answer < 1) answer = 1 + curpage = answer / dispnum + curpage = sprintf("%.0f", (curpage == int(curpage)) ? curpage : int(curpage)+1) + cursor = answer - dispnum*(curpage-1); answer = "" + break + } + } + + if (answer ~ /[?]/) { pager(help); break; } + + if (answer == "!") { + finale() + system("cd \"" dir "\" && ${SHELL:=/bin/sh}") + init() + list = gen_content(dir, HIDDEN) + menu_TUI_page(list, delim) + break + } + + if (answer == "-") { + if (old_dir == "") break + TMP = dir; dir = old_dir; old_dir = TMP; + list = gen_content(dir, HIDDEN) + menu_TUI_page(list, delim) + tmsg = dir; bmsg = "Browsing" + cursor = 1; curpage = (+curpage > +page ? page : curpage); + break + } + + + ######################## + # Key: Total Redraw # + ######################## + + if ( answer == "v" ) { PREVIEW = (PREVIEW == 1 ? 0 : 1); break } + if ( answer == ">" ) { RATIO = (RATIO > 0.8 ? RATIO : RATIO + 0.05); break } + if ( answer == "<" ) { RATIO = (RATIO < 0.2 ? RATIO : RATIO - 0.05); break } + if ( answer == "r" || answer == "." || + ( answer == "h" && ( bmsg == "Actions" || sind == 1 ) ) || + ( answer ~ /^[[:digit:]]$/ && (+answer > +Narr || +answer < 1 ) ) ) { + if (answer == ".") { HIDDEN = (HIDDEN == 1 ? 0 : 1); } + list = gen_content(dir, HIDDEN) + delim = "\f"; num = 1; tmsg = dir; bmsg = "Browsing"; sind = 0; openind = 0; + menu_TUI_page(list, delim) + empty_selected() + cursor = 1; curpage = (+curpage > +page ? page : curpage); + break + } + if ( answer == "\n" || answer == "l" || answer ~ /\[C/ ) { answer = Ncursor; break } + if ( answer == "a" ) { + menu_TUI_page(action, RS) + tmsg = "Choose an action"; bmsg = "Actions" + cursor = 1; curpage = 1; + break + } + if ( answer ~ /q|\003/ ) exit + if ( (answer == "h" || answer ~ /\[D/) && dir != "/" ) { answer = "../"; disp[answer] = "../"; bmsg = ""; break } + if ( (answer == "h" || answer ~ /\[D/) && dir = "/" ) continue + if ( (answer == "n" || answer ~ /\[6~/) && +curpage < +page ) { curpage++; break } + if ( (answer == "n" || answer ~ /\[6~/) && +curpage == +page && cursor != Narr - dispnum*(curpage-1) ) { cursor = ( +curpage == +page ? Narr - dispnum*(curpage-1) : dispnum ); break } + if ( (answer == "n" || answer ~ /\[6~/) && +curpage == +page && cursor == Narr - dispnum*(curpage-1) ) continue + if ( (answer == "p" || answer ~ /\[5~/) && +curpage > 1) { curpage--; break } + if ( (answer == "p" || answer ~ /\[5~/) && +curpage == 1 && cursor != 1 ) { cursor = 1; break } + if ( (answer == "p" || answer ~ /\[5~/) && +curpage == 1 && cursor == 1) continue + if ( (answer == "g" || answer ~ /\[H/) && ( curpage != 1 || cursor != 1 ) ) { curpage = 1; cursor = 1; break } + if ( (answer == "g" || answer ~ /\[H/) && curpage = 1 && cursor == 1 ) continue + if ( (answer == "G" || answer ~ /\[F/) && ( curpage != page || cursor != Narr - dispnum*(curpage-1) ) ) { curpage = page; cursor = Narr - dispnum*(curpage-1); break } + if ( (answer == "G" || answer ~ /\[F/) && curpage == page && cursor = Narr - dispnum*(curpage-1) ) continue + + ######################### + # Key: Partial Redraw # + ######################### + + if ( (answer == "j" || answer ~ /\[B/) && +cursor <= +dispnum ) { oldCursor = cursor; cursor++; } + if ( (answer == "j" || answer ~ /\[B/) && +cursor > +dispnum && +curpage < +page && +page > 1 ) { cursor = 1; curpage++; break } + if ( (answer == "k" || answer ~ /\[A/) && +cursor == 1 && +curpage > 1 && +page > 1 ) { cursor = dispnum; curpage--; break } + if ( (answer == "k" || answer ~ /\[A/) && +cursor > 1 ) { oldCursor = cursor; cursor--; } + + if ( (answer == "\006") && cursor <= +dispnum ) { oldCursor = cursor; cursor = cursor + move } + if ( (answer == "\006") && +cursor > +dispnum && +curpage < +page && +page > 1 ) { cursor = cursor - dispnum; curpage++; break } + if ( (answer == "\006") && +cursor > Narr - dispnum*(curpage-1) && +curpage == +page ) { cursor = ( +curpage == +page ? Narr - dispnum*(curpage-1) : dispnum ); break } + if ( (answer == "\006") && +cursor == Narr - dispnum*(curpage-1) && +curpage == +page ) break + + if ( (answer == "\025") && cursor >= 1 ) { oldCursor = cursor; cursor = cursor - move } + if ( (answer == "\025") && +cursor < 1 && +curpage > 1 ) { cursor = dispnum + cursor; curpage--; break } + if ( (answer == "\025") && +cursor < 1 && +curpage == 1 ) { cursor = 1; break } + if ( (answer == "\025") && +cursor == 1 && +curpage == 1 ) break + + if ( answer == "H" ) { oldCursor = cursor; cursor = 1; } + if ( answer == "M" ) { oldCursor = cursor; cursor = ( +curpage == +page ? int((Narr - dispnum*(curpage-1))*0.5) : int(dispnum*0.5) ); } + if ( answer == "L" ) { oldCursor = cursor; cursor = ( +curpage == +page ? Narr - dispnum*(curpage-1) : dispnum ); } + + #################### + # Key: Selection # + #################### + + if ( answer == " " ) { + if (selected[dir,Ncursor] == "") { + TMP = disp[Ncursor]; + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", TMP) + selected[dir,Ncursor] = dir TMP; + seldisp[dir,Ncursor] = TMP; + selpage[dir,Ncursor] = curpage; + selnum[dir,Ncursor] = Ncursor; + selorder[++order] = dir SUBSEP Ncursor + bmsg = disp[Ncursor] " selected" + } + else { + for (idx in selorder) { if (selorder[idx] == dir SUBSEP Ncursor) { delete selorder[idx]; break } } + delete selected[dir,Ncursor]; + delete seldisp[dir,Ncursor]; + delete selpage[dir,Ncursor]; + delete selnum[dir,Ncursor]; + bmsg = disp[Ncursor] " cancelled" + } + if (+Narr == 1) { break } + if (+cursor <= +dispnum || +cursor <= +Narr) { cursor++ } + if (+cursor > +dispnum || +cursor > +Narr) { cursor = 1; curpage = ( +curpage == +page ? 1 : curpage + 1 ) } + break + } + + if (answer == "S") { + if (isEmpty(selected)) { + selp = 0 + for (entry = 1; entry in disp; entry++) { + TMP = disp[entry]; + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", TMP) + if (TMP != "./" && TMP != "../") { + selected[dir,entry] = dir TMP; + seldisp[dir,entry] = TMP; + selpage[dir,entry] = ((+entry) % (+dispnum) == 1 ? ++selp : selp) + selnum[dir,entry] = entry; + selorder[++order] = dir SUBSEP entry + } + } + bmsg = "All selected" + } + else { + empty_selected() + bmsg = "All cancelled" + } + break + } + + if (answer == "s") { + # for (sel in selected) { + # selcontent = selcontent "\n" selected[sel] + # } + idx = maxidx(selorder) + for (j = 1; j <= idx; j++) { + if (selorder[j] == "") continue + selcontent = selcontent "\n" j ". " selected[selorder[j]] + } + pager("Selected item: \n" selcontent); selcontent = ""; break; + } + + #################################################################### + # Partial redraw: tmsg, bmsg, old entry, new entry, and selected # + #################################################################### + + Ncursor = cursor+dispnum*(curpage-1); oldNcursor = oldCursor+dispnum*(curpage-1); + if (Ncursor > Narr) { Ncursor = Narr; cursor = Narr - dispnum*(curpage-1); continue } + if (Ncursor < 1) { Ncursor = 1; cursor = 1; continue } + + CUP(dim[1] - 2, 1); # bmsg + printf a_clean >> "/dev/stderr" # clear line + print bmsg >> "/dev/stderr" + + CUP(top + oldCursor*num - num, 1); # old entry + for (i = 1; i <= num; i++) { + printf a_clean >> "/dev/stderr" # clear line + CUP(top + oldCursor*num - num + i, 1) + } + CUP(top + oldCursor*num - num, 1); + printf "%s", oldNcursor ". " disp[oldNcursor] >> "/dev/stderr" + + CUP(top + cursor*num - num, 1); # new entry + for (i = 1; i <= num; i++) { + printf a_clean >> "/dev/stderr" # clear line + CUP(top + cursor*num - num + i, 1) + } + CUP(top + cursor*num - num, 1); + printf "%s%s%s%s", Ncursor ". ", a_reverse, disp[Ncursor], a_reset >> "/dev/stderr" + + if (bmsg !~ /Action.*|Selecting\.\.\./ && ! isEmpty(selected)) draw_selected() + if (bmsg !~ /Action.*|Selecting\.\.\./ && PREVIEW == 1) draw_preview(disp[Ncursor]) + } + + } + + result[1] = disp[answer] + result[2] = bmsg +} + +function pager(msg) { # pager to print out stuff and navigate + printf "\033\1332J\033\133H" >> "/dev/stderr" + if (PREVIEW == 1) { printf "{\"action\": \"remove\", \"identifier\": \"PREVIEW\"}\n" > FIFO_UEBERZUG; close(FIFO_UEBERZUG) } + Nmsgarr = split(msg, msgarr, "\n") + Npager = (Nmsgarr >= dim[1] ? dim[1] : Nmsgarr) + for (i = 1; i <= Npager; i++) { + CUP(i, 1) + printf "%s", msgarr[i] >> "/dev/stderr" + } + + pagerind = 1; + while (key = key_collect(list, pagerind)) { + if (key == "\003" || key == "\033" || key == "q" || key == "h") break + if ((key == "j" || key ~ /\[B/) && i < Nmsgarr) { printf "\033\133%d;H\n", Npager >> "/dev/stderr"; printf msgarr[i++] >> "/dev/stderr" } + if ((key == "k" || key ~ /\[A/) && i > dim[1] + 1) { printf "\033\133H\033\133L" >> "/dev/stderr"; i--; printf msgarr[i-dim[1]] >> "/dev/stderr" } + } + pagerind = 0; +} + +###################### +# Start of Preview # +###################### + +function draw_preview(item) { + + border = int(dim[2]*RATIO) # for preview + + # clear RHS of screen based on border + clean_preview() + + gsub(/\033\[[0-9][0-9]m|\033\[[0-9]m|\033\[m/, "", item) + path = dir item + if (path ~ /.*\/$/) { # dir + content = gen_content(path) + split(content, prev, "\f") + for (i = 1; i <= ((end - top) / num); i++) { + CUP(top + i - 1, border + 1) + print prev[i] >> "/dev/stderr" + } + } + else { # Standard file + if (FMAWK_PREVIEWER == "") { + cmd = "file " path + cmd | getline props + if (props ~ /text/) { + getline content < path + close(path) + split(content, prev, "\n") + for (i = 1; i <= ((end - top) / num); i++) { + CUP(top + i - 1, border + 1) + code = gsub(/\000/, "", prev[i]) + if (code > 0) { + # printf "\033\13338;5;0m\033\13348;5;15m%s\033\133m", "binary" >> "/dev/stderr" + printf "%s%s%s%s", a_reverse, f_white, "binary", a_reset >> "/dev/stderr" + break + } + print prev[i] >> "/dev/stderr" + } + } + } + else { + system(FMAWK_PREVIEWER " \"" path "\" \"" CACHE "\" \"" border+1 "\" \"" ((end - top)/num) "\" \"" top "\" \"" dim[2]-border-1 "\"") + } + + } +} + +function clean_preview() { + for (i = top; i <= end; i++) { + CUP(i, border - 1) + printf "\033\133K" >> "/dev/stderr" # clear line + } + if (FIFO_UEBERZUG == "") return + printf "{\"action\": \"remove\", \"identifier\": \"PREVIEW\"}\n" > FIFO_UEBERZUG + close(FIFO_UEBERZUG) +} diff --git a/buildroot-v86/board/v86/rootfs_overlay/etc/motd b/buildroot-v86/board/v86/rootfs_overlay/etc/motd index b4a6ca8..81d97d5 100644 --- a/buildroot-v86/board/v86/rootfs_overlay/etc/motd +++ b/buildroot-v86/board/v86/rootfs_overlay/etc/motd @@ -17,5 +17,6 @@ Please hook up your (bluetooth) keyboard to use xrsh. Use Ctrl+a+0/1/2/3/.. to switch terminals. Use Ctrl+a+c to create a new terminal. + Use 'save' to save session (survives tab-close) Happy hacking! \o/ diff --git a/buildroot-v86/board/v86/rootfs_overlay/etc/profile.sh b/buildroot-v86/board/v86/rootfs_overlay/etc/profile.sh index 9f3fb88..5209e60 100644 --- a/buildroot-v86/board/v86/rootfs_overlay/etc/profile.sh +++ b/buildroot-v86/board/v86/rootfs_overlay/etc/profile.sh @@ -37,15 +37,22 @@ prompt(){ console(){ js 'return '$1 + printf "\n" } +# usage: require +# +# info: adds javascript/css url/script to DOM require(){ file=$(basename "$1") js '(async () => { await AFRAME.utils.require({"'$file'": "'$1'"}) - })()' + })(); return ""' } +# usage: man +# +# info: simple manual viewer man(){ test "$1" = xrsh && { cat /root/manual.md | less @@ -53,8 +60,23 @@ man(){ } help(){ man xrsh; } +# usage: infinite ./runmydaemon +# +# info: will run daemon forever (restarts when quit) infinite(){ while sleep 1s; do "$@" done } + +# usage: wait_for sleep 5s +# +# info: will print dots while waiting for process to end +wait_for(){ + dotting(){ while sleep 1s; do printf "."; done; } + dotting & + PID=$! + "$@" + kill -9 $PID + printf "\n" +} diff --git a/buildroot-v86/board/v86/rootfs_overlay/etc/profile.xrsh b/buildroot-v86/board/v86/rootfs_overlay/etc/profile.xrsh index 885d007..d75f040 100644 --- a/buildroot-v86/board/v86/rootfs_overlay/etc/profile.xrsh +++ b/buildroot-v86/board/v86/rootfs_overlay/etc/profile.xrsh @@ -2,6 +2,12 @@ test -d /dev/browser || { + move_root_to_9pfs(){ + test -d /mnt/root && return 0 + mv /root /mnt/. + ln -fs /mnt/root /root + } + setup_links(){ ln -fs /etc/motd ~/.motd ln -fs /mnt/profile.browser ~/.profile.browser @@ -37,21 +43,22 @@ test -d /dev/browser || { cat /dev/ttyS1 | xargs -I{} /bin/sh -c 'source /etc/profile; logger "isoterminal.exec({})"; {}' } - setup_reflect_index_html(){ - # listen for writes to index.html and send them to DOM - inotifyd echo /root/index.html | awk '/^w / { system("cat "$2" | grep -vE \"^#!\" > /dev/browser/html") }' - } - - setup_reflect_index_js(){ - # listen for writes to index.js and send them to DOM - inotifyd echo /root/index.js | awk '/^w / { system("cat "$2" | grep -vE \"^#!\" > /dev/browser/js") }' + setup_listen_homedir(){ + sleep 4 # wait for inode of /mnt/root to become live (due to move_root_to_9pfs) + inotifyd echo /mnt/root | awk ' + + # listen for writes to rootdir and send them to DOM + /^[we] \/mnt\/root index\.html/ { system("cat "$2"/"$3" | grep -vE \"^#!\" > /dev/browser/html") } + /^[we] \/mnt\/root index\.js/ { system("cat "$2"/"$3" | grep -vE \"^#!\" > /dev/browser/js") } + + ' } + move_root_to_9pfs setup_browser_dev setup_links setup_network setup_overlayfs setup_incoming_cmds & - setup_reflect_index_html & - setup_reflect_index_js & + setup_listen_homedir & } diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/.screenrc b/buildroot-v86/board/v86/rootfs_overlay/root/.screenrc index 3dc4ae9..19a59bd 100644 --- a/buildroot-v86/board/v86/rootfs_overlay/root/.screenrc +++ b/buildroot-v86/board/v86/rootfs_overlay/root/.screenrc @@ -33,6 +33,6 @@ term xterm-256color defbce on # use current bg color for erased chars # setup windows -screen -t manual 0 /bin/sh -c '/bin/infinite help' -screen -t logs 1 /bin/sh -c '/bin/infinite tail -n1 -f /dev/browser/console /var/log/messages' +screen -t manual 0 /bin/sh --noprofile --norc -c '/bin/infinite help' +screen -t logs 1 /bin/sh --noprofile --norc -c '/bin/infinite tail -n1 -f /dev/browser/console /var/log/messages' screen -t xrsh 2 diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/bin/codemirror b/buildroot-v86/board/v86/rootfs_overlay/root/bin/codemirror index 381118b..1b09e59 100755 --- a/buildroot-v86/board/v86/rootfs_overlay/root/bin/codemirror +++ b/buildroot-v86/board/v86/rootfs_overlay/root/bin/codemirror @@ -1,4 +1,25 @@ -#!/bin/sh -source /etc/profile.sh -require 'com/codemirror.js' # add to dom -echo '' >> /dev/browser/html +#!/bin/js + +(async function(){ + + await AFRAME.utils.require({ + codemirrorjs: "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.58.1/codemirror.js", + codemirrorcss: "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.35.0/codemirror.css", + cmtheme: "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.35.0/theme/shadowfox.css" + }) + + await AFRAME.utils.require({ + cmxml: "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.35.0/mode/xml/xml.js", + cmjavascript: "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.35.0/mode/javascript/javascript.js", + cmcss: "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.35.0/mode/css/css.js", + highlight: "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.35.0/mode/htmlmixed/htmlmixed.js", + codemirrorAF: "com/codemirror.js" + }) + + document.querySelector("a-entity#root").innerHTML += `` + +})() + +return "" // empty stdout(put) + +// for shellscript-equivalent see bin/codemirror diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/bin/codemirror.sh b/buildroot-v86/board/v86/rootfs_overlay/root/bin/codemirror.sh new file mode 100755 index 0000000..7386116 --- /dev/null +++ b/buildroot-v86/board/v86/rootfs_overlay/root/bin/codemirror.sh @@ -0,0 +1,11 @@ +#!/bin/sh +source /etc/profile.sh + +require 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.58.1/codemirror.js' +require 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.35.0/codemirror.css' +require 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.35.0/theme/shadowfox.css' +require 'com/codemirror.js' + +echo "" >> /dev/browser/html + +# for js-equivalent see bin/codemirror diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/bin/save b/buildroot-v86/board/v86/rootfs_overlay/root/bin/save index e27249c..b344390 100755 --- a/buildroot-v86/board/v86/rootfs_overlay/root/bin/save +++ b/buildroot-v86/board/v86/rootfs_overlay/root/bin/save @@ -1,4 +1,13 @@ -#!/bin/js -const isoterminal = document.querySelector('[isoterminal]').components.isoterminal.isoterminal -isoterminal.save() -return "[OK] xrsh state saved\n" +#!/bin/sh +source /etc/profile.sh + +javascript=' + const isoterminal = document.querySelector("[isoterminal]").components.isoterminal.isoterminal + isoterminal.save() + return "[OK] xrsh state saved\n" +' + +echo "[OK] triggering ~/hook.d/save/* scripts" +hook save +echo "[..] please wait.." +js "$javascript" diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/hook.d/.mp4/play b/buildroot-v86/board/v86/rootfs_overlay/root/hook.d/.mp4/play new file mode 100644 index 0000000..8e3d04d --- /dev/null +++ b/buildroot-v86/board/v86/rootfs_overlay/root/hook.d/.mp4/play @@ -0,0 +1,2 @@ +#!/bin/js +// /bin/filemanager => browser play mp3 diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/hook.d/save/tolog b/buildroot-v86/board/v86/rootfs_overlay/root/hook.d/save/tolog new file mode 100755 index 0000000..90c1ead --- /dev/null +++ b/buildroot-v86/board/v86/rootfs_overlay/root/hook.d/save/tolog @@ -0,0 +1,3 @@ +#!/bin/sh +echo "[OK] hook.d/save/tolog: reporting save to OS" +logger "state was saved at $(date)" diff --git a/buildroot-v86/configs/busybox_defconfig b/buildroot-v86/configs/busybox_defconfig new file mode 100644 index 0000000..c5624d1 --- /dev/null +++ b/buildroot-v86/configs/busybox_defconfig @@ -0,0 +1,1199 @@ +# +# Automatically generated make config: don't edit +# Busybox version: 1.33.0 +# Tue Sep 17 07:45:01 2024 +# +CONFIG_HAVE_DOT_CONFIG=y + +# +# Settings +# +CONFIG_DESKTOP=n +# CONFIG_EXTRA_COMPAT is not set +# CONFIG_FEDORA_COMPAT is not set +CONFIG_INCLUDE_SUSv2=y +CONFIG_LONG_OPTS=y +CONFIG_SHOW_USAGE=y +CONFIG_FEATURE_VERBOSE_USAGE=y +# CONFIG_FEATURE_COMPRESS_USAGE is not set +CONFIG_LFS=y +# CONFIG_PAM is not set +CONFIG_FEATURE_DEVPTS=y +# CONFIG_FEATURE_UTMP is not set +# CONFIG_FEATURE_WTMP is not set +CONFIG_FEATURE_PIDFILE=y +CONFIG_PID_FILE_PATH="" +CONFIG_BUSYBOX=y +CONFIG_FEATURE_SHOW_SCRIPT=y +CONFIG_FEATURE_INSTALLER=y +# CONFIG_INSTALL_NO_USR is not set +CONFIG_FEATURE_SUID=y +# CONFIG_FEATURE_SUID_CONFIG is not set +# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set +CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +# CONFIG_SELINUX is not set +# CONFIG_FEATURE_CLEAN_UP is not set +CONFIG_FEATURE_SYSLOG_INFO=y +CONFIG_FEATURE_SYSLOG=y + +# +# Build Options +# +# CONFIG_STATIC is not set +# CONFIG_PIE is not set +# CONFIG_NOMMU is not set +# CONFIG_BUILD_LIBBUSYBOX is not set +# CONFIG_FEATURE_LIBBUSYBOX_STATIC is not set +# CONFIG_FEATURE_INDIVIDUAL is not set +# CONFIG_FEATURE_SHARED_BUSYBOX is not set +CONFIG_CROSS_COMPILER_PREFIX="" +CONFIG_SYSROOT="" +CONFIG_EXTRA_CFLAGS="" +CONFIG_EXTRA_LDFLAGS="" +CONFIG_EXTRA_LDLIBS="" +# CONFIG_USE_PORTABLE_CODE is not set +CONFIG_STACK_OPTIMIZATION_386=y +CONFIG_STATIC_LIBGCC=y + +# +# Installation Options ("make install" behavior) +# +CONFIG_INSTALL_APPLET_SYMLINKS=y +# CONFIG_INSTALL_APPLET_HARDLINKS is not set +# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set +# CONFIG_INSTALL_APPLET_DONT is not set +# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set +# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set +# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set +CONFIG_PREFIX="./_install" + +# +# Debugging Options +# +# CONFIG_DEBUG is not set +# CONFIG_DEBUG_PESSIMIZE is not set +# CONFIG_DEBUG_SANITIZE is not set +# CONFIG_UNIT_TEST is not set +# CONFIG_WERROR is not set +# CONFIG_WARN_SIMPLE_MSG is not set +CONFIG_NO_DEBUG_LIB=y +# CONFIG_DMALLOC is not set +# CONFIG_EFENCE is not set + +# +# Library Tuning +# +# CONFIG_FEATURE_USE_BSS_TAIL is not set +CONFIG_FLOAT_DURATION=y +CONFIG_FEATURE_RTMINMAX=y +CONFIG_FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS=y +CONFIG_FEATURE_BUFFERS_USE_MALLOC=y +# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_PASSWORD_MINLEN=6 +CONFIG_MD5_SMALL=1 +CONFIG_SHA3_SMALL=1 +# CONFIG_FEATURE_FAST_TOP is not set +# CONFIG_FEATURE_ETC_NETWORKS is not set +# CONFIG_FEATURE_ETC_SERVICES is not set +CONFIG_FEATURE_EDITING=y +CONFIG_FEATURE_EDITING_MAX_LEN=1024 +CONFIG_FEATURE_EDITING_VI=y +CONFIG_FEATURE_EDITING_HISTORY=999 +CONFIG_FEATURE_EDITING_SAVEHISTORY=y +# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set +CONFIG_FEATURE_REVERSE_SEARCH=y +CONFIG_FEATURE_TAB_COMPLETION=y +# CONFIG_FEATURE_USERNAME_COMPLETION is not set +CONFIG_FEATURE_EDITING_FANCY_PROMPT=y +CONFIG_FEATURE_EDITING_WINCH=y +# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set +# CONFIG_LOCALE_SUPPORT is not set +# CONFIG_UNICODE_SUPPORT is not set +# CONFIG_UNICODE_USING_LOCALE is not set +# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set +CONFIG_SUBST_WCHAR=0 +CONFIG_LAST_SUPPORTED_WCHAR=0 +# CONFIG_UNICODE_COMBINING_WCHARS is not set +# CONFIG_UNICODE_WIDE_WCHARS is not set +# CONFIG_UNICODE_BIDI_SUPPORT is not set +# CONFIG_UNICODE_NEUTRAL_TABLE is not set +# CONFIG_UNICODE_PRESERVE_BROKEN is not set +CONFIG_FEATURE_NON_POSIX_CP=y +# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set +CONFIG_FEATURE_USE_SENDFILE=y +CONFIG_FEATURE_COPYBUF_KB=4 +CONFIG_FEATURE_SKIP_ROOTFS=y +CONFIG_MONOTONIC_SYSCALL=y +CONFIG_IOCTL_HEX2STR_ERROR=y +CONFIG_FEATURE_HWIB=y + +# +# Applets +# + +# +# Archival Utilities +# +# CONFIG_FEATURE_SEAMLESS_XZ is not set +# CONFIG_FEATURE_SEAMLESS_LZMA is not set +# CONFIG_FEATURE_SEAMLESS_BZ2 is not set +# CONFIG_FEATURE_SEAMLESS_GZ is not set +# CONFIG_FEATURE_SEAMLESS_Z is not set +CONFIG_AR=y +# CONFIG_FEATURE_AR_LONG_FILENAMES is not set +CONFIG_FEATURE_AR_CREATE=y +# CONFIG_UNCOMPRESS is not set +CONFIG_GUNZIP=y +CONFIG_ZCAT=n +CONFIG_FEATURE_GUNZIP_LONG_OPTIONS=y +CONFIG_BUNZIP2=y +CONFIG_BZCAT=n +CONFIG_UNLZMA=n +CONFIG_LZCAT=n +CONFIG_LZMA=n +CONFIG_UNXZ=n +CONFIG_XZCAT=n +CONFIG_XZ=n +# CONFIG_BZIP2 is not set +CONFIG_BZIP2_SMALL=n +CONFIG_FEATURE_BZIP2_DECOMPRESS=n +CONFIG_CPIO=y +# CONFIG_FEATURE_CPIO_O is not set +# CONFIG_FEATURE_CPIO_P is not set +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set +CONFIG_GZIP=y +# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set +CONFIG_GZIP_FAST=0 +# CONFIG_FEATURE_GZIP_LEVELS is not set +CONFIG_FEATURE_GZIP_DECOMPRESS=y +# CONFIG_LZOP is not set +CONFIG_UNLZOP=y +CONFIG_LZOPCAT=y +# CONFIG_LZOP_COMPR_HIGH is not set +# CONFIG_RPM is not set +# CONFIG_RPM2CPIO is not set +CONFIG_TAR=y +CONFIG_FEATURE_TAR_LONG_OPTIONS=y +CONFIG_FEATURE_TAR_CREATE=y +# CONFIG_FEATURE_TAR_AUTODETECT is not set +CONFIG_FEATURE_TAR_FROM=y +# CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set +# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +CONFIG_FEATURE_TAR_TO_COMMAND=y +# CONFIG_FEATURE_TAR_UNAME_GNAME is not set +# CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set +# CONFIG_FEATURE_TAR_SELINUX is not set +CONFIG_UNZIP=y +CONFIG_FEATURE_UNZIP_CDF=y +CONFIG_FEATURE_UNZIP_BZIP2=y +CONFIG_FEATURE_UNZIP_LZMA=y +CONFIG_FEATURE_UNZIP_XZ=y +# CONFIG_FEATURE_LZMA_FAST is not set + +# +# Coreutils +# +CONFIG_BASENAME=y +CONFIG_CAT=y +CONFIG_FEATURE_CATN=y +CONFIG_FEATURE_CATV=y +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set +CONFIG_CHROOT=y +CONFIG_CKSUM=y +# CONFIG_COMM is not set +CONFIG_CP=y +# CONFIG_FEATURE_CP_LONG_OPTIONS is not set +# CONFIG_FEATURE_CP_REFLINK is not set +CONFIG_CUT=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +# CONFIG_FEATURE_DATE_NANO is not set +CONFIG_FEATURE_DATE_COMPAT=y +CONFIG_DD=y +CONFIG_FEATURE_DD_SIGNAL_HANDLING=y +# CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set +CONFIG_FEATURE_DD_IBS_OBS=y +CONFIG_FEATURE_DD_STATUS=y +CONFIG_DF=y +# CONFIG_FEATURE_DF_FANCY is not set +CONFIG_DIRNAME=y +CONFIG_DOS2UNIX=y +CONFIG_UNIX2DOS=y +CONFIG_DU=y +CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_ENV=y +# CONFIG_EXPAND is not set +# CONFIG_UNEXPAND is not set +CONFIG_EXPR=y +CONFIG_EXPR_MATH_SUPPORT_64=y +CONFIG_FACTOR=y +CONFIG_FALSE=y +CONFIG_FOLD=y +CONFIG_HEAD=y +CONFIG_FEATURE_FANCY_HEAD=y +CONFIG_HOSTID=y +CONFIG_ID=y +# CONFIG_GROUPS is not set +CONFIG_INSTALL=y +CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y +CONFIG_LINK=y +CONFIG_LN=y +CONFIG_LOGNAME=y +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_WIDTH=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y +CONFIG_MD5SUM=y +CONFIG_SHA1SUM=y +CONFIG_SHA256SUM=y +CONFIG_SHA512SUM=y +CONFIG_SHA3SUM=y + +# +# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y +CONFIG_MKDIR=y +CONFIG_MKFIFO=y +CONFIG_MKNOD=y +CONFIG_MKTEMP=y +CONFIG_MV=y +CONFIG_NICE=y +CONFIG_NL=y +CONFIG_NOHUP=y +CONFIG_NPROC=y +CONFIG_OD=y +CONFIG_PASTE=y +CONFIG_PRINTENV=y +CONFIG_PRINTF=y +CONFIG_PWD=y +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y +CONFIG_REALPATH=y +CONFIG_RM=y +CONFIG_RMDIR=y +CONFIG_SEQ=y +CONFIG_SHRED=y +# CONFIG_SHUF is not set +CONFIG_SLEEP=y +CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_SORT=y +CONFIG_FEATURE_SORT_BIG=y +# CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set +# CONFIG_SPLIT is not set +# CONFIG_FEATURE_SPLIT_FANCY is not set +# CONFIG_STAT is not set +# CONFIG_FEATURE_STAT_FORMAT is not set +# CONFIG_FEATURE_STAT_FILESYSTEM is not set +CONFIG_STTY=y +# CONFIG_SUM is not set +CONFIG_SYNC=y +# CONFIG_FEATURE_SYNC_FANCY is not set +# CONFIG_FSYNC is not set +# CONFIG_TAC is not set +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TEST=y +CONFIG_TEST1=y +CONFIG_TEST2=y +CONFIG_FEATURE_TEST_64=y +# CONFIG_TIMEOUT is not set +CONFIG_TOUCH=y +# CONFIG_FEATURE_TOUCH_NODEREF is not set +CONFIG_FEATURE_TOUCH_SUSV3=y +CONFIG_TR=y +CONFIG_FEATURE_TR_CLASSES=y +CONFIG_FEATURE_TR_EQUIV=y +CONFIG_TRUE=y +CONFIG_TRUNCATE=y +CONFIG_TTY=y +CONFIG_UNAME=y +CONFIG_UNAME_OSNAME="GNU/Linux" +CONFIG_BB_ARCH=y +CONFIG_UNIQ=y +CONFIG_UNLINK=y +CONFIG_USLEEP=y +CONFIG_UUDECODE=y +CONFIG_BASE32=y +CONFIG_BASE64=y +CONFIG_UUENCODE=y +CONFIG_WC=y +# CONFIG_FEATURE_WC_LARGE is not set +# CONFIG_WHO is not set +# CONFIG_W is not set +# CONFIG_USERS is not set +CONFIG_WHOAMI=y +CONFIG_YES=y + +# +# Common options +# +CONFIG_FEATURE_VERBOSE=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Console Utilities +# +CONFIG_CHVT=y +CONFIG_CLEAR=y +CONFIG_DEALLOCVT=y +CONFIG_DUMPKMAP=y +# CONFIG_FGCONSOLE is not set +# CONFIG_KBD_MODE is not set +CONFIG_LOADFONT=y +# CONFIG_SETFONT is not set +# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set +CONFIG_DEFAULT_SETFONT_DIR="" + +# +# Common options for loadfont and setfont +# +CONFIG_FEATURE_LOADFONT_PSF2=y +CONFIG_FEATURE_LOADFONT_RAW=y +CONFIG_LOADKMAP=y +CONFIG_OPENVT=y +CONFIG_RESET=y +CONFIG_RESIZE=y +CONFIG_FEATURE_RESIZE_PRINT=y +CONFIG_SETCONSOLE=y +# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set +CONFIG_SETKEYCODES=y +CONFIG_SETLOGCONS=y +# CONFIG_SHOWKEY is not set + +# +# Debian Utilities +# +CONFIG_PIPE_PROGRESS=y +CONFIG_RUN_PARTS=y +CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y +# CONFIG_FEATURE_RUN_PARTS_FANCY is not set +CONFIG_START_STOP_DAEMON=y +CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y +CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y +CONFIG_WHICH=y + +# +# klibc-utils +# +# CONFIG_MINIPS is not set +CONFIG_NUKE=y +CONFIG_RESUME=y +CONFIG_RUN_INIT=y + +# +# Editors +# +CONFIG_AWK=y +# CONFIG_FEATURE_AWK_LIBM is not set +CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y +CONFIG_CMP=y +CONFIG_DIFF=y +# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set +CONFIG_FEATURE_DIFF_DIR=y +# CONFIG_ED is not set +CONFIG_PATCH=y +CONFIG_SED=y +CONFIG_VI=y +CONFIG_FEATURE_VI_MAX_LEN=4096 +CONFIG_FEATURE_VI_8BIT=y +CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_FEATURE_VI_SEARCH=y +# CONFIG_FEATURE_VI_REGEX_SEARCH is not set +CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_FEATURE_VI_DOT_CMD=y +CONFIG_FEATURE_VI_READONLY=y +CONFIG_FEATURE_VI_SETOPTS=y +CONFIG_FEATURE_VI_SET=y +CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_FEATURE_VI_ASK_TERMINAL=y +CONFIG_FEATURE_VI_UNDO=y +CONFIG_FEATURE_VI_UNDO_QUEUE=y +CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256 +CONFIG_FEATURE_ALLOW_EXEC=y + +# +# Finding Utilities +# +CONFIG_FIND=y +CONFIG_FEATURE_FIND_PRINT0=y +CONFIG_FEATURE_FIND_MTIME=y +CONFIG_FEATURE_FIND_MMIN=y +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +CONFIG_FEATURE_FIND_EXECUTABLE=y +CONFIG_FEATURE_FIND_XDEV=y +CONFIG_FEATURE_FIND_MAXDEPTH=y +CONFIG_FEATURE_FIND_NEWER=y +# CONFIG_FEATURE_FIND_INUM is not set +CONFIG_FEATURE_FIND_EXEC=y +CONFIG_FEATURE_FIND_EXEC_PLUS=y +CONFIG_FEATURE_FIND_USER=y +CONFIG_FEATURE_FIND_GROUP=y +CONFIG_FEATURE_FIND_NOT=y +CONFIG_FEATURE_FIND_DEPTH=y +CONFIG_FEATURE_FIND_PAREN=y +CONFIG_FEATURE_FIND_SIZE=y +CONFIG_FEATURE_FIND_PRUNE=y +CONFIG_FEATURE_FIND_QUIT=y +# CONFIG_FEATURE_FIND_DELETE is not set +CONFIG_FEATURE_FIND_EMPTY=y +CONFIG_FEATURE_FIND_PATH=y +CONFIG_FEATURE_FIND_REGEX=y +# CONFIG_FEATURE_FIND_CONTEXT is not set +# CONFIG_FEATURE_FIND_LINKS is not set +CONFIG_GREP=y +CONFIG_EGREP=y +CONFIG_FGREP=y +CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_XARGS=y +# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y +CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y +CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL=y +CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE=y + +# +# Init Utilities +# +# CONFIG_BOOTCHARTD is not set +# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set +# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set +CONFIG_HALT=y +CONFIG_POWEROFF=y +CONFIG_REBOOT=y +CONFIG_FEATURE_WAIT_FOR_INIT=y +# CONFIG_FEATURE_CALL_TELINIT is not set +CONFIG_TELINIT_PATH="" +CONFIG_INIT=y +CONFIG_LINUXRC=y +CONFIG_FEATURE_USE_INITTAB=y +CONFIG_FEATURE_KILL_REMOVED=y +CONFIG_FEATURE_KILL_DELAY=0 +CONFIG_FEATURE_INIT_SCTTY=y +CONFIG_FEATURE_INIT_SYSLOG=y +CONFIG_FEATURE_INIT_QUIET=y +# CONFIG_FEATURE_INIT_COREDUMPS is not set +CONFIG_INIT_TERMINAL_TYPE="linux" +CONFIG_FEATURE_INIT_MODIFY_CMDLINE=y + +# +# Login/Password Management Utilities +# +CONFIG_FEATURE_SHADOWPASSWDS=y +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_USE_BB_SHADOW is not set +CONFIG_USE_BB_CRYPT=y +CONFIG_USE_BB_CRYPT_SHA=y +# CONFIG_ADD_SHELL is not set +# CONFIG_REMOVE_SHELL is not set +CONFIG_ADDGROUP=y +# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set +CONFIG_ADDUSER=y +# CONFIG_FEATURE_CHECK_NAMES is not set +CONFIG_LAST_ID=60000 +CONFIG_FIRST_SYSTEM_ID=100 +CONFIG_LAST_SYSTEM_ID=999 +# CONFIG_CHPASSWD is not set +CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="md5" +# CONFIG_CRYPTPW is not set +CONFIG_MKPASSWD=y +CONFIG_DELUSER=y +CONFIG_DELGROUP=y +# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set +CONFIG_GETTY=y +CONFIG_LOGIN=y +# CONFIG_LOGIN_SESSION_AS_CHILD is not set +# CONFIG_LOGIN_SCRIPTS is not set +CONFIG_FEATURE_NOLOGIN=y +CONFIG_FEATURE_SECURETTY=y +CONFIG_PASSWD=y +CONFIG_FEATURE_PASSWD_WEAK_CHECK=y +CONFIG_SU=y +CONFIG_FEATURE_SU_SYSLOG=y +CONFIG_FEATURE_SU_CHECKS_SHELLS=y +# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set +CONFIG_SULOGIN=y +CONFIG_VLOCK=y + +# +# Linux Ext2 FS Progs +# +CONFIG_CHATTR=y +CONFIG_FSCK=y +CONFIG_LSATTR=y +# CONFIG_TUNE2FS is not set + +# +# Linux Module Utilities +# +# CONFIG_MODPROBE_SMALL is not set +# CONFIG_DEPMOD is not set +CONFIG_INSMOD=y +CONFIG_LSMOD=y +CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT=y +# CONFIG_MODINFO is not set +CONFIG_MODPROBE=y +# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set +CONFIG_RMMOD=y + +# +# Options common to multiple modutils +# +CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS=y +# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set +# CONFIG_FEATURE_2_4_MODULES is not set +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set +CONFIG_FEATURE_CHECK_TAINTED_MODULE=y +# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set +CONFIG_FEATURE_MODUTILS_ALIAS=y +CONFIG_FEATURE_MODUTILS_SYMBOLS=y +CONFIG_DEFAULT_MODULES_DIR="/lib/modules" +CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" + +# +# Linux System Utilities +# +# CONFIG_ACPID is not set +# CONFIG_FEATURE_ACPID_COMPAT is not set +# CONFIG_BLKDISCARD is not set +CONFIG_BLKID=y +# CONFIG_FEATURE_BLKID_TYPE is not set +# CONFIG_BLOCKDEV is not set +# CONFIG_CAL is not set +CONFIG_CHRT=y +CONFIG_DMESG=y +CONFIG_FEATURE_DMESG_PRETTY=y +CONFIG_EJECT=y +# CONFIG_FEATURE_EJECT_SCSI is not set +CONFIG_FALLOCATE=y +# CONFIG_FATATTR is not set +CONFIG_FBSET=y +CONFIG_FEATURE_FBSET_FANCY=y +CONFIG_FEATURE_FBSET_READMODE=y +CONFIG_FDFORMAT=y +CONFIG_FDISK=n +# CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set +CONFIG_FEATURE_FDISK_WRITABLE=y +# CONFIG_FEATURE_AIX_LABEL is not set +# CONFIG_FEATURE_SGI_LABEL is not set +# CONFIG_FEATURE_SUN_LABEL is not set +# CONFIG_FEATURE_OSF_LABEL is not set +CONFIG_FEATURE_GPT_LABEL=y +CONFIG_FEATURE_FDISK_ADVANCED=y +# CONFIG_FINDFS is not set +CONFIG_FLOCK=y +CONFIG_FDFLUSH=y +CONFIG_FREERAMDISK=y +# CONFIG_FSCK_MINIX is not set +CONFIG_FSFREEZE=y +CONFIG_FSTRIM=y +CONFIG_GETOPT=y +CONFIG_FEATURE_GETOPT_LONG=y +CONFIG_HEXDUMP=y +# CONFIG_HD is not set +CONFIG_XXD=y +CONFIG_HWCLOCK=y +CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y +# CONFIG_IONICE is not set +CONFIG_IPCRM=y +CONFIG_IPCS=y +# CONFIG_LAST is not set +# CONFIG_FEATURE_LAST_FANCY is not set +CONFIG_LOSETUP=y +CONFIG_LSPCI=y +CONFIG_LSUSB=y +CONFIG_MDEV=y +CONFIG_FEATURE_MDEV_CONF=y +CONFIG_FEATURE_MDEV_RENAME=y +# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set +CONFIG_FEATURE_MDEV_EXEC=y +# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set +CONFIG_FEATURE_MDEV_DAEMON=y +CONFIG_MESG=y +CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y +CONFIG_MKE2FS=n +# CONFIG_MKFS_EXT2 is not set +# CONFIG_MKFS_MINIX is not set +# CONFIG_FEATURE_MINIX2 is not set +# CONFIG_MKFS_REISER is not set +CONFIG_MKDOSFS=y +# CONFIG_MKFS_VFAT is not set +CONFIG_MKSWAP=y +# CONFIG_FEATURE_MKSWAP_UUID is not set +CONFIG_MORE=y +CONFIG_MOUNT=y +# CONFIG_FEATURE_MOUNT_FAKE is not set +# CONFIG_FEATURE_MOUNT_VERBOSE is not set +# CONFIG_FEATURE_MOUNT_HELPERS is not set +# CONFIG_FEATURE_MOUNT_LABEL is not set +# CONFIG_FEATURE_MOUNT_NFS is not set +CONFIG_FEATURE_MOUNT_CIFS=y +CONFIG_FEATURE_MOUNT_FLAGS=y +CONFIG_FEATURE_MOUNT_FSTAB=y +CONFIG_FEATURE_MOUNT_OTHERTAB=y +CONFIG_MOUNTPOINT=y +CONFIG_NOLOGIN=y +# CONFIG_NOLOGIN_DEPENDENCIES is not set +# CONFIG_NSENTER is not set +CONFIG_PIVOT_ROOT=y +CONFIG_RDATE=y +# CONFIG_RDEV is not set +CONFIG_READPROFILE=y +CONFIG_RENICE=y +# CONFIG_REV is not set +# CONFIG_RTCWAKE is not set +# CONFIG_SCRIPT is not set +# CONFIG_SCRIPTREPLAY is not set +CONFIG_SETARCH=y +CONFIG_LINUX32=y +CONFIG_LINUX64=y +CONFIG_SETPRIV=y +CONFIG_FEATURE_SETPRIV_DUMP=y +CONFIG_FEATURE_SETPRIV_CAPABILITIES=y +CONFIG_FEATURE_SETPRIV_CAPABILITY_NAMES=y +CONFIG_SETSID=y +CONFIG_SWAPON=y +# CONFIG_FEATURE_SWAPON_DISCARD is not set +# CONFIG_FEATURE_SWAPON_PRI is not set +CONFIG_SWAPOFF=y +CONFIG_FEATURE_SWAPONOFF_LABEL=y +CONFIG_SWITCH_ROOT=y +# CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set +# CONFIG_FEATURE_TASKSET_CPULIST is not set +CONFIG_UEVENT=y +CONFIG_UMOUNT=y +CONFIG_FEATURE_UMOUNT_ALL=y +# CONFIG_UNSHARE is not set +# CONFIG_WALL is not set + +# +# Common options for mount/umount +# +CONFIG_FEATURE_MOUNT_LOOP=y +CONFIG_FEATURE_MOUNT_LOOP_CREATE=y +# CONFIG_FEATURE_MTAB_SUPPORT is not set +CONFIG_VOLUMEID=y + +# +# Filesystem/Volume identification +# +# CONFIG_FEATURE_VOLUMEID_BCACHE is not set +# CONFIG_FEATURE_VOLUMEID_BTRFS is not set +# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set +CONFIG_FEATURE_VOLUMEID_EROFS=y +CONFIG_FEATURE_VOLUMEID_EXFAT=y +CONFIG_FEATURE_VOLUMEID_EXT=y +CONFIG_FEATURE_VOLUMEID_F2FS=y +CONFIG_FEATURE_VOLUMEID_FAT=y +# CONFIG_FEATURE_VOLUMEID_HFS is not set +# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set +# CONFIG_FEATURE_VOLUMEID_JFS is not set +# CONFIG_FEATURE_VOLUMEID_LFS is not set +# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set +# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set +# CONFIG_FEATURE_VOLUMEID_LUKS is not set +CONFIG_FEATURE_VOLUMEID_MINIX=y +# CONFIG_FEATURE_VOLUMEID_NILFS is not set +# CONFIG_FEATURE_VOLUMEID_NTFS is not set +# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set +# CONFIG_FEATURE_VOLUMEID_REISERFS is not set +# CONFIG_FEATURE_VOLUMEID_ROMFS is not set +# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set +# CONFIG_FEATURE_VOLUMEID_SYSV is not set +CONFIG_FEATURE_VOLUMEID_UBIFS=y +# CONFIG_FEATURE_VOLUMEID_UDF is not set +# CONFIG_FEATURE_VOLUMEID_XFS is not set + +# +# Miscellaneous Utilities +# +# CONFIG_ADJTIMEX is not set +# CONFIG_BBCONFIG is not set +# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set +CONFIG_BC=y +CONFIG_DC=y +CONFIG_FEATURE_DC_BIG=y +# CONFIG_FEATURE_DC_LIBM is not set +CONFIG_FEATURE_BC_INTERACTIVE=y +CONFIG_FEATURE_BC_LONG_OPTIONS=y +# CONFIG_BEEP is not set +CONFIG_FEATURE_BEEP_FREQ=0 +CONFIG_FEATURE_BEEP_LENGTH_MS=0 +# CONFIG_CHAT is not set +# CONFIG_FEATURE_CHAT_NOFAIL is not set +# CONFIG_FEATURE_CHAT_TTY_HIFI is not set +# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set +# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set +# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set +# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set +# CONFIG_FEATURE_CHAT_CLR_ABORT is not set +# CONFIG_CONSPY is not set +CONFIG_CROND=y +# CONFIG_FEATURE_CROND_D is not set +# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +CONFIG_FEATURE_CROND_SPECIAL_TIMES=y +CONFIG_FEATURE_CROND_DIR="/var/spool/cron" +CONFIG_CRONTAB=y +# CONFIG_DEVFSD is not set +# CONFIG_DEVFSD_MODLOAD is not set +# CONFIG_DEVFSD_FG_NP is not set +# CONFIG_DEVFSD_VERBOSE is not set +# CONFIG_FEATURE_DEVFS is not set +CONFIG_DEVMEM=y +# CONFIG_FBSPLASH is not set +# CONFIG_FLASH_ERASEALL is not set +# CONFIG_FLASH_LOCK is not set +# CONFIG_FLASH_UNLOCK is not set +# CONFIG_FLASHCP is not set +CONFIG_HDPARM=y +CONFIG_FEATURE_HDPARM_GET_IDENTITY=y +# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set +# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set +CONFIG_HEXEDIT=y +CONFIG_I2CGET=y +CONFIG_I2CSET=y +CONFIG_I2CDUMP=y +CONFIG_I2CDETECT=y +CONFIG_I2CTRANSFER=y +CONFIG_INOTIFYD=y +CONFIG_LESS=y +CONFIG_FEATURE_LESS_MAXLINES=9999999 +CONFIG_FEATURE_LESS_BRACKETS=y +CONFIG_FEATURE_LESS_FLAGS=y +CONFIG_FEATURE_LESS_TRUNCATE=y +# CONFIG_FEATURE_LESS_MARKS is not set +CONFIG_FEATURE_LESS_REGEXP=y +# CONFIG_FEATURE_LESS_WINCH is not set +# CONFIG_FEATURE_LESS_ASK_TERMINAL is not set +# CONFIG_FEATURE_LESS_DASHCMD is not set +# CONFIG_FEATURE_LESS_LINENUMS is not set +# CONFIG_FEATURE_LESS_RAW is not set +# CONFIG_FEATURE_LESS_ENV is not set +CONFIG_LSSCSI=y +CONFIG_MAKEDEVS=y +# CONFIG_FEATURE_MAKEDEVS_LEAF is not set +CONFIG_FEATURE_MAKEDEVS_TABLE=y +# CONFIG_MAN is not set +CONFIG_MICROCOM=y +CONFIG_MIM=y +CONFIG_MT=y +# CONFIG_NANDWRITE is not set +# CONFIG_NANDDUMP is not set +CONFIG_PARTPROBE=y +# CONFIG_RAIDAUTORUN is not set +# CONFIG_READAHEAD is not set +# CONFIG_RFKILL is not set +# CONFIG_RUNLEVEL is not set +# CONFIG_RX is not set +CONFIG_SETFATTR=y +CONFIG_SETSERIAL=y +CONFIG_STRINGS=y +CONFIG_TIME=y +CONFIG_TS=y +# CONFIG_TTYSIZE is not set +# CONFIG_UBIATTACH is not set +# CONFIG_UBIDETACH is not set +# CONFIG_UBIMKVOL is not set +# CONFIG_UBIRMVOL is not set +# CONFIG_UBIRSVOL is not set +# CONFIG_UBIUPDATEVOL is not set +CONFIG_UBIRENAME=y +# CONFIG_VOLNAME is not set +CONFIG_WATCHDOG=y + +# +# Networking Utilities +# +CONFIG_FEATURE_IPV6=y +# CONFIG_FEATURE_UNIX_LOCAL is not set +CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +# CONFIG_FEATURE_TLS_SHA1 is not set +CONFIG_ARP=y +CONFIG_ARPING=y +# CONFIG_BRCTL is not set +# CONFIG_FEATURE_BRCTL_FANCY is not set +# CONFIG_FEATURE_BRCTL_SHOW is not set +CONFIG_DNSD=y +CONFIG_ETHER_WAKE=y +# CONFIG_FTPD is not set +# CONFIG_FEATURE_FTPD_WRITE is not set +# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set +# CONFIG_FEATURE_FTPD_AUTHENTICATION is not set +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set +CONFIG_HOSTNAME=y +CONFIG_DNSDOMAINNAME=y +# CONFIG_HTTPD is not set +# CONFIG_FEATURE_HTTPD_RANGES is not set +# CONFIG_FEATURE_HTTPD_SETUID is not set +# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set +# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set +# CONFIG_FEATURE_HTTPD_CGI is not set +# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set +# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set +# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set +# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set +# CONFIG_FEATURE_HTTPD_PROXY is not set +# CONFIG_FEATURE_HTTPD_GZIP is not set +# CONFIG_FEATURE_HTTPD_ETAG is not set +# CONFIG_FEATURE_HTTPD_LAST_MODIFIED is not set +# CONFIG_FEATURE_HTTPD_DATE is not set +# CONFIG_FEATURE_HTTPD_ACL_IP is not set +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +CONFIG_FEATURE_IFCONFIG_SLIP=y +CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y +CONFIG_FEATURE_IFCONFIG_HW=y +# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set +# CONFIG_IFENSLAVE is not set +# CONFIG_IFPLUGD is not set +CONFIG_IFUP=y +CONFIG_IFDOWN=y +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" +CONFIG_FEATURE_IFUPDOWN_IP=y +CONFIG_FEATURE_IFUPDOWN_IPV4=y +CONFIG_FEATURE_IFUPDOWN_IPV6=y +CONFIG_FEATURE_IFUPDOWN_MAPPING=y +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set +CONFIG_INETD=y +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO=y +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD=y +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME=y +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME=y +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN=y +# CONFIG_FEATURE_INETD_RPC is not set +CONFIG_IP=y +CONFIG_IPADDR=y +CONFIG_IPLINK=y +CONFIG_IPROUTE=y +CONFIG_IPTUNNEL=y +CONFIG_IPRULE=y +CONFIG_IPNEIGH=y +CONFIG_FEATURE_IP_ADDRESS=y +CONFIG_FEATURE_IP_LINK=y +CONFIG_FEATURE_IP_ROUTE=y +CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2" +CONFIG_FEATURE_IP_TUNNEL=y +CONFIG_FEATURE_IP_RULE=y +CONFIG_FEATURE_IP_NEIGH=y +# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set +# CONFIG_IPCALC is not set +# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set +# CONFIG_FEATURE_IPCALC_FANCY is not set +# CONFIG_FAKEIDENTD is not set +CONFIG_NAMEIF=y +# CONFIG_FEATURE_NAMEIF_EXTENDED is not set +# CONFIG_NBDCLIENT is not set +# CONFIG_NC is not set +# CONFIG_NETCAT is not set +# CONFIG_NC_SERVER is not set +# CONFIG_NC_EXTRA is not set +# CONFIG_NC_110_COMPAT is not set +CONFIG_NETSTAT=y +# CONFIG_FEATURE_NETSTAT_WIDE is not set +# CONFIG_FEATURE_NETSTAT_PRG is not set +CONFIG_NSLOOKUP=y +CONFIG_FEATURE_NSLOOKUP_BIG=y +CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS=y +# CONFIG_NTPD is not set +# CONFIG_FEATURE_NTPD_SERVER is not set +# CONFIG_FEATURE_NTPD_CONF is not set +# CONFIG_FEATURE_NTP_AUTH is not set +CONFIG_PING=y +# CONFIG_PING6 is not set +CONFIG_FEATURE_FANCY_PING=y +# CONFIG_PSCAN is not set +CONFIG_ROUTE=y +# CONFIG_SLATTACH is not set +# CONFIG_SSL_CLIENT is not set +CONFIG_TC=y +CONFIG_FEATURE_TC_INGRESS=y +# CONFIG_TCPSVD is not set +# CONFIG_UDPSVD is not set +CONFIG_TELNET=y +CONFIG_FEATURE_TELNET_TTYPE=y +CONFIG_FEATURE_TELNET_AUTOLOGIN=y +CONFIG_FEATURE_TELNET_WIDTH=y +# CONFIG_TELNETD is not set +# CONFIG_FEATURE_TELNETD_STANDALONE is not set +# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set +CONFIG_TFTP=y +# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set +CONFIG_FEATURE_TFTP_HPA_COMPAT=y +# CONFIG_TFTPD is not set +CONFIG_FEATURE_TFTP_GET=y +CONFIG_FEATURE_TFTP_PUT=y +CONFIG_FEATURE_TFTP_BLOCKSIZE=y +# CONFIG_TFTP_DEBUG is not set +# CONFIG_TLS is not set +CONFIG_TRACEROUTE=y +# CONFIG_TRACEROUTE6 is not set +# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set +# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set +# CONFIG_TUNCTL is not set +# CONFIG_FEATURE_TUNCTL_UG is not set +CONFIG_VCONFIG=y +CONFIG_WGET=y +CONFIG_FEATURE_WGET_LONG_OPTIONS=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +CONFIG_FEATURE_WGET_TIMEOUT=y +# CONFIG_FEATURE_WGET_HTTPS is not set +# CONFIG_FEATURE_WGET_OPENSSL is not set +# CONFIG_WHOIS is not set +# CONFIG_ZCIP is not set +# CONFIG_UDHCPD is not set +# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +CONFIG_DHCPD_LEASES_FILE="" +# CONFIG_DUMPLEASES is not set +# CONFIG_DHCPRELAY is not set +CONFIG_UDHCPC=y +CONFIG_FEATURE_UDHCPC_ARPING=y +CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y +CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" +# CONFIG_UDHCPC6 is not set +# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set +# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set +# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set +# CONFIG_FEATURE_UDHCPC6_RFC5970 is not set + +# +# Common options for DHCP applets +# +# CONFIG_FEATURE_UDHCP_PORT is not set +CONFIG_UDHCP_DEBUG=0 +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +CONFIG_FEATURE_UDHCP_RFC3397=y +CONFIG_FEATURE_UDHCP_8021Q=y +CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n -O search" + +# +# Print Utilities +# +# CONFIG_LPD is not set +# CONFIG_LPR is not set +# CONFIG_LPQ is not set + +# +# Mail Utilities +# +# CONFIG_MAKEMIME is not set +# CONFIG_POPMAILDIR is not set +# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set +# CONFIG_REFORMIME is not set +# CONFIG_FEATURE_REFORMIME_COMPAT is not set +# CONFIG_SENDMAIL is not set +CONFIG_FEATURE_MIME_CHARSET="" + +# +# Process Utilities +# +CONFIG_FREE=y +CONFIG_FUSER=y +# CONFIG_IOSTAT is not set +CONFIG_KILL=y +CONFIG_KILLALL=y +CONFIG_KILLALL5=y +CONFIG_LSOF=y +# CONFIG_MPSTAT is not set +# CONFIG_NMETER is not set +# CONFIG_PGREP is not set +# CONFIG_PKILL is not set +CONFIG_PIDOF=y +CONFIG_FEATURE_PIDOF_SINGLE=y +CONFIG_FEATURE_PIDOF_OMIT=y +# CONFIG_PMAP is not set +# CONFIG_POWERTOP is not set +# CONFIG_FEATURE_POWERTOP_INTERACTIVE is not set +CONFIG_PS=y +# CONFIG_FEATURE_PS_WIDE is not set +# CONFIG_FEATURE_PS_LONG is not set +# CONFIG_FEATURE_PS_TIME is not set +# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set +# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set +# CONFIG_PSTREE is not set +# CONFIG_PWDX is not set +# CONFIG_SMEMCAP is not set +CONFIG_BB_SYSCTL=y +CONFIG_TOP=y +CONFIG_FEATURE_TOP_INTERACTIVE=y +CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +# CONFIG_FEATURE_TOP_SMP_CPU is not set +# CONFIG_FEATURE_TOP_DECIMALS is not set +# CONFIG_FEATURE_TOP_SMP_PROCESS is not set +# CONFIG_FEATURE_TOPMEM is not set +CONFIG_UPTIME=y +# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set +CONFIG_WATCH=y +# CONFIG_FEATURE_SHOW_THREADS is not set + +# +# Runit Utilities +# +# CONFIG_CHPST is not set +# CONFIG_SETUIDGID is not set +# CONFIG_ENVUIDGID is not set +# CONFIG_ENVDIR is not set +# CONFIG_SOFTLIMIT is not set +# CONFIG_RUNSV is not set +# CONFIG_RUNSVDIR is not set +# CONFIG_FEATURE_RUNSVDIR_LOG is not set +# CONFIG_SV is not set +CONFIG_SV_DEFAULT_SERVICE_DIR="" +CONFIG_SVC=y +CONFIG_SVOK=y +# CONFIG_SVLOGD is not set +# CONFIG_CHCON is not set +# CONFIG_GETENFORCE is not set +# CONFIG_GETSEBOOL is not set +# CONFIG_LOAD_POLICY is not set +# CONFIG_MATCHPATHCON is not set +# CONFIG_RUNCON is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_SESTATUS is not set +# CONFIG_SETENFORCE is not set +# CONFIG_SETFILES is not set +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set +# CONFIG_RESTORECON is not set +# CONFIG_SETSEBOOL is not set + +# +# Shells +# +CONFIG_SH_IS_ASH=y +# CONFIG_SH_IS_HUSH is not set +# CONFIG_SH_IS_NONE is not set +# CONFIG_BASH_IS_ASH is not set +# CONFIG_BASH_IS_HUSH is not set +CONFIG_BASH_IS_NONE=y +CONFIG_SHELL_ASH=y +CONFIG_ASH=y +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +CONFIG_ASH_INTERNAL_GLOB=y +CONFIG_ASH_BASH_COMPAT=y +# CONFIG_ASH_BASH_SOURCE_CURDIR is not set +CONFIG_ASH_BASH_NOT_FOUND_HOOK=y +CONFIG_ASH_JOB_CONTROL=y +CONFIG_ASH_ALIAS=y +CONFIG_ASH_RANDOM_SUPPORT=y +CONFIG_ASH_EXPAND_PRMT=y +CONFIG_ASH_IDLE_TIMEOUT=y +# CONFIG_ASH_MAIL is not set +CONFIG_ASH_ECHO=y +CONFIG_ASH_PRINTF=y +CONFIG_ASH_TEST=y +CONFIG_ASH_HELP=y +CONFIG_ASH_GETOPTS=y +CONFIG_ASH_CMDCMD=y +# CONFIG_CTTYHACK is not set +# CONFIG_HUSH is not set +# CONFIG_SHELL_HUSH is not set +# CONFIG_HUSH_BASH_COMPAT is not set +# CONFIG_HUSH_BRACE_EXPANSION is not set +# CONFIG_HUSH_LINENO_VAR is not set +# CONFIG_HUSH_BASH_SOURCE_CURDIR is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_SAVEHISTORY is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set +# CONFIG_HUSH_CASE is not set +# CONFIG_HUSH_FUNCTIONS is not set +# CONFIG_HUSH_LOCAL is not set +# CONFIG_HUSH_RANDOM_SUPPORT is not set +# CONFIG_HUSH_MODE_X is not set +# CONFIG_HUSH_ECHO is not set +# CONFIG_HUSH_PRINTF is not set +# CONFIG_HUSH_TEST is not set +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_EXPORT is not set +# CONFIG_HUSH_EXPORT_N is not set +# CONFIG_HUSH_READONLY is not set +# CONFIG_HUSH_KILL is not set +# CONFIG_HUSH_WAIT is not set +# CONFIG_HUSH_COMMAND is not set +# CONFIG_HUSH_TRAP is not set +# CONFIG_HUSH_TYPE is not set +# CONFIG_HUSH_TIMES is not set +# CONFIG_HUSH_READ is not set +# CONFIG_HUSH_SET is not set +# CONFIG_HUSH_UNSET is not set +# CONFIG_HUSH_ULIMIT is not set +# CONFIG_HUSH_UMASK is not set +# CONFIG_HUSH_GETOPTS is not set +# CONFIG_HUSH_MEMLEAK is not set + +# +# Options common to all shells +# +CONFIG_FEATURE_SH_MATH=y +CONFIG_FEATURE_SH_MATH_64=y +CONFIG_FEATURE_SH_MATH_BASE=y +CONFIG_FEATURE_SH_EXTRA_QUIET=y +# CONFIG_FEATURE_SH_STANDALONE is not set +# CONFIG_FEATURE_SH_NOFORK is not set +CONFIG_FEATURE_SH_READ_FRAC=y +# CONFIG_FEATURE_SH_HISTFILESIZE is not set +CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS=y + +# +# System Logging Utilities +# +CONFIG_KLOGD=y +CONFIG_FEATURE_KLOGD_KLOGCTL=y +CONFIG_LOGGER=y +# CONFIG_LOGREAD is not set +# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set +CONFIG_SYSLOGD=y +CONFIG_FEATURE_ROTATE_LOGFILE=y +CONFIG_FEATURE_REMOTE_LOG=y +# CONFIG_FEATURE_SYSLOGD_DUP is not set +# CONFIG_FEATURE_SYSLOGD_CFG is not set +# CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set +CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256 +# CONFIG_FEATURE_IPC_SYSLOG is not set +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 +# CONFIG_FEATURE_KMSG_SYSLOG is not set diff --git a/dist/v86-linux.iso b/dist/v86-linux.iso index 1f8a641..6141963 100644 Binary files a/dist/v86-linux.iso and b/dist/v86-linux.iso differ