rockbox/apps/core_keymap.c
Aidan MacDonald 67cb2e3cdc Add core_get_data_pinned(), use it where possible
Change-Id: I1b2f62f27780f99423085d2fffc972ea2701f998
2023-01-15 08:57:45 -05:00

95 lines
2.7 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2020 by William Wilgus
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "action.h"
#include "core_alloc.h"
#include "core_keymap.h"
/*#define LOGF_ENABLE*/
#include "logf.h"
#if !defined(__PCTOOL__) || defined(CHECKWPS)
int core_set_keyremap(struct button_mapping* core_keymap, int count)
{
return action_set_keymap(core_keymap, count);
}
static int open_key_remap(const char *filename, int *countp)
{
int fd = open(filename, O_RDONLY);
if (fd < 0)
return fd;
size_t fsize = filesize(fd);
int count = fsize / sizeof(struct button_mapping);
if (count == 0 || (size_t)(count * sizeof(struct button_mapping)) != fsize)
{
logf("core_keyremap: bad filesize %d / %lu", count, (unsigned long)fsize);
goto error;
}
struct button_mapping header;
if(read(fd, &header, sizeof(header)) != (ssize_t)sizeof(header))
{
logf("core_keyremap: read error");
goto error;
}
if (header.action_code != KEYREMAP_VERSION ||
header.button_code != KEYREMAP_HEADERID ||
header.pre_button_code != count)
{
logf("core_keyremap: bad header %d", count);
goto error;
}
*countp = count - 1;
return fd;
error:
close(fd);
return -1;
}
int core_load_key_remap(const char *filename)
{
int count = 0; /* gcc falsely believes this may be used uninitialized */
int fd = open_key_remap(filename, &count);
if (fd < 0)
return -1;
size_t bufsize = count * sizeof(struct button_mapping);
int handle = core_alloc(bufsize);
if (handle > 0)
{
void *data = core_get_data_pinned(handle);
if (read(fd, data, bufsize) == (ssize_t)bufsize)
count = action_set_keymap_handle(handle, count);
core_put_data_pinned(data);
}
close(fd);
return count;
}
#endif /* !defined(__PCTOOL__) */