diff --git a/packages/util-linux/build.sh b/packages/util-linux/build.sh index 4f54f8beb..3fb37c314 100644 --- a/packages/util-linux/build.sh +++ b/packages/util-linux/build.sh @@ -1,7 +1,7 @@ TERMUX_PKG_HOMEPAGE=https://en.wikipedia.org/wiki/Util-linux TERMUX_PKG_DESCRIPTION="Miscellaneous system utilities" -TERMUX_PKG_VERSION=2.30.1 -TERMUX_PKG_SHA256=1be4363a91ac428c9e43fc04dc6d2c66a19ec1e36f1105bd4b481540be13b841 +TERMUX_PKG_VERSION=2.32 +TERMUX_PKG_SHA256=6c7397abc764e32e8159c2e96042874a190303e77adceb4ac5bd502a272a4734 TERMUX_PKG_SRCURL=https://www.kernel.org/pub/linux/utils/util-linux/v${TERMUX_PKG_VERSION:0:4}/util-linux-${TERMUX_PKG_VERSION}.tar.xz TERMUX_PKG_DEPENDS="ncurses, libutil, libcrypt" TERMUX_PKG_EXTRA_CONFIGURE_ARGS=" @@ -21,6 +21,7 @@ ac_cv_func_unshare=yes --disable-libmount --disable-lsmem --disable-chmem +--disable-rfkill " # bin/column is currently bundled in the fish package: TERMUX_PKG_RM_AFTER_INSTALL="bin/column share/man/man1/column.1" diff --git a/packages/util-linux/sys-utils-ipcutils.c.patch b/packages/util-linux/sys-utils-ipcutils.c.patch index 032263e1a..629a17b4b 100644 --- a/packages/util-linux/sys-utils-ipcutils.c.patch +++ b/packages/util-linux/sys-utils-ipcutils.c.patch @@ -1,528 +1,175 @@ -diff -u -r ../util-linux-2.29.1/sys-utils/ipcutils.c ./sys-utils/ipcutils.c ---- ../util-linux-2.29.1/sys-utils/ipcutils.c 2016-11-02 13:57:31.661167155 +0100 -+++ ./sys-utils/ipcutils.c 2017-02-01 23:01:22.043207759 +0100 -@@ -18,513 +18,56 @@ +diff -u -r ../util-linux-2.32/sys-utils/ipcutils.c ./sys-utils/ipcutils.c +--- ../util-linux-2.32/sys-utils/ipcutils.c 2017-10-20 10:37:04.297168101 +0000 ++++ ./sys-utils/ipcutils.c 2018-05-19 00:56:13.647850483 +0000 +@@ -18,6 +18,9 @@ int ipc_msg_get_limits(struct ipc_limits *lim) { -- if (path_exist(_PATH_PROC_IPC_MSGMNI) && -- path_exist(_PATH_PROC_IPC_MSGMNB) && -- path_exist(_PATH_PROC_IPC_MSGMAX)) { -- -- lim->msgmni = path_read_s32(_PATH_PROC_IPC_MSGMNI); -- lim->msgmnb = path_read_s32(_PATH_PROC_IPC_MSGMNB); -- lim->msgmax = path_read_s32(_PATH_PROC_IPC_MSGMAX); -- } else { -- struct msginfo msginfo; -- -- if (msgctl(0, IPC_INFO, (struct msqid_ds *) &msginfo) < 0) -- return 1; -- lim->msgmni = msginfo.msgmni; -- lim->msgmnb = msginfo.msgmnb; -- lim->msgmax = msginfo.msgmax; -- } -- -- return 0; ++#ifdef __ANDROID__ + return -1; ++#else + if (path_exist(_PATH_PROC_IPC_MSGMNI) && + path_exist(_PATH_PROC_IPC_MSGMNB) && + path_exist(_PATH_PROC_IPC_MSGMAX)) { +@@ -36,10 +39,14 @@ + } + + return 0; ++#endif } int ipc_sem_get_limits(struct ipc_limits *lim) { -- FILE *f; -- int rc = 0; -- -- lim->semvmx = SEMVMX; -- -- f = path_fopen("r", 0, _PATH_PROC_IPC_SEM); -- if (f) { -- rc = fscanf(f, "%d\t%d\t%d\t%d", -- &lim->semmsl, &lim->semmns, &lim->semopm, &lim->semmni); -- fclose(f); -- -- } -- -- if (rc != 4) { -- struct seminfo seminfo = { .semmni = 0 }; -- union semun arg = { .array = (ushort *) &seminfo }; -- -- if (semctl(0, 0, IPC_INFO, arg) < 0) -- return 1; -- lim->semmni = seminfo.semmni; -- lim->semmsl = seminfo.semmsl; -- lim->semmns = seminfo.semmns; -- lim->semopm = seminfo.semopm; -- } -- -- return 0; ++#ifdef __ANDROID__ + return -1; ++#else + FILE *f; + int rc = 0; + +@@ -66,10 +73,14 @@ + } + + return 0; ++#endif } int ipc_shm_get_limits(struct ipc_limits *lim) { -- lim->shmmin = SHMMIN; -- -- if (path_exist(_PATH_PROC_IPC_SHMALL) && -- path_exist(_PATH_PROC_IPC_SHMMAX) && -- path_exist(_PATH_PROC_IPC_SHMMNI)) { -- -- lim->shmall = path_read_u64(_PATH_PROC_IPC_SHMALL); -- lim->shmmax = path_read_u64(_PATH_PROC_IPC_SHMMAX); -- lim->shmmni = path_read_u64(_PATH_PROC_IPC_SHMMNI); -- -- } else { -- struct shminfo *shminfo; -- struct shmid_ds shmbuf; -- -- if (shmctl(0, IPC_INFO, &shmbuf) < 0) -- return 1; -- shminfo = (struct shminfo *) &shmbuf; -- lim->shmmni = shminfo->shmmni; -- lim->shmall = shminfo->shmall; -- lim->shmmax = shminfo->shmmax; -- } -- -- return 0; ++#ifdef __ANDROID__ + return -1; ++#else + lim->shmmin = SHMMIN; + + if (path_exist(_PATH_PROC_IPC_SHMALL) && +@@ -93,10 +104,14 @@ + } + + return 0; ++#endif } int ipc_shm_get_info(int id, struct shm_data **shmds) { -- FILE *f; -- int i = 0, maxid; -- char buf[BUFSIZ]; -- struct shm_data *p; -- struct shmid_ds dummy; -- -- p = *shmds = xcalloc(1, sizeof(struct shm_data)); -- p->next = NULL; -- -- f = path_fopen("r", 0, _PATH_PROC_SYSV_SHM); -- if (!f) -- goto shm_fallback; -- -- while (fgetc(f) != '\n'); /* skip header */ -- -- while (fgets(buf, sizeof(buf), f) != NULL) { -- /* scan for the first 14-16 columns (e.g. Linux 2.6.32 has 14) */ -- p->shm_rss = 0xdead; -- p->shm_swp = 0xdead; -- if (sscanf(buf, -- "%d %d %o %"SCNu64 " %u %u " -- "%"SCNu64 " %u %u %u %u %"SCNi64 " %"SCNi64 " %"SCNi64 -- " %"SCNu64 " %"SCNu64 "\n", -- &p->shm_perm.key, -- &p->shm_perm.id, -- &p->shm_perm.mode, -- &p->shm_segsz, -- &p->shm_cprid, -- &p->shm_lprid, -- &p->shm_nattch, -- &p->shm_perm.uid, -- &p->shm_perm.gid, -- &p->shm_perm.cuid, -- &p->shm_perm.cgid, -- &p->shm_atim, -- &p->shm_dtim, -- &p->shm_ctim, -- &p->shm_rss, -- &p->shm_swp) < 14) -- continue; /* invalid line, skipped */ -- -- if (id > -1) { -- /* ID specified */ -- if (id == p->shm_perm.id) { -- i = 1; -- break; -- } else -- continue; -- } -- -- p->next = xcalloc(1, sizeof(struct shm_data)); -- p = p->next; -- p->next = NULL; -- i++; -- } -- -- if (i == 0) -- free(*shmds); -- fclose(f); -- return i; -- -- /* Fallback; /proc or /sys file(s) missing. */ --shm_fallback: -- maxid = shmctl(0, SHM_INFO, &dummy); -- -- for (int j = 0; j <= maxid; j++) { -- int shmid; -- struct shmid_ds shmseg; -- struct ipc_perm *ipcp = &shmseg.shm_perm; -- -- shmid = shmctl(j, SHM_STAT, &shmseg); -- if (shmid < 0 || (id > -1 && shmid != id)) { -- continue; -- } -- -- i++; -- p->shm_perm.key = ipcp->KEY; -- p->shm_perm.id = shmid; -- p->shm_perm.mode = ipcp->mode; -- p->shm_segsz = shmseg.shm_segsz; -- p->shm_cprid = shmseg.shm_cpid; -- p->shm_lprid = shmseg.shm_lpid; -- p->shm_nattch = shmseg.shm_nattch; -- p->shm_perm.uid = ipcp->uid; -- p->shm_perm.gid = ipcp->gid; -- p->shm_perm.cuid = ipcp->cuid; -- p->shm_perm.cgid = ipcp->cuid; -- p->shm_atim = shmseg.shm_atime; -- p->shm_dtim = shmseg.shm_dtime; -- p->shm_ctim = shmseg.shm_ctime; -- p->shm_rss = 0xdead; -- p->shm_swp = 0xdead; -- -- if (id < 0) { -- p->next = xcalloc(1, sizeof(struct shm_data)); -- p = p->next; -- p->next = NULL; -- } else -- break; -- } -- -- if (i == 0) -- free(*shmds); -- return i; ++#ifdef __ANDROID__ + return -1; ++#else + FILE *f; + int i = 0, maxid; + char buf[BUFSIZ]; +@@ -201,17 +216,23 @@ + if (i == 0) + free(*shmds); + return i; ++#endif } void ipc_shm_free_info(struct shm_data *shmds) { -- while (shmds) { -- struct shm_data *next = shmds->next; -- free(shmds); -- shmds = next; -- } --} -- --static void get_sem_elements(struct sem_data *p) --{ -- size_t i; -- -- if (!p || !p->sem_nsems || p->sem_perm.id < 0) -- return; -- -- p->elements = xcalloc(p->sem_nsems, sizeof(struct sem_elem)); -- -- for (i = 0; i < p->sem_nsems; i++) { -- struct sem_elem *e = &p->elements[i]; -- union semun arg = { .val = 0 }; -- -- e->semval = semctl(p->sem_perm.id, i, GETVAL, arg); -- if (e->semval < 0) -- err(EXIT_FAILURE, _("%s failed"), "semctl(GETVAL)"); -- -- e->ncount = semctl(p->sem_perm.id, i, GETNCNT, arg); -- if (e->ncount < 0) -- err(EXIT_FAILURE, _("%s failed"), "semctl(GETNCNT)"); -- -- e->zcount = semctl(p->sem_perm.id, i, GETZCNT, arg); -- if (e->zcount < 0) -- err(EXIT_FAILURE, _("%s failed"), "semctl(GETZCNT)"); -- -- e->pid = semctl(p->sem_perm.id, i, GETPID, arg); -- if (e->pid < 0) -- err(EXIT_FAILURE, _("%s failed"), "semctl(GETPID)"); -- } ++#ifdef __ANDROID__ + return; ++#else + while (shmds) { + struct shm_data *next = shmds->next; + free(shmds); + shmds = next; + } ++#endif } ++#ifndef __ANDROID__ + static void get_sem_elements(struct sem_data *p) + { + size_t i; +@@ -242,9 +263,13 @@ + err(EXIT_FAILURE, _("%s failed"), "semctl(GETPID)"); + } + } ++#endif + int ipc_sem_get_info(int id, struct sem_data **semds) { -- FILE *f; -- int i = 0, maxid; -- struct sem_data *p; -- struct seminfo dummy; -- union semun arg; -- -- p = *semds = xcalloc(1, sizeof(struct sem_data)); -- p->next = NULL; -- -- f = path_fopen("r", 0, _PATH_PROC_SYSV_SEM); -- if (!f) -- goto sem_fallback; -- -- while (fgetc(f) != '\n') ; /* skip header */ -- -- while (feof(f) == 0) { -- if (fscanf(f, -- "%d %d %o %" SCNu64 " %u %u %u %u %" -- SCNi64 " %" SCNi64 "\n", -- &p->sem_perm.key, -- &p->sem_perm.id, -- &p->sem_perm.mode, -- &p->sem_nsems, -- &p->sem_perm.uid, -- &p->sem_perm.gid, -- &p->sem_perm.cuid, -- &p->sem_perm.cgid, -- &p->sem_otime, -- &p->sem_ctime) != 10) -- continue; -- -- if (id > -1) { -- /* ID specified */ -- if (id == p->sem_perm.id) { -- get_sem_elements(p); -- i = 1; -- break; -- } else -- continue; -- } -- -- p->next = xcalloc(1, sizeof(struct sem_data)); -- p = p->next; -- p->next = NULL; -- i++; -- } -- -- if (i == 0) -- free(*semds); -- fclose(f); -- return i; -- -- /* Fallback; /proc or /sys file(s) missing. */ --sem_fallback: -- arg.array = (ushort *) (void *)&dummy; -- maxid = semctl(0, 0, SEM_INFO, arg); -- -- for (int j = 0; j <= maxid; j++) { -- int semid; -- struct semid_ds semseg; -- struct ipc_perm *ipcp = &semseg.sem_perm; -- arg.buf = (struct semid_ds *)&semseg; -- -- semid = semctl(j, 0, SEM_STAT, arg); -- if (semid < 0 || (id > -1 && semid != id)) { -- continue; -- } -- -- i++; -- p->sem_perm.key = ipcp->KEY; -- p->sem_perm.id = semid; -- p->sem_perm.mode = ipcp->mode; -- p->sem_nsems = semseg.sem_nsems; -- p->sem_perm.uid = ipcp->uid; -- p->sem_perm.gid = ipcp->gid; -- p->sem_perm.cuid = ipcp->cuid; -- p->sem_perm.cgid = ipcp->cuid; -- p->sem_otime = semseg.sem_otime; -- p->sem_ctime = semseg.sem_ctime; -- -- if (id < 0) { -- p->next = xcalloc(1, sizeof(struct sem_data)); -- p = p->next; -- p->next = NULL; -- i++; -- } else { -- get_sem_elements(p); -- break; -- } -- } -- -- if (i == 0) -- free(*semds); -- return i; ++#ifdef __ANDROID__ + return -1; ++#else + FILE *f; + int i = 0, maxid; + struct sem_data *p; +@@ -339,20 +364,28 @@ + if (i == 0) + free(*semds); + return i; ++#endif } void ipc_sem_free_info(struct sem_data *semds) { -- while (semds) { -- struct sem_data *next = semds->next; -- free(semds->elements); -- free(semds); -- semds = next; -- } ++#ifdef __ANDROID__ + return; ++#else + while (semds) { + struct sem_data *next = semds->next; + free(semds->elements); + free(semds); + semds = next; + } ++#endif } int ipc_msg_get_info(int id, struct msg_data **msgds) { -- FILE *f; -- int i = 0, maxid; -- struct msg_data *p; -- struct msqid_ds dummy; -- struct msqid_ds msgseg; -- -- p = *msgds = xcalloc(1, sizeof(struct msg_data)); -- p->next = NULL; -- -- f = path_fopen("r", 0, _PATH_PROC_SYSV_MSG); -- if (!f) -- goto msg_fallback; -- -- while (fgetc(f) != '\n') ; /* skip header */ -- -- while (feof(f) == 0) { -- if (fscanf(f, -- "%d %d %o %" SCNu64 " %" SCNu64 -- " %u %u %u %u %u %u %" SCNi64 " %" SCNi64 " %" SCNi64 "\n", -- &p->msg_perm.key, -- &p->msg_perm.id, -- &p->msg_perm.mode, -- &p->q_cbytes, -- &p->q_qnum, -- &p->q_lspid, -- &p->q_lrpid, -- &p->msg_perm.uid, -- &p->msg_perm.gid, -- &p->msg_perm.cuid, -- &p->msg_perm.cgid, -- &p->q_stime, -- &p->q_rtime, -- &p->q_ctime) != 14) -- continue; -- -- if (id > -1) { -- /* ID specified */ -- if (id == p->msg_perm.id) { -- if (msgctl(id, IPC_STAT, &msgseg) != -1) -- p->q_qbytes = msgseg.msg_qbytes; -- i = 1; -- break; -- } else -- continue; -- } -- -- p->next = xcalloc(1, sizeof(struct msg_data)); -- p = p->next; -- p->next = NULL; -- i++; -- } -- -- if (i == 0) -- free(*msgds); -- fclose(f); -- return i; -- -- /* Fallback; /proc or /sys file(s) missing. */ --msg_fallback: -- maxid = msgctl(0, MSG_INFO, &dummy); -- -- for (int j = 0; j <= maxid; j++) { -- int msgid; -- struct ipc_perm *ipcp = &msgseg.msg_perm; -- -- msgid = msgctl(j, MSG_STAT, &msgseg); -- if (msgid < 0 || (id > -1 && msgid != id)) { -- continue; -- } -- -- i++; -- p->msg_perm.key = ipcp->KEY; -- p->msg_perm.id = msgid; -- p->msg_perm.mode = ipcp->mode; -- p->q_cbytes = msgseg.msg_cbytes; -- p->q_qnum = msgseg.msg_qnum; -- p->q_lspid = msgseg.msg_lspid; -- p->q_lrpid = msgseg.msg_lrpid; -- p->msg_perm.uid = ipcp->uid; -- p->msg_perm.gid = ipcp->gid; -- p->msg_perm.cuid = ipcp->cuid; -- p->msg_perm.cgid = ipcp->cgid; -- p->q_stime = msgseg.msg_stime; -- p->q_rtime = msgseg.msg_rtime; -- p->q_ctime = msgseg.msg_ctime; -- p->q_qbytes = msgseg.msg_qbytes; -- -- if (id < 0) { -- p->next = xcalloc(1, sizeof(struct msg_data)); -- p = p->next; -- p->next = NULL; -- } else -- break; -- } -- -- if (i == 0) -- free(*msgds); -- return i; ++#ifdef __ANDROID__ + return -1; ++#else + FILE *f; + int i = 0, maxid; + struct msg_data *p; +@@ -451,19 +484,27 @@ + if (i == 0) + free(*msgds); + return i; ++#endif } void ipc_msg_free_info(struct msg_data *msgds) { -- while (msgds) { -- struct msg_data *next = msgds->next; -- free(msgds); -- msgds = next; -- } ++#ifdef __ANDROID__ + return; ++#else + while (msgds) { + struct msg_data *next = msgds->next; + free(msgds); + msgds = next; + } ++#endif } void ipc_print_perms(FILE *f, struct ipc_stat *is) { -- struct passwd *pw; -- struct group *gr; -- -- fprintf(f, "%-10d %-10o", is->id, is->mode & 0777); -- -- if ((pw = getpwuid(is->cuid))) -- fprintf(f, " %-10s", pw->pw_name); -- else -- fprintf(f, " %-10u", is->cuid); -- -- if ((gr = getgrgid(is->cgid))) -- fprintf(f, " %-10s", gr->gr_name); -- else -- fprintf(f, " %-10u", is->cgid); -- -- if ((pw = getpwuid(is->uid))) -- fprintf(f, " %-10s", pw->pw_name); -- else -- fprintf(f, " %-10u", is->uid); -- -- if ((gr = getgrgid(is->gid))) -- fprintf(f, " %-10s\n", gr->gr_name); -- else -- fprintf(f, " %-10u\n", is->gid); ++#ifdef __ANDROID__ + return; ++#else + struct passwd *pw; + struct group *gr; + +@@ -488,11 +529,15 @@ + fprintf(f, " %-10s\n", gr->gr_name); + else + fprintf(f, " %-10u\n", is->gid); ++#endif } void ipc_print_size(int unit, char *msg, uint64_t size, const char *end, int width) { -- char format[32]; -- -- if (!msg) -- /* NULL */ ; -- else if (msg[strlen(msg) - 1] == '=') -- printf("%s", msg); -- else if (unit == IPC_UNIT_BYTES) -- printf(_("%s (bytes) = "), msg); -- else if (unit == IPC_UNIT_KB) -- printf(_("%s (kbytes) = "), msg); -- else -- printf("%s = ", msg); -- -- switch (unit) { -- case IPC_UNIT_DEFAULT: -- case IPC_UNIT_BYTES: -- sprintf(format, "%%%dju", width); -- printf(format, size); -- break; -- case IPC_UNIT_KB: -- sprintf(format, "%%%dju", width); -- printf(format, size / 1024); -- break; -- case IPC_UNIT_HUMAN: -- sprintf(format, "%%%ds", width); -- printf(format, size_to_human_string(SIZE_SUFFIX_1LETTER, size)); -- break; -- default: -- /* impossible occurred */ -- abort(); -- } -- -- if (end) -- printf("%s", end); ++#ifdef __ANDROID__ + return; ++#else + char format[32]; + + if (!msg) +@@ -531,4 +576,5 @@ + + if (end) + printf("%s", end); ++#endif }