diff --git a/Makefile b/Makefile index 69d24870c408df6f2057afa13b2f1fd7ac485f4d..3034a3f8c961a45bd3dd52c57aedfb95cbe6a8f2 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ include kconfig/Makefile $(KCONFIG_CONFIG): $(KCONFIG_TOP) @if [ -e "$(KCONFIG_CONFIG)" ]; then make silentoldconfig; \ - else echo "Not configured (run 'make defconfig' or 'make menuconfig')";\ + else echo "Not configured (run 'make defconfig' or 'make menuconfig' or 'make customconfig' for liteos_a)";\ exit 1; fi $(KCONFIG_TOP): generated/Config.in generated/Config.probed diff --git a/kconfig/Makefile b/kconfig/Makefile index 90a8148e723736af602711cbfcd5655abd7d5da4..9ff587435a9884c4fe5932cac1d0d377c22246aa 100644 --- a/kconfig/Makefile +++ b/kconfig/Makefile @@ -4,6 +4,7 @@ KCONFIG_TOP = Config.in KCONFIG_PROJECT = ToyBox +CUSTOM_NAME = ../../kernel/liteos_a/apps/toybox/liteos_a_custom.config obj = ./kconfig PHONY += clean help oldconfig menuconfig config silentoldconfig \ randconfig allyesconfig allnoconfig allmodconfig defconfig @@ -29,6 +30,9 @@ allyesconfig: $(obj)/conf $(KCONFIG_TOP) allnoconfig: $(obj)/conf $(KCONFIG_TOP) $< -n $(KCONFIG_TOP) > /dev/null +customconfig: $(obj)/conf $(KCONFIG_TOP) + $< -D $(CUSTOM_NAME) $(KCONFIG_TOP) > /dev/null + defconfig: $(obj)/conf $(KCONFIG_TOP) $< -D /dev/null $(KCONFIG_TOP) > /dev/null diff --git a/lib/dirtree.c b/lib/dirtree.c index df38b25777b4d419d587f02ba7073ed050ab7a46..106144021559bdb9ea027f5c9ab19f71fd9688ef 100644 --- a/lib/dirtree.c +++ b/lib/dirtree.c @@ -116,9 +116,13 @@ struct dirtree *dirtree_handle_callback(struct dirtree *new, flags = callback(new); if (S_ISDIR(new->st.st_mode) && (flags & (DIRTREE_RECURSE|DIRTREE_COMEAGAIN))) +#if CFG_KERNEL_TYPE_LITEOS flags = dirtree_recurse(new, callback, + openat(dirtree_parentfd(new), new->name, O_CLOEXEC|O_DIRECTORY), flags); +#else + flags = dirtree_recurse(new, callback, openat(dirtree_parentfd(new), new->name, O_CLOEXEC), flags); - +#endif // If this had children, it was callback's job to free them already. if (!(flags & DIRTREE_SAVE)) { free(new); diff --git a/scripts/make.sh b/scripts/make.sh index 538ba1211c19f7d74e17a812f20edd91024058fa..b03cc4e604369437dafd4111d2e0926bbc163aa7 100755 --- a/scripts/make.sh +++ b/scripts/make.sh @@ -59,7 +59,9 @@ then echo "USE_TOYBOX(NEWTOY(toybox, NULL, TOYFLAG_STAYROOT))" > generated/newtoys.h $SED -n -e 's/^USE_[A-Z0-9_]*(/&/p' toys/*/*.c \ - | $SED 's/\(.*TOY(\)\([^,]*\),\(.*\)/\2 \1\2,\3/' | sort -s -k 1,1 \ + | $SED 's/\(.*TOY(\)\([^,]*\),\(.*\)/\2 \1\2,\3/' \ + | $SED 's/.*TOY(\([^,]*\), MAC_\(.*\))/\1 \2/' \ + | sort -s -k 1,1 \ | $SED 's/[^ ]* //' >> generated/newtoys.h [ $? -ne 0 ] && exit 1 fi diff --git a/toys.h b/toys.h index 177918a666b3e1ec99e3b062892df0acf2c42ffa..cdfad865be711eaeb0239ed6e7bc68d221f677ac 100644 --- a/toys.h +++ b/toys.h @@ -7,6 +7,7 @@ #include "generated/config.h" #include "lib/portability.h" +#include "syscall.h" // General posix-2008 headers #include @@ -34,7 +35,9 @@ #include #include #include +#include #include +#include #include #include #include diff --git a/toys/lsb/mount.c b/toys/lsb/mount.c index 296d6864ff324e00268cdad48951b8dbc90e97f0..2ee312b37c3b1d4073dc3ceca983ad1ab0bf9c03 100644 --- a/toys/lsb/mount.c +++ b/toys/lsb/mount.c @@ -173,6 +173,7 @@ static void mount_filesystem(char *dev, char *dir, char *type, if (FLAG(f)) return; +#if !CFG_KERNEL_TYPE_LITEOS if (getuid()) { if (TT.okuser) TT.okuser = 0; else { @@ -181,7 +182,7 @@ static void mount_filesystem(char *dev, char *dir, char *type, return; } } - +#endif if (strstart(&dev, "UUID=")) { char *s = tortoise(0, (char *[]){"blkid", "-U", dev, 0}); @@ -329,6 +330,7 @@ void mount_main(void) // Do we need to do an /etc/fstab trawl? // This covers -a, -o remount, one argument, all user mounts +#if !CFG_KERNEL_TYPE_LITEOS if (FLAG(a) || (dev && (!dir || getuid() || remount))) { if (!remount) dlist_terminate(mtl = xgetmountlist("/etc/fstab")); @@ -385,7 +387,9 @@ void mount_main(void) remount ? "/proc/mounts" : "fstab"); // show mounts from /proc/mounts - } else if (!dev) { + } else +#endif + if (!dev) { for (mtl = xgetmountlist(0); mtl && (mm = dlist_pop(&mtl)); free(mm)) { char *s = 0; diff --git a/toys/lsb/umount.c b/toys/lsb/umount.c index 3c9e3ca10cc7752e7d8ca85d53700a4f7a9702a5..fda4c05579709b6f2d01edbd550530cf24393433 100644 --- a/toys/lsb/umount.c +++ b/toys/lsb/umount.c @@ -51,6 +51,7 @@ GLOBALS( static void do_umount(char *dir, char *dev, int flags) { // is it ok for this user to umount this mount? +#if !CFG_KERNEL_TYPE_LITEOS if (CFG_TOYBOX_SUID && getuid()) { struct mtab_list *mt = dlist_terminate(xgetmountlist("/etc/fstab")); int len, user = 0; @@ -74,6 +75,7 @@ static void do_umount(char *dir, char *dev, int flags) return; } } +#endif if (!umount2(dir, flags)) { if (toys.optflags & FLAG_v) xprintf("%s unmounted\n", dir); diff --git a/toys/net/ifconfig.c b/toys/net/ifconfig.c index f8f1277e66c7e864575869f32b811a8067459274..e3b7a09f24f4b7544576e93a37d40e2b82f0a14f 100644 --- a/toys/net/ifconfig.c +++ b/toys/net/ifconfig.c @@ -376,11 +376,28 @@ void ifconfig_main(void) struct ifreq ifre; int i; +#if CFG_KERNEL_TYPE_LITEOS + struct ar { + int toycount; + char** ArgvBuffer; + } argvs; + + argvs.ArgvBuffer = toys.argv + 1; + argvs.toycount = toys.optc; + if (argvs.ArgvBuffer[0] && strcmp("-a", argvs.ArgvBuffer[0]) == 0) + argvs.toycount++; + + TT.sockfd = xsocket(AF_INET, SOCK_DGRAM, 0); + syscall(__NR_ioctl, TT.sockfd, L_IFCONFIG, &argvs); + close(TT.sockfd); + return; +#else TT.sockfd = xsocket(AF_INET, SOCK_DGRAM, 0); if(toys.optc < 2) { show_iface(*argv); return; } +#endif // Open interface memset(&ifre, 0, sizeof(struct ifreq)); diff --git a/toys/net/ping.c b/toys/net/ping.c index 9ae7c856f59b8b8016cf559e897568135bc406e7..de89a9dfbf15cb778cee29824163cd787098d67f 100644 --- a/toys/net/ping.c +++ b/toys/net/ping.c @@ -71,6 +71,25 @@ static void summary(int sig) // assumes aligned and can read even number of bytes static unsigned short pingchksum(unsigned short *data, int len) { +#if CFG_KERNEL_TYPE_LITEOS + u_int32_t sum = 0; + int nwords = len >> 1; + + while (nwords-- != 0) sum += *data++; + if (len & 1) { + union { + u_int16_t w; + u_int8_t c[2]; + } u; + u.c[0] = *(u_char *) data; + u.c[1] = 0; + sum += u.w; + } + // end-around-carry + sum = (sum >> 16) + (sum & 0xffff); + sum += (sum >> 16); + return (~sum); +#else unsigned short u = 0, d; // circular carry is endian independent: bits from high byte go to low byte @@ -80,8 +99,8 @@ static unsigned short pingchksum(unsigned short *data, int len) if (d >= (u += d)) u++; len -= 2; } - return u; +#endif } void ping_main(void) @@ -93,8 +112,11 @@ void ping_main(void) struct sockaddr *sa = (void *)&srcaddr; int family = 0, len; long long tnext, tW, tnow, tw; - unsigned short seq = 0, pkttime; - + unsigned short seq = 0 ,pkttime; +#if CFG_KERNEL_TYPE_LITEOS + long long tmp_tnow; +#endif + // Set nonstatic default values if (!(toys.optflags&FLAG_i)) TT.i = (toys.optflags&FLAG_f) ? 200 : 1000; else if (TT.i<200 && getuid()) error_exit("need root for -i <200"); @@ -145,8 +167,13 @@ void ping_main(void) // Open DGRAM socket sa->sa_family = ai->ai_family; +#if CFG_KERNEL_TYPE_LITEOS + TT.sock = socket(ai->ai_family, SOCK_RAW, + len = (ai->ai_family == AF_INET) ? IPPROTO_ICMP : IPPROTO_ICMPV6); +#else TT.sock = socket(ai->ai_family, SOCK_DGRAM, len = (ai->ai_family == AF_INET) ? IPPROTO_ICMP : IPPROTO_ICMPV6); +#endif if (TT.sock == -1) { perror_msg("socket SOCK_DGRAM %x", len); if (errno == EACCES) { @@ -186,7 +213,9 @@ void ping_main(void) tnext = millitime(); if (TT.w) tw = TT.w*1000+tnext; +#if !CFG_KERNEL_TYPE_LITEOS sigatexit(summary); +#endif // Send/receive packets for (;;) { @@ -212,7 +241,11 @@ void ping_main(void) ih->type = (ai->ai_family == AF_INET) ? 8 : 128; ih->un.echo.id = getpid(); ih->un.echo.sequence = ++seq; +#if CFG_KERNEL_TYPE_LITEOS + if (TT.s >= 4) tmp_tnow = tnow; +#else if (TT.s >= 4) *(unsigned *)(ih+1) = tnow; +#endif ih->checksum = 0; ih->checksum = pingchksum((void *)toybuf, TT.s+sizeof(*ih)); @@ -237,8 +270,11 @@ void ping_main(void) continue; TT.recv++; +#if CFG_KERNEL_TYPE_LITEOS + TT.fugit += (pkttime = millitime()-tmp_tnow); +#else TT.fugit += (pkttime = millitime()-*(unsigned *)(ih+1)); - +#endif // reply id == 0 for ipv4, 129 for ipv6 if (!(toys.optflags&FLAG_q)) { @@ -255,7 +291,9 @@ void ping_main(void) toys.exitval = 0; } +#if !CFG_KERNEL_TYPE_LITEOS sigatexit(0); +#endif summary(0); if (CFG_TOYBOX_FREE) { diff --git a/toys/posix/ls.c b/toys/posix/ls.c index d4c0211a129748ae4e50ed7325ceee834a596ef1..6f4008f9c43d0166cede22ae3d1566557f5bd769 100644 --- a/toys/posix/ls.c +++ b/toys/posix/ls.c @@ -319,8 +319,11 @@ static void listfiles(int dirfd, struct dirtree *indir) dt = indir->child; if (dt && S_ISDIR(dt->st.st_mode) && !dt->next && !(flags&(FLAG_d|FLAG_R))) { +#if CFG_KERNEL_TYPE_LITEOS + listfiles(open(dt->name, O_DIRECTORY), TT.singledir = dt); +#else listfiles(open(dt->name, 0), TT.singledir = dt); - +#endif return; } @@ -410,8 +413,11 @@ static void listfiles(int dirfd, struct dirtree *indir) char et = endtype(st), *ss; // If we couldn't stat, output ? for most fields +#if !CFG_KERNEL_TYPE_LITEOS zap = !st->st_blksize && !st->st_dev && !st->st_ino; - +#else + zap = 0; +#endif // Skip directories at the top of the tree when -d isn't set if (S_ISDIR(mode) && !indir->parent && !(flags & FLAG_d)) continue; TT.nl_title=1; diff --git a/toys/posix/ps.c b/toys/posix/ps.c index 0c8e8e81797cd5ea69dcd6f63ec9ab02070bac49..422d6b69151fcc9793740bfad87a9134b22b94ee 100644 --- a/toys/posix/ps.c +++ b/toys/posix/ps.c @@ -44,11 +44,20 @@ * TODO: top: thread support and SMP * TODO: pgrep -f only searches the amount of cmdline that fits in toybuf. +USE_PS(NEWTOY(ps, MAC_#if CONFIG_CFG_KERNEL_TYPE_LITEOS) +USE_PS(NEWTOY(ps, "k(sort)*P(ppid)*aAdeflMno*O*p(pid)*s*t*Tu*U*g*G*wZ#<1a[!ol][+Ae][!oO]", TOYFLAG_BIN|TOYFLAG_LOCALE)) +USE_PS(NEWTOY(ps, MAC_#else) USE_PS(NEWTOY(ps, "k(sort)*P(ppid)*aAdeflMno*O*p(pid)*s*t*Tu*U*g*G*wZ[!ol][+Ae][!oO]", TOYFLAG_BIN|TOYFLAG_LOCALE)) +USE_PS(NEWTOY(ps, MAC_#endif) // stayroot because iotop needs root to read other process' proc/$$/io // TOP and IOTOP have a large common option block used for common processing, // the default values are different but the flags are in the same order. + +USE_PS(NEWTOY(top, MAC_#if CONFIG_CFG_KERNEL_TYPE_LITEOS) +USE_TOP(NEWTOY(top, ">0O*" "Hk*o*p*u*s#<1d%<100=3000m#n#<1abq[!oO]", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LOCALE)) +USE_PS(NEWTOY(top, MAC_#else) USE_TOP(NEWTOY(top, ">0O*" "Hk*o*p*u*s#<1d%<100=3000m#n#<1bq[!oO]", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LOCALE)) +USE_PS(NEWTOY(top, MAC_#endif) USE_IOTOP(NEWTOY(iotop, ">0AaKO" "Hk*o*p*u*s#<1=7d%<100=3000m#n#<1bq", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_STAYROOT|TOYFLAG_LOCALE)) USE_PGREP(NEWTOY(pgrep, "?cld:u*U*t*s*P*g*G*fnovxL:[-no]", TOYFLAG_USR|TOYFLAG_BIN)) USE_PKILL(NEWTOY(pkill, "?Vu*U*t*s*P*g*G*fnovxl:[-no]", TOYFLAG_USR|TOYFLAG_BIN)) @@ -1279,8 +1288,27 @@ static void default_ko(char *s, void *fields, char *err, struct arg_list *arg) if (x) help_help(); } +#if CFG_KERNEL_TYPE_LITEOS +#define TOP_CMD_WIHT_A 0x10001 +#define TOP_CMD_WITHOUT_A 0x10002 +#endif + void ps_main(void) { +#if CFG_KERNEL_TYPE_LITEOS + printf("\nhello world toys.argv[1] = %s toys.argv[2] = %s\n",toys.argv[1], toys.argv[2]); + + if ( toys.argv[1] && !strcmp(toys.argv[1], "-a")) { + printf("\n -a \n"); + sysconf(TOP_CMD_WIHT_A); + } + else + { + printf("\n null \n"); + sysconf(TOP_CMD_WITHOUT_A); + } +#endif +/* char **arg; struct dirtree *dt; char *not_o; @@ -1398,6 +1426,7 @@ void ps_main(void) free(TT.UU.ptr); llist_traverse(TT.fields, free); } +*/ } #define CLEANUP_ps @@ -1758,8 +1787,21 @@ static void top_setup(char *defo, char *defk) setsort(TT.top.s-1); } + void top_main(void) { +#if CFG_KERNEL_TYPE_LITEOS + if ( toys.argv[1] && !strcmp(toys.argv[1], "-a")) { + printf("\n -a \n"); + sysconf(TOP_CMD_WIHT_A); + } + else + { + printf("\n null \n"); + sysconf(TOP_CMD_WITHOUT_A); + } +#endif +/* sprintf(toybuf, "%cID,USER,%s%%CPU,%%MEM,TIME+,%s", FLAG(H) ? 'T' : 'P', TT.top.O ? "" : "PR,NI,VIRT,RES,SHR,S,", FLAG(H) ? "CMD:15=THREAD,NAME=PROCESS" : "ARGS"); @@ -1773,6 +1815,7 @@ void top_main(void) } top_common(merge_deltas); +*/ } #define CLEANUP_top