@ -63,6 +63,7 @@
# define test_bit(yalv, abs_b) ((((char *)abs_b)[yalv / 8] & (1<<yalv%8)) > 0)
# define test_bit(yalv, abs_b) ((((char *)abs_b)[yalv / 8] & (1<<yalv%8)) > 0)
# define array_size(val) (val ? sizeof(val) / sizeof(val[0]) : 0)
# define array_size(val) (val ? sizeof(val) / sizeof(val[0]) : 0)
# define array_size_const(val) ((int)(sizeof(val) / sizeof(val[0])))
# define array_size_const(val) ((int)(sizeof(val) / sizeof(val[0])))
# define wrap_err(s) "[%s] " s, __func__
# define EVENT_SIZE (sizeof(struct inotify_event))
# define EVENT_SIZE (sizeof(struct inotify_event))
# define EVENT_BUF_LEN (1024*(EVENT_SIZE+16))
# define EVENT_BUF_LEN (1024*(EVENT_SIZE+16))
@ -156,7 +157,7 @@ int main (int argc, char *argv[])
case ' c ' :
case ' c ' :
ext_config_file = malloc ( strlen ( optarg ) + 1 ) ;
ext_config_file = malloc ( strlen ( optarg ) + 1 ) ;
if ( ! ext_config_file )
if ( ! ext_config_file )
die ( " malloc in main() : " ) ;
die ( wrap_err ( " Bad malloc:" ) ) ;
strcpy ( ext_config_file , optarg ) ;
strcpy ( ext_config_file , optarg ) ;
break ;
break ;
case ' d ' :
case ' d ' :
@ -183,7 +184,7 @@ int main (int argc, char *argv[])
/* Check if hkd is already running */
/* Check if hkd is already running */
lock_file_descriptor = open ( LOCK_FILE , O_RDWR | O_CREAT , 0600 ) ;
lock_file_descriptor = open ( LOCK_FILE , O_RDWR | O_CREAT , 0600 ) ;
if ( lock_file_descriptor < 0 )
if ( lock_file_descriptor < 0 )
die ( " Can't open lock file: " ) ;
die ( wrap_err ( " Can't open lock file: " ) ) ;
fl . l_start = 0 ;
fl . l_start = 0 ;
fl . l_len = 0 ;
fl . l_len = 0 ;
fl . l_type = F_WRLCK ;
fl . l_type = F_WRLCK ;
@ -211,10 +212,9 @@ int main (int argc, char *argv[])
/* Prepare directory update watcher */
/* Prepare directory update watcher */
if ( event_watcher < 0 )
if ( event_watcher < 0 )
die ( " Could not call inotify_init: " ) ;
die ( wrap_err ( " Could not call inotify_init: " ) ) ;
if ( inotify_add_watch ( event_watcher , EVDEV_ROOT_DIR , IN_CREATE | IN_DELETE ) < 0 )
if ( inotify_add_watch ( event_watcher , EVDEV_ROOT_DIR , IN_CREATE | IN_DELETE ) < 0 )
die ( " Could not add /dev/input to the watch list: " ) ;
die ( wrap_err ( " Could not add /dev/input to the watch list: " ) ) ;
/* Prepare epoll list */
/* Prepare epoll list */
ev_fd = prepare_epoll ( fds , fd_num , event_watcher ) ;
ev_fd = prepare_epoll ( fds , fd_num , event_watcher ) ;
@ -240,7 +240,7 @@ int main (int argc, char *argv[])
sleep ( 1 ) ; // wait for devices to settle
sleep ( 1 ) ; // wait for devices to settle
update_descriptors_list ( & fds , & fd_num ) ;
update_descriptors_list ( & fds , & fd_num ) ;
if ( close ( ev_fd ) < 0 )
if ( close ( ev_fd ) < 0 )
die ( " Could not close event file descriptors list (ev_fd): " ) ;
die ( wrap_err ( " Could not close event fd list (ev_fd): " ) ) ;
ev_fd = prepare_epoll ( fds , fd_num , event_watcher ) ;
ev_fd = prepare_epoll ( fds , fd_num , event_watcher ) ;
goto mainloop_begin ;
goto mainloop_begin ;
}
}
@ -304,7 +304,7 @@ int main (int argc, char *argv[])
close ( event_watcher ) ;
close ( event_watcher ) ;
for ( int i = 0 ; i < fd_num ; i + + )
for ( int i = 0 ; i < fd_num ; i + + )
if ( close ( fds [ i ] ) = = - 1 )
if ( close ( fds [ i ] ) = = - 1 )
die ( " Error closing file descriptors: " ) ;
die ( wrap_err ( " Error closing file descriptors: " ) ) ;
return 0 ;
return 0 ;
}
}
@ -352,7 +352,7 @@ void int_handler (int signum)
switch ( signum ) {
switch ( signum ) {
case SIGINT :
case SIGINT :
if ( dead )
if ( dead )
die ( " An error occured, exiting " ) ;
die ( wrap_err ( " An error occured, exiting " ) ) ;
if ( vflag )
if ( vflag )
printf ( yellow ( " Received interrupt signal, exiting gracefully... \n " ) ) ;
printf ( yellow ( " Received interrupt signal, exiting gracefully... \n " ) ) ;
dead = 1 ;
dead = 1 ;
@ -382,20 +382,20 @@ void exec_command (char *command)
return ;
return ;
default :
default :
/* Some other error */
/* Some other error */
fprintf ( stderr , " Could not parse, %s is not valid \n " , command ) ;
fprintf ( stderr , wrap_err ( " Could not parse, %s is not valid \n " ) , command ) ;
return ;
return ;
}
}
pid_t cpid ;
pid_t cpid ;
switch ( cpid = fork ( ) ) {
switch ( cpid = fork ( ) ) {
case - 1 :
case - 1 :
fprintf ( stderr , " Could not create child process: %s " , strerror ( errno ) ) ;
fprintf ( stderr , wrap_err ( " Could not create child process: %s " ) , strerror ( errno ) ) ;
wordfree ( & result ) ;
wordfree ( & result ) ;
break ;
break ;
case 0 :
case 0 :
/* This is the child process, execute the command */
/* This is the child process, execute the command */
execvp ( result . we_wordv [ 0 ] , result . we_wordv ) ;
execvp ( result . we_wordv [ 0 ] , result . we_wordv ) ;
die ( " %s: " , command ) ;
die ( wrap_err ( " %s: " ) , command ) ;
break ;
break ;
default :
default :
while ( waitpid ( cpid , NULL , WNOHANG ) = = - 1 ) { }
while ( waitpid ( cpid , NULL , WNOHANG ) = = - 1 ) { }
@ -414,7 +414,7 @@ void update_descriptors_list (int **fds, int *fd_num)
/* Open the event directory */
/* Open the event directory */
DIR * ev_dir = opendir ( EVDEV_ROOT_DIR ) ;
DIR * ev_dir = opendir ( EVDEV_ROOT_DIR ) ;
if ( ! ev_dir )
if ( ! ev_dir )
die ( " Could not open /dev/input: " ) ;
die ( wrap_err ( " Could not open /dev/input: " ) ) ;
( * fd_num ) = 0 ;
( * fd_num ) = 0 ;
@ -441,7 +441,7 @@ void update_descriptors_list (int **fds, int *fd_num)
memset ( evtype_b , 0 , sizeof ( evtype_b ) ) ;
memset ( evtype_b , 0 , sizeof ( evtype_b ) ) ;
if ( ioctl ( tmp_fd , EVIOCGBIT ( 0 , EV_MAX ) , evtype_b ) < 0 ) {
if ( ioctl ( tmp_fd , EVIOCGBIT ( 0 , EV_MAX ) , evtype_b ) < 0 ) {
if ( vflag )
if ( vflag )
printf ( red ( " Could not read capabilities of device %s \n " ) , ev_path ) ;
printf ( red ( " Could not read capabilities of device %s \n " ) , ev_path ) ;
close ( tmp_fd ) ;
close ( tmp_fd ) ;
continue ;
continue ;
}
}
@ -455,7 +455,7 @@ void update_descriptors_list (int **fds, int *fd_num)
tmp_p = realloc ( ( * fds ) , sizeof ( int ) * ( ( * fd_num ) + 1 ) ) ;
tmp_p = realloc ( ( * fds ) , sizeof ( int ) * ( ( * fd_num ) + 1 ) ) ;
if ( ! tmp_p )
if ( ! tmp_p )
die ( " r ealloc file descriptors:" ) ;
die ( wrap_err ( " R ealloc file descriptors:" ) ) ;
( * fds ) = ( int * ) tmp_p ;
( * fds ) = ( int * ) tmp_p ;
( * fds ) [ ( * fd_num ) ] = tmp_fd ;
( * fds ) [ ( * fd_num ) ] = tmp_fd ;
@ -466,7 +466,7 @@ void update_descriptors_list (int **fds, int *fd_num)
if ( vflag )
if ( vflag )
printf ( green ( " Monitoring %d devices \n " ) , * fd_num ) ;
printf ( green ( " Monitoring %d devices \n " ) , * fd_num ) ;
} else {
} else {
die ( " Could not open any devices, exiting " ) ;
die ( wrap_err ( " Could not open any devices, exiting " ) ) ;
}
}
}
}
@ -476,12 +476,12 @@ int prepare_epoll (int *fds, int fd_num, int event_watcher)
static struct epoll_event epoll_read_ev ;
static struct epoll_event epoll_read_ev ;
epoll_read_ev . events = EPOLLIN ;
epoll_read_ev . events = EPOLLIN ;
if ( ev_fd < 0 )
if ( ev_fd < 0 )
die ( " epoll_create failed in prepare_epoll : " ) ;
die ( wrap_err ( " epoll_create failed: " ) ) ;
if ( epoll_ctl ( ev_fd , EPOLL_CTL_ADD , event_watcher , & epoll_read_ev ) < 0 )
if ( epoll_ctl ( ev_fd , EPOLL_CTL_ADD , event_watcher , & epoll_read_ev ) < 0 )
die ( " Could not add file descriptor to the epoll list: " ) ;
die ( wrap_err ( " Could not add file descriptor to the epoll list: " ) ) ;
for ( int i = 0 ; i < fd_num ; i + + )
for ( int i = 0 ; i < fd_num ; i + + )
if ( epoll_ctl ( ev_fd , EPOLL_CTL_ADD , fds [ i ] , & epoll_read_ev ) < 0 )
if ( epoll_ctl ( ev_fd , EPOLL_CTL_ADD , fds [ i ] , & epoll_read_ev ) < 0 )
die ( " Could not add file descriptor to the epoll list: " ) ;
die ( wrap_err ( " Could not add file descriptor to the epoll list: " ) ) ;
return ev_fd ;
return ev_fd ;
}
}
@ -532,9 +532,9 @@ void hotkey_list_add (struct hotkey_list_e *head, union hotkey_main_data *dt, ch
if ( ! ( size = strlen ( cmd ) ) )
if ( ! ( size = strlen ( cmd ) ) )
return ;
return ;
if ( ! ( tmp = malloc ( sizeof ( struct hotkey_list_e ) ) ) )
if ( ! ( tmp = malloc ( sizeof ( struct hotkey_list_e ) ) ) )
die ( " Memory allocation failed in hotkey_list_add(): " ) ;
die ( wrap_err ( " Bad malloc: " ) ) ;
if ( ! ( tmp - > command = malloc ( size + 1 ) ) )
if ( ! ( tmp - > command = malloc ( size + 1 ) ) )
die ( " Memory allocation failed in hotkey_list_add(): " ) ;
die ( wrap_err ( " Bad malloc: " ) ) ;
strcpy ( tmp - > command , cmd ) ;
strcpy ( tmp - > command , cmd ) ;
tmp - > data = * dt ;
tmp - > data = * dt ;
tmp - > fuzzy = f ;
tmp - > fuzzy = f ;
@ -594,15 +594,15 @@ void parse_config_file (void)
/* If the error was WRDE_NOSPACE,
/* If the error was WRDE_NOSPACE,
* then perhaps part of the result was allocated */
* then perhaps part of the result was allocated */
wordfree ( & result ) ;
wordfree ( & result ) ;
die ( " Not enough space: " ) ;
die ( wrap_err ( " Not enough space: " ) ) ;
default :
default :
die ( " Path not valid: " ) ;
die ( wrap_err ( " Path not valid: " ) ) ;
}
}
config_file = open ( result . we_wordv [ 0 ] , O_RDONLY | O_NONBLOCK ) ;
config_file = open ( result . we_wordv [ 0 ] , O_RDONLY | O_NONBLOCK ) ;
wordfree ( & result ) ;
wordfree ( & result ) ;
if ( config_file < 0 )
if ( config_file < 0 )
die ( " Error opening config file: " ) ;
die ( wrap_err ( " Error opening config file: " ) ) ;
free ( ext_config_file ) ;
free ( ext_config_file ) ;
ext_config_file = NULL ;
ext_config_file = NULL ;
} else {
} else {
@ -614,9 +614,9 @@ void parse_config_file (void)
/* If the error was WRDE_NOSPACE,
/* If the error was WRDE_NOSPACE,
* then perhaps part of the result was allocated */
* then perhaps part of the result was allocated */
wordfree ( & result ) ;
wordfree ( & result ) ;
die ( " Not enough space: " ) ;
die ( wrap_err ( " Not enough space: " ) ) ;
default :
default :
die ( " Path not valid: " ) ;
die ( wrap_err ( " Path not valid: " ) ) ;
}
}
config_file = open ( result . we_wordv [ 0 ] , O_RDONLY | O_NONBLOCK ) ;
config_file = open ( result . we_wordv [ 0 ] , O_RDONLY | O_NONBLOCK ) ;
@ -627,7 +627,7 @@ void parse_config_file (void)
printf ( yellow ( " config file not found at %s \n " ) , config_paths [ i ] ) ;
printf ( yellow ( " config file not found at %s \n " ) , config_paths [ i ] ) ;
}
}
if ( ! config_file )
if ( ! config_file )
die ( " Could not open any config files, check the log for more details " ) ;
die ( wrap_err ( " Could not open any config files, check stderr for more details " ) ) ;
}
}
/* Using mmap because of simplicity, most config files are smaller than
/* Using mmap because of simplicity, most config files are smaller than
@ -644,12 +644,10 @@ void parse_config_file (void)
// FIXME: page align size
// FIXME: page align size
buffer = mmap ( NULL , file_size , PROT_READ , MAP_PRIVATE , config_file , 0 ) ;
buffer = mmap ( NULL , file_size , PROT_READ , MAP_PRIVATE , config_file , 0 ) ;
if ( buffer = = MAP_FAILED )
if ( buffer = = MAP_FAILED )
die ( " mmap failed " ) ;
die ( wrap_err ( " mmap failed: " ) ) ;
close ( config_file ) ;
close ( config_file ) ;
bb = buffer ;
bb = buffer ;
// write(STDOUT_FILENO, bb, file_size);
hotkey_list_destroy ( hotkey_list ) ;
hotkey_list_destroy ( hotkey_list ) ;
hotkey_list = NULL ;
hotkey_list = NULL ;
while ( ! eof ) {
while ( ! eof ) {
@ -694,8 +692,8 @@ void parse_config_file (void)
type = ALIAS ;
type = ALIAS ;
break ;
break ;
default :
default :
die ( " Error at line %d: "
die ( wrap_err ( " Error at line %d: "
" hotkey definition must start with '-', '*' or '@' " ,
" hotkey definition must start with '-', '*' or '@' " ) ,
linenum ) ;
linenum ) ;
break ;
break ;
}
}
@ -706,12 +704,12 @@ void parse_config_file (void)
case GET_KEYS :
case GET_KEYS :
for ( token_size = 0 ; token_size < ( file_size - ( bb - buffer ) ) & & ! ( bb [ token_size ] = = ' : ' | | bb [ token_size ] = = ' \n ' ) ; token_size + + ) ;
for ( token_size = 0 ; token_size < ( file_size - ( bb - buffer ) ) & & ! ( bb [ token_size ] = = ' : ' | | bb [ token_size ] = = ' \n ' ) ; token_size + + ) ;
if ( bb [ token_size ] = = ' \n ' )
if ( bb [ token_size ] = = ' \n ' )
die ( " Error at line %d: "
die ( wrap_err ( " Error at line %d: "
" no command specified, missing ':' after keys " ,
" no command specified, missing ':' after keys " ) ,
linenum ) ;
linenum ) ;
keys = malloc ( token_size + 1 ) ;
keys = malloc ( token_size + 1 ) ;
if ( ! keys )
if ( ! keys )
die ( " malloc failed in keys " ) ;
die ( wrap_err ( " Bad malloc parsing keys: " ) ) ;
memcpy ( keys , bb , token_size ) ;
memcpy ( keys , bb , token_size ) ;
keys [ token_size ] = ' \0 ' ;
keys [ token_size ] = ' \0 ' ;
bb + = token_size + 1 ;
bb + = token_size + 1 ;
@ -727,7 +725,7 @@ void parse_config_file (void)
}
}
cmd = malloc ( token_size + 1 ) ;
cmd = malloc ( token_size + 1 ) ;
if ( ! cmd )
if ( ! cmd )
die ( " malloc failed in cmd " ) ;
die ( wrap_err ( " Bad malloc parsing command: " ) ) ;
memcpy ( cmd , bb , token_size ) ;
memcpy ( cmd , bb , token_size ) ;
cmd [ token_size ] = ' \0 ' ;
cmd [ token_size ] = ' \0 ' ;
bb + = token_size ;
bb + = token_size ;
@ -735,7 +733,7 @@ void parse_config_file (void)
break ;
break ;
case LAST :
case LAST :
if ( ! keys )
if ( ! keys )
die ( " error " ) ;
die ( wrap_err ( " Keys is NULL " ) ) ;
i_tmp = strlen ( keys ) ;
i_tmp = strlen ( keys ) ;
for ( int i = 0 ; i < i_tmp ; i + + ) {
for ( int i = 0 ; i < i_tmp ; i + + ) {
if ( isblank ( keys [ i ] ) ) {
if ( isblank ( keys [ i ] ) ) {
@ -745,22 +743,22 @@ void parse_config_file (void)
}
}
cp_tmp = strtok ( keys , " , " ) ;
cp_tmp = strtok ( keys , " , " ) ;
if ( ! cp_tmp )
if ( ! cp_tmp )
die ( " Error at line %d: "
die ( wrap_err ( " Error at line %d: "
" keys not present " , linenum - 1 ) ;
" keys not present " ) , linenum - 1 ) ;
if ( type ! = ALIAS ) {
if ( type ! = ALIAS ) {
do {
do {
if ( ! ( us_tmp = key_to_code ( cp_tmp ) ) ) {
if ( ! ( us_tmp = key_to_code ( cp_tmp ) ) ) {
die ( " Error at line %d: "
die ( wrap_err ( " Error at line %d: "
" %s is not a valid key " ,
" %s is not a valid key " ) ,
linenum - 1 , cp_tmp ) ;
linenum - 1 , cp_tmp ) ;
}
}
if ( key_buffer_add ( & dt . kb , us_tmp ) )
if ( key_buffer_add ( & dt . kb , us_tmp ) )
die ( " Too many keys " ) ;
die ( wrap_err ( " Too many keys " ) ) ;
} while ( ( cp_tmp = strtok ( NULL , " , " ) ) ) ;
} while ( ( cp_tmp = strtok ( NULL , " , " ) ) ) ;
} else {
} else {
if ( ! ( dt . name = malloc ( strlen ( cp_tmp ) + 1 ) ) )
if ( ! ( dt . name = malloc ( strlen ( cp_tmp ) + 1 ) ) )
die ( " malloc in parse_config_file() : " ) ;
die ( wrap_err ( " Bad malloc:" ) ) ;
strcpy ( dt . name , cp_tmp ) ;
strcpy ( dt . name , cp_tmp ) ;
}
}
@ -775,8 +773,8 @@ void parse_config_file (void)
while ( isblank ( * cp_tmp ) )
while ( isblank ( * cp_tmp ) )
cp_tmp + + ;
cp_tmp + + ;
if ( * cp_tmp = = ' \0 ' )
if ( * cp_tmp = = ' \0 ' )
die ( " Error at line %d: "
die ( wrap_err ( " Error at line %d: "
" command not present " , linenum - 1 ) ;
" command not present " ) , linenum - 1 ) ;
hotkey_list_add ( hotkey_list , & dt , cp_tmp , type ) ;
hotkey_list_add ( hotkey_list , & dt , cp_tmp , type ) ;
@ -790,7 +788,7 @@ void parse_config_file (void)
parse_state = NORM ;
parse_state = NORM ;
break ;
break ;
default :
default :
die ( " Unknown state in parse_config_file " ) ;
die ( wrap_err ( " Unknown state " ) ) ;
break ;
break ;
}
}
@ -879,7 +877,7 @@ void replace (char **s, const char *m, const char *r)
if ( ( t1 [ ms ] = = ' \0 ' | | isblank ( t1 [ ms ] ) )
if ( ( t1 [ ms ] = = ' \0 ' | | isblank ( t1 [ ms ] ) )
& & isblank ( t1 > * new_s ? * ( t1 - 1 ) : ' ' ) ) {
& & isblank ( t1 > * new_s ? * ( t1 - 1 ) : ' ' ) ) {
if ( ! ( t2 = realloc ( offs , sizeof ( int ) * ( count + 1 ) ) ) )
if ( ! ( t2 = realloc ( offs , sizeof ( int ) * ( count + 1 ) ) ) )
die ( " bad realloc " ) ;
die ( wrap_err ( " Bad realloc: " ) ) ;
offs = t2 ;
offs = t2 ;
offs [ count ] = ( t1 - * new_s ) + ( rs - ms ) * count ;
offs [ count ] = ( t1 - * new_s ) + ( rs - ms ) * count ;
count + + ;
count + + ;
@ -889,7 +887,7 @@ void replace (char **s, const char *m, const char *r)
if ( ( rs - ms ) > 0 ) {
if ( ( rs - ms ) > 0 ) {
if ( ! ( t1 = realloc ( * new_s , nss + ( rs - ms ) * count ) ) )
if ( ! ( t1 = realloc ( * new_s , nss + ( rs - ms ) * count ) ) )
die ( " bad realloc " ) ;
die ( wrap_err ( " Bad realloc: " ) ) ;
* new_s = t1 ;
* new_s = t1 ;
}
}