Merge branch 'for-next/misc'
This commit is contained in:
commit
e0093dcf23
|
@ -32,7 +32,7 @@ static int do_timeout(int argc, char *argv[])
|
||||||
char str[2] = { };
|
char str[2] = { };
|
||||||
const char *varname = NULL;
|
const char *varname = NULL;
|
||||||
|
|
||||||
while((opt = getopt(argc, argv, "crsav:")) > 0) {
|
while ((opt = getopt(argc, argv, "crsav:e")) > 0) {
|
||||||
switch(opt) {
|
switch(opt) {
|
||||||
case 'r':
|
case 'r':
|
||||||
flags |= CONSOLE_COUNTDOWN_RETURN;
|
flags |= CONSOLE_COUNTDOWN_RETURN;
|
||||||
|
@ -46,6 +46,9 @@ static int do_timeout(int argc, char *argv[])
|
||||||
case 's':
|
case 's':
|
||||||
flags |= CONSOLE_COUNTDOWN_SILENT;
|
flags |= CONSOLE_COUNTDOWN_SILENT;
|
||||||
break;
|
break;
|
||||||
|
case 'e':
|
||||||
|
flags |= CONSOLE_COUNTDOWN_EXTERN;
|
||||||
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
varname = optarg;
|
varname = optarg;
|
||||||
break;
|
break;
|
||||||
|
@ -73,6 +76,7 @@ BAREBOX_CMD_HELP_TEXT("Options:")
|
||||||
BAREBOX_CMD_HELP_OPT("-a", "interrupt on any key")
|
BAREBOX_CMD_HELP_OPT("-a", "interrupt on any key")
|
||||||
BAREBOX_CMD_HELP_OPT("-c", "interrupt on Ctrl-C")
|
BAREBOX_CMD_HELP_OPT("-c", "interrupt on Ctrl-C")
|
||||||
BAREBOX_CMD_HELP_OPT("-r", "interrupt on RETURN")
|
BAREBOX_CMD_HELP_OPT("-r", "interrupt on RETURN")
|
||||||
|
BAREBOX_CMD_HELP_OPT("-e", "interrupt on external commands (i.e. fastboot")
|
||||||
BAREBOX_CMD_HELP_OPT("-s", "silent mode")
|
BAREBOX_CMD_HELP_OPT("-s", "silent mode")
|
||||||
BAREBOX_CMD_HELP_OPT("-v <VARIABLE>", "export pressed key to environment")
|
BAREBOX_CMD_HELP_OPT("-v <VARIABLE>", "export pressed key to environment")
|
||||||
BAREBOX_CMD_HELP_END
|
BAREBOX_CMD_HELP_END
|
||||||
|
@ -80,7 +84,7 @@ BAREBOX_CMD_HELP_END
|
||||||
BAREBOX_CMD_START(timeout)
|
BAREBOX_CMD_START(timeout)
|
||||||
.cmd = do_timeout,
|
.cmd = do_timeout,
|
||||||
BAREBOX_CMD_DESC("wait for a specified timeout")
|
BAREBOX_CMD_DESC("wait for a specified timeout")
|
||||||
BAREBOX_CMD_OPTS("[-acrsv] SECONDS")
|
BAREBOX_CMD_OPTS("[-acrsev] SECONDS")
|
||||||
BAREBOX_CMD_GROUP(CMD_GRP_CONSOLE)
|
BAREBOX_CMD_GROUP(CMD_GRP_CONSOLE)
|
||||||
BAREBOX_CMD_HELP(cmd_timeout_help)
|
BAREBOX_CMD_HELP(cmd_timeout_help)
|
||||||
BAREBOX_CMD_END
|
BAREBOX_CMD_END
|
||||||
|
|
|
@ -109,6 +109,15 @@ static struct bbu_handler *bbu_find_handler_by_device(const char *devicepath)
|
||||||
if (!devicepath)
|
if (!devicepath)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
list_for_each_entry(handler, &bbu_image_handlers, list)
|
||||||
|
if (!strcmp(handler->devicefile, devicepath))
|
||||||
|
return handler;
|
||||||
|
|
||||||
|
if (strncmp(devicepath, "/dev/", 5))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
devicepath += 5;
|
||||||
|
|
||||||
list_for_each_entry(handler, &bbu_image_handlers, list)
|
list_for_each_entry(handler, &bbu_image_handlers, list)
|
||||||
if (!strcmp(handler->devicefile, devicepath))
|
if (!strcmp(handler->devicefile, devicepath))
|
||||||
return handler;
|
return handler;
|
||||||
|
|
|
@ -23,6 +23,13 @@
|
||||||
#include <console_countdown.h>
|
#include <console_countdown.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
static bool console_countdown_timeout_abort;
|
||||||
|
|
||||||
|
void console_countdown_abort(void)
|
||||||
|
{
|
||||||
|
console_countdown_timeout_abort = true;
|
||||||
|
}
|
||||||
|
|
||||||
int console_countdown(int timeout_s, unsigned flags, char *out_key)
|
int console_countdown(int timeout_s, unsigned flags, char *out_key)
|
||||||
{
|
{
|
||||||
uint64_t start, second;
|
uint64_t start, second;
|
||||||
|
@ -35,7 +42,7 @@ int console_countdown(int timeout_s, unsigned flags, char *out_key)
|
||||||
countdown = timeout_s;
|
countdown = timeout_s;
|
||||||
|
|
||||||
if (!(flags & CONSOLE_COUNTDOWN_SILENT))
|
if (!(flags & CONSOLE_COUNTDOWN_SILENT))
|
||||||
printf("%2d", countdown--);
|
printf("%4d", countdown--);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (tstc()) {
|
if (tstc()) {
|
||||||
|
@ -48,13 +55,20 @@ int console_countdown(int timeout_s, unsigned flags, char *out_key)
|
||||||
goto out;
|
goto out;
|
||||||
key = 0;
|
key = 0;
|
||||||
}
|
}
|
||||||
|
if ((flags & CONSOLE_COUNTDOWN_EXTERN) &&
|
||||||
|
console_countdown_timeout_abort)
|
||||||
|
goto out;
|
||||||
if (!(flags & CONSOLE_COUNTDOWN_SILENT) &&
|
if (!(flags & CONSOLE_COUNTDOWN_SILENT) &&
|
||||||
is_timeout(second, SECOND)) {
|
is_timeout(second, SECOND)) {
|
||||||
printf("\b\b%2d", countdown--);
|
printf("\b\b\b\b%4d", countdown--);
|
||||||
second += SECOND;
|
second += SECOND;
|
||||||
}
|
}
|
||||||
} while (!is_timeout(start, timeout_s * SECOND));
|
} while (!is_timeout(start, timeout_s * SECOND));
|
||||||
|
|
||||||
|
if ((flags & CONSOLE_COUNTDOWN_EXTERN) &&
|
||||||
|
console_countdown_timeout_abort)
|
||||||
|
goto out;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -62,6 +76,7 @@ int console_countdown(int timeout_s, unsigned flags, char *out_key)
|
||||||
printf("\n");
|
printf("\n");
|
||||||
if (key && out_key)
|
if (key && out_key)
|
||||||
*out_key = key;
|
*out_key = key;
|
||||||
|
console_countdown_timeout_abort = false;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <environment.h>
|
#include <environment.h>
|
||||||
#include <globalvar.h>
|
#include <globalvar.h>
|
||||||
#include <restart.h>
|
#include <restart.h>
|
||||||
|
#include <console_countdown.h>
|
||||||
#include <usb/ch9.h>
|
#include <usb/ch9.h>
|
||||||
#include <usb/gadget.h>
|
#include <usb/gadget.h>
|
||||||
#include <usb/fastboot.h>
|
#include <usb/fastboot.h>
|
||||||
|
@ -597,6 +598,7 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)
|
||||||
if (f_fb->download_bytes >= f_fb->download_size) {
|
if (f_fb->download_bytes >= f_fb->download_size) {
|
||||||
req->complete = rx_handler_command;
|
req->complete = rx_handler_command;
|
||||||
req->length = EP_BUFFER_SIZE;
|
req->length = EP_BUFFER_SIZE;
|
||||||
|
close(f_fb->download_fd);
|
||||||
|
|
||||||
fastboot_tx_print(f_fb, "INFODownloading %d bytes finished",
|
fastboot_tx_print(f_fb, "INFODownloading %d bytes finished",
|
||||||
f_fb->download_bytes);
|
f_fb->download_bytes);
|
||||||
|
@ -814,6 +816,8 @@ static void fb_run_command(struct usb_ep *ep, struct usb_request *req, const cha
|
||||||
struct f_fastboot *f_fb = req->context;
|
struct f_fastboot *f_fb = req->context;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
console_countdown_abort();
|
||||||
|
|
||||||
for (i = 0; i < num_commands; i++) {
|
for (i = 0; i < num_commands; i++) {
|
||||||
if (!strcmp_l1(cmds[i].cmd, cmd)) {
|
if (!strcmp_l1(cmds[i].cmd, cmd)) {
|
||||||
func_cb = cmds[i].cb;
|
func_cb = cmds[i].cb;
|
||||||
|
|
14
fs/fs.c
14
fs/fs.c
|
@ -910,6 +910,8 @@ loff_t lseek(int fildes, loff_t offset, int whence)
|
||||||
case SEEK_SET:
|
case SEEK_SET:
|
||||||
if (f->size != FILE_SIZE_STREAM && offset > f->size)
|
if (f->size != FILE_SIZE_STREAM && offset > f->size)
|
||||||
goto out;
|
goto out;
|
||||||
|
if (offset < 0)
|
||||||
|
goto out;
|
||||||
pos = offset;
|
pos = offset;
|
||||||
break;
|
break;
|
||||||
case SEEK_CUR:
|
case SEEK_CUR:
|
||||||
|
@ -918,15 +920,21 @@ loff_t lseek(int fildes, loff_t offset, int whence)
|
||||||
pos = f->pos + offset;
|
pos = f->pos + offset;
|
||||||
break;
|
break;
|
||||||
case SEEK_END:
|
case SEEK_END:
|
||||||
if (offset)
|
if (offset > 0)
|
||||||
goto out;
|
goto out;
|
||||||
pos = f->size;
|
pos = f->size + offset;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fsdrv->lseek(&f->fsdev->dev, f, pos);
|
pos = fsdrv->lseek(&f->fsdev->dev, f, pos);
|
||||||
|
if (pos < 0) {
|
||||||
|
errno = -pos;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
37
fs/tftp.c
37
fs/tftp.c
|
@ -568,13 +568,11 @@ static int tftp_read(struct device_d *dev, FILE *f, void *buf, size_t insize)
|
||||||
|
|
||||||
while (insize) {
|
while (insize) {
|
||||||
now = kfifo_get(priv->fifo, buf, insize);
|
now = kfifo_get(priv->fifo, buf, insize);
|
||||||
|
outsize += now;
|
||||||
|
buf += now;
|
||||||
|
insize -= now;
|
||||||
if (priv->state == STATE_DONE)
|
if (priv->state == STATE_DONE)
|
||||||
return outsize + now;
|
return outsize;
|
||||||
if (now) {
|
|
||||||
outsize += now;
|
|
||||||
buf += now;
|
|
||||||
insize -= now;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TFTP_FIFO_SIZE - kfifo_len(priv->fifo) >= priv->blocksize)
|
if (TFTP_FIFO_SIZE - kfifo_len(priv->fifo) >= priv->blocksize)
|
||||||
tftp_send(priv);
|
tftp_send(priv);
|
||||||
|
@ -591,7 +589,32 @@ static int tftp_read(struct device_d *dev, FILE *f, void *buf, size_t insize)
|
||||||
|
|
||||||
static loff_t tftp_lseek(struct device_d *dev, FILE *f, loff_t pos)
|
static loff_t tftp_lseek(struct device_d *dev, FILE *f, loff_t pos)
|
||||||
{
|
{
|
||||||
/* not implemented in tftp protocol */
|
/* We cannot seek backwards without reloading or caching the file */
|
||||||
|
if (pos >= f->pos) {
|
||||||
|
loff_t ret;
|
||||||
|
char *buf = xmalloc(1024);
|
||||||
|
|
||||||
|
while (pos > f->pos) {
|
||||||
|
size_t len = min_t(size_t, 1024, pos - f->pos);
|
||||||
|
|
||||||
|
ret = tftp_read(dev, f, buf, len);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
/* EOF, so the desired pos is invalid. */
|
||||||
|
ret = -EINVAL;
|
||||||
|
if (ret < 0)
|
||||||
|
goto out_free;
|
||||||
|
|
||||||
|
f->pos += ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = pos;
|
||||||
|
|
||||||
|
out_free:
|
||||||
|
free(buf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,9 @@
|
||||||
#define CONSOLE_COUNTDOWN_ANYKEY (1 << 1)
|
#define CONSOLE_COUNTDOWN_ANYKEY (1 << 1)
|
||||||
#define CONSOLE_COUNTDOWN_RETURN (1 << 3)
|
#define CONSOLE_COUNTDOWN_RETURN (1 << 3)
|
||||||
#define CONSOLE_COUNTDOWN_CTRLC (1 << 4)
|
#define CONSOLE_COUNTDOWN_CTRLC (1 << 4)
|
||||||
|
#define CONSOLE_COUNTDOWN_EXTERN (1 << 5)
|
||||||
|
|
||||||
int console_countdown(int timeout_s, unsigned flags, char *out_key);
|
int console_countdown(int timeout_s, unsigned flags, char *out_key);
|
||||||
|
void console_countdown_abort(void);
|
||||||
|
|
||||||
#endif /* __CONSOLE_COUNTDOWN_H */
|
#endif /* __CONSOLE_COUNTDOWN_H */
|
||||||
|
|
24
lib/Kconfig
24
lib/Kconfig
|
@ -21,6 +21,30 @@ config LZ4_DECOMPRESS
|
||||||
config XZ_DECOMPRESS
|
config XZ_DECOMPRESS
|
||||||
bool "include xz uncompression support"
|
bool "include xz uncompression support"
|
||||||
select UNCOMPRESS
|
select UNCOMPRESS
|
||||||
|
select XZ_DEC_X86
|
||||||
|
select XZ_DEC_POWERPC
|
||||||
|
select XZ_DEC_IA64
|
||||||
|
select XZ_DEC_ARM
|
||||||
|
select XZ_DEC_ARMTHUMB
|
||||||
|
select XZ_DEC_SPARC
|
||||||
|
|
||||||
|
config XZ_DEC_X86
|
||||||
|
bool
|
||||||
|
|
||||||
|
config XZ_DEC_POWERPC
|
||||||
|
bool
|
||||||
|
|
||||||
|
config XZ_DEC_IA64
|
||||||
|
bool
|
||||||
|
|
||||||
|
config XZ_DEC_ARM
|
||||||
|
bool
|
||||||
|
|
||||||
|
config XZ_DEC_ARMTHUMB
|
||||||
|
bool
|
||||||
|
|
||||||
|
config XZ_DEC_SPARC
|
||||||
|
bool
|
||||||
|
|
||||||
config REED_SOLOMON
|
config REED_SOLOMON
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -692,7 +692,7 @@ struct param_d *dev_add_param_int_ro(struct device_d *dev, const char *name,
|
||||||
|
|
||||||
piro = xzalloc(sizeof(*piro));
|
piro = xzalloc(sizeof(*piro));
|
||||||
|
|
||||||
ret = __dev_add_param(&piro->param, dev, name, NULL, NULL, 0);
|
ret = __dev_add_param(&piro->param, dev, name, NULL, NULL, PARAM_FLAG_RO);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
free(piro);
|
free(piro);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
@ -718,7 +718,7 @@ struct param_d *dev_add_param_llint_ro(struct device_d *dev, const char *name,
|
||||||
|
|
||||||
piro = xzalloc(sizeof(*piro));
|
piro = xzalloc(sizeof(*piro));
|
||||||
|
|
||||||
ret = __dev_add_param(&piro->param, dev, name, NULL, NULL, 0);
|
ret = __dev_add_param(&piro->param, dev, name, NULL, NULL, PARAM_FLAG_RO);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
free(piro);
|
free(piro);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
Loading…
Reference in New Issue