mirror of
https://github.com/jarun/nnn.git
synced 2024-12-01 02:49:44 +00:00
Use bitfields for runtime transient states
This commit is contained in:
parent
32ab43a9ff
commit
4d291d0ac2
114
src/nnn.c
114
src/nnn.c
|
@ -251,9 +251,8 @@ typedef struct {
|
||||||
uint selmode : 1; /* Set when selecting files */
|
uint selmode : 1; /* Set when selecting files */
|
||||||
uint showdetail : 1; /* Clear to show fewer file info */
|
uint showdetail : 1; /* Clear to show fewer file info */
|
||||||
uint ctxactive : 1; /* Context active or not */
|
uint ctxactive : 1; /* Context active or not */
|
||||||
uint reserved1 : 2;
|
uint reserved1 : 3;
|
||||||
/* The following settings are global */
|
/* The following settings are global */
|
||||||
uint dircolor : 1; /* Current status of dir color */
|
|
||||||
uint curctx : 3; /* Current context number */
|
uint curctx : 3; /* Current context number */
|
||||||
uint picker : 1; /* Write selection to user-specified file */
|
uint picker : 1; /* Write selection to user-specified file */
|
||||||
uint pickraw : 1; /* Write selection to sdtout before exit */
|
uint pickraw : 1; /* Write selection to sdtout before exit */
|
||||||
|
@ -271,6 +270,22 @@ typedef struct {
|
||||||
uint rollover : 1; /* Roll over at edges */
|
uint rollover : 1; /* Roll over at edges */
|
||||||
} settings;
|
} settings;
|
||||||
|
|
||||||
|
/* Non-persistent program-internal states */
|
||||||
|
typedef struct {
|
||||||
|
uint pluginit : 1; /* Plugin framework initialized */
|
||||||
|
uint interrupt : 1; /* Program received an interrupt */
|
||||||
|
uint rangesel : 1; /* Range selection on */
|
||||||
|
uint move : 1; /* Move operation */
|
||||||
|
uint autonext : 1; /* Auto-proceed on open */
|
||||||
|
uint fortune : 1; /* Show fortune messages in help */
|
||||||
|
uint trash : 1; /* Use trash to delete files */
|
||||||
|
uint forcequit : 1; /* Do not prompt on quit */
|
||||||
|
uint autofifo : 1; /* Auto-create NNN_FIFO */
|
||||||
|
uint initfile : 1; /* Positional arg is a file */
|
||||||
|
uint dircolor : 1; /* Current status of dir color */
|
||||||
|
uint reserved : 21;
|
||||||
|
} runstate;
|
||||||
|
|
||||||
/* Contexts or workspaces */
|
/* Contexts or workspaces */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char c_path[PATH_MAX]; /* Current dir */
|
char c_path[PATH_MAX]; /* Current dir */
|
||||||
|
@ -305,7 +320,6 @@ static settings cfg = {
|
||||||
1, /* ctxactive */
|
1, /* ctxactive */
|
||||||
0, /* reserved1 */
|
0, /* reserved1 */
|
||||||
0, /* curctx */
|
0, /* curctx */
|
||||||
0, /* dircolor */
|
|
||||||
0, /* picker */
|
0, /* picker */
|
||||||
0, /* pickraw */
|
0, /* pickraw */
|
||||||
0, /* nonavopen */
|
0, /* nonavopen */
|
||||||
|
@ -384,21 +398,8 @@ static char g_tmpfpath[TMP_LEN_MAX] __attribute__ ((aligned));
|
||||||
/* Buffer to store plugins control pipe location */
|
/* Buffer to store plugins control pipe location */
|
||||||
static char g_pipepath[TMP_LEN_MAX] __attribute__ ((aligned));
|
static char g_pipepath[TMP_LEN_MAX] __attribute__ ((aligned));
|
||||||
|
|
||||||
/* MISC NON-PERSISTENT INTERNAL BINARY STATES */
|
/* Non-persistent runtime states */
|
||||||
|
static runstate g_state;
|
||||||
/* Plugin control initialization status */
|
|
||||||
#define STATE_PLUGIN_INIT 0x1
|
|
||||||
#define STATE_INTERRUPTED 0x2
|
|
||||||
#define STATE_RANGESEL 0x4
|
|
||||||
#define STATE_MOVE_OP 0x8
|
|
||||||
#define STATE_AUTONEXT 0x10
|
|
||||||
#define STATE_FORTUNE 0x20
|
|
||||||
#define STATE_TRASH 0x40
|
|
||||||
#define STATE_FORCEQUIT 0x80
|
|
||||||
#define STATE_AUTOFIFO 0x100
|
|
||||||
#define STATE_INITFILE 0x200
|
|
||||||
|
|
||||||
static uint g_states;
|
|
||||||
|
|
||||||
/* Options to identify file mime */
|
/* Options to identify file mime */
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
|
@ -695,7 +696,7 @@ static char *load_input(int fd, const char *path);
|
||||||
|
|
||||||
static void sigint_handler(int UNUSED(sig))
|
static void sigint_handler(int UNUSED(sig))
|
||||||
{
|
{
|
||||||
g_states |= STATE_INTERRUPTED;
|
g_state.interrupt = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clean_exit_sighandler(int UNUSED(sig))
|
static void clean_exit_sighandler(int UNUSED(sig))
|
||||||
|
@ -1772,7 +1773,7 @@ static void opstr(char *buf, char *op)
|
||||||
|
|
||||||
static void rmmulstr(char *buf)
|
static void rmmulstr(char *buf)
|
||||||
{
|
{
|
||||||
if (g_states & STATE_TRASH)
|
if (g_state.trash)
|
||||||
snprintf(buf, CMD_LEN_MAX, "xargs -0 trash-put < %s", selpath);
|
snprintf(buf, CMD_LEN_MAX, "xargs -0 trash-put < %s", selpath);
|
||||||
else
|
else
|
||||||
snprintf(buf, CMD_LEN_MAX, "xargs -0 sh -c 'rm -%cr \"$0\" \"$@\" < /dev/tty' < %s",
|
snprintf(buf, CMD_LEN_MAX, "xargs -0 sh -c 'rm -%cr \"$0\" \"$@\" < /dev/tty' < %s",
|
||||||
|
@ -1781,7 +1782,7 @@ static void rmmulstr(char *buf)
|
||||||
|
|
||||||
static void xrm(char *fpath)
|
static void xrm(char *fpath)
|
||||||
{
|
{
|
||||||
if (g_states & STATE_TRASH)
|
if (g_state.trash)
|
||||||
spawn("trash-put", fpath, NULL, F_NORMAL);
|
spawn("trash-put", fpath, NULL, F_NORMAL);
|
||||||
else {
|
else {
|
||||||
char rm_opts[] = "-ir";
|
char rm_opts[] = "-ir";
|
||||||
|
@ -3077,9 +3078,9 @@ static char *get_kv_val(kv *kvarr, char *buf, int key, uchar max, uchar id)
|
||||||
|
|
||||||
static void resetdircolor(int flags)
|
static void resetdircolor(int flags)
|
||||||
{
|
{
|
||||||
if (cfg.dircolor && !(flags & DIR_OR_LINK_TO_DIR)) {
|
if (g_state.dircolor && !(flags & DIR_OR_LINK_TO_DIR)) {
|
||||||
attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
|
attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
|
||||||
cfg.dircolor = 0;
|
g_state.dircolor = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4169,7 +4170,7 @@ static void show_help(const char *path)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((g_states & STATE_FORTUNE) && getutil("fortune"))
|
if (g_state.fortune && getutil("fortune"))
|
||||||
pipetof("fortune -s", fp);
|
pipetof("fortune -s", fp);
|
||||||
|
|
||||||
start = end = helpstr;
|
start = end = helpstr;
|
||||||
|
@ -4322,9 +4323,9 @@ static bool run_selected_plugin(char **path, const char *file, char *runfile, ch
|
||||||
bool cmd_as_plugin = FALSE;
|
bool cmd_as_plugin = FALSE;
|
||||||
uchar flags = 0;
|
uchar flags = 0;
|
||||||
|
|
||||||
if (!(g_states & STATE_PLUGIN_INIT)) {
|
if (!g_state.pluginit) {
|
||||||
plctrl_init();
|
plctrl_init();
|
||||||
g_states |= STATE_PLUGIN_INIT;
|
g_state.pluginit = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*file == '_') {
|
if (*file == '_') {
|
||||||
|
@ -4553,7 +4554,7 @@ static int dentfill(char *path, struct entry **dents)
|
||||||
|
|
||||||
dir_blocks += dirwalk(buf, &sb);
|
dir_blocks += dirwalk(buf, &sb);
|
||||||
|
|
||||||
if (g_states & STATE_INTERRUPTED)
|
if (g_state.interrupt)
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -4652,7 +4653,7 @@ static int dentfill(char *path, struct entry **dents)
|
||||||
else
|
else
|
||||||
num_files = num_saved;
|
num_files = num_saved;
|
||||||
|
|
||||||
if (g_states & STATE_INTERRUPTED)
|
if (g_state.interrupt)
|
||||||
goto exit;
|
goto exit;
|
||||||
} else {
|
} else {
|
||||||
dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks);
|
dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks);
|
||||||
|
@ -5041,7 +5042,7 @@ static void statusbar(char *path)
|
||||||
|
|
||||||
printw("%d/%d [%s:%s] %cu:%s free:%s files:%lu %lldB %s\n",
|
printw("%d/%d [%s:%s] %cu:%s free:%s files:%lu %lldB %s\n",
|
||||||
cur + 1, ndents, (cfg.selmode ? "s" : ""),
|
cur + 1, ndents, (cfg.selmode ? "s" : ""),
|
||||||
((g_states & STATE_RANGESEL) ? "*" : (nselected ? xitoa(nselected) : "")),
|
(g_state.rangesel ? "*" : (nselected ? xitoa(nselected) : "")),
|
||||||
(cfg.apparentsz ? 'a' : 'd'), buf, coolsize(get_fs_info(path, FREE)),
|
(cfg.apparentsz ? 'a' : 'd'), buf, coolsize(get_fs_info(path, FREE)),
|
||||||
num_files, (ll)pent->blocks << blk_shift, ptr);
|
num_files, (ll)pent->blocks << blk_shift, ptr);
|
||||||
} else { /* light or detail mode */
|
} else { /* light or detail mode */
|
||||||
|
@ -5050,8 +5051,7 @@ static void statusbar(char *path)
|
||||||
getorderstr(sort);
|
getorderstr(sort);
|
||||||
|
|
||||||
printw("%d/%d [%s:%s] %s", cur + 1, ndents, (cfg.selmode ? "s" : ""),
|
printw("%d/%d [%s:%s] %s", cur + 1, ndents, (cfg.selmode ? "s" : ""),
|
||||||
((g_states & STATE_RANGESEL) ? "*" : (nselected ? xitoa(nselected) : "")),
|
(g_state.rangesel ? "*" : (nselected ? xitoa(nselected) : "")), sort);
|
||||||
sort);
|
|
||||||
|
|
||||||
/* Timestamp */
|
/* Timestamp */
|
||||||
print_time(&pent->t);
|
print_time(&pent->t);
|
||||||
|
@ -5129,8 +5129,8 @@ static void redraw(char *path)
|
||||||
char *ptr = path;
|
char *ptr = path;
|
||||||
|
|
||||||
// Fast redraw
|
// Fast redraw
|
||||||
if (g_states & STATE_MOVE_OP) {
|
if (g_state.move) {
|
||||||
g_states &= ~STATE_MOVE_OP;
|
g_state.move = 0;
|
||||||
|
|
||||||
if (ndents && (last_curscroll == curscroll))
|
if (ndents && (last_curscroll == curscroll))
|
||||||
return draw_line(path, ncols);
|
return draw_line(path, ncols);
|
||||||
|
@ -5205,16 +5205,16 @@ static void redraw(char *path)
|
||||||
ncols = adjust_cols(ncols);
|
ncols = adjust_cols(ncols);
|
||||||
|
|
||||||
attron(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
|
attron(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
|
||||||
cfg.dircolor = 1;
|
g_state.dircolor = 1;
|
||||||
|
|
||||||
/* Print listing */
|
/* Print listing */
|
||||||
for (i = curscroll; i < ndents && i < curscroll + onscreen; ++i)
|
for (i = curscroll; i < ndents && i < curscroll + onscreen; ++i)
|
||||||
printptr(&dents[i], ncols, i == cur);
|
printptr(&dents[i], ncols, i == cur);
|
||||||
|
|
||||||
/* Must reset e.g. no files in dir */
|
/* Must reset e.g. no files in dir */
|
||||||
if (cfg.dircolor) {
|
if (g_state.dircolor) {
|
||||||
attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
|
attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
|
||||||
cfg.dircolor = 0;
|
g_state.dircolor = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
statusbar(path);
|
statusbar(path);
|
||||||
|
@ -5270,7 +5270,7 @@ static bool browse(char *ipath, const char *session, int pkey)
|
||||||
g_ctx[0].c_last[0] = '\0';
|
g_ctx[0].c_last[0] = '\0';
|
||||||
lastdir = g_ctx[0].c_last; /* last visited directory */
|
lastdir = g_ctx[0].c_last; /* last visited directory */
|
||||||
|
|
||||||
if (g_states & STATE_INITFILE) {
|
if (g_state.initfile) {
|
||||||
xstrsncpy(g_ctx[0].c_name, xbasename(ipath), sizeof(g_ctx[0].c_name));
|
xstrsncpy(g_ctx[0].c_name, xbasename(ipath), sizeof(g_ctx[0].c_name));
|
||||||
xdirname(ipath);
|
xdirname(ipath);
|
||||||
} else
|
} else
|
||||||
|
@ -5332,8 +5332,8 @@ begin:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
populate(path, lastname);
|
populate(path, lastname);
|
||||||
if (g_states & STATE_INTERRUPTED) {
|
if (g_state.interrupt) {
|
||||||
g_states &= ~STATE_INTERRUPTED;
|
g_state.interrupt = 0;
|
||||||
cfg.apparentsz = 0;
|
cfg.apparentsz = 0;
|
||||||
cfg.blkorder = 0;
|
cfg.blkorder = 0;
|
||||||
blk_shift = BLK_SHIFT_512;
|
blk_shift = BLK_SHIFT_512;
|
||||||
|
@ -5653,7 +5653,7 @@ nochange:
|
||||||
spawn(opener, newpath, NULL, opener_flags);
|
spawn(opener, newpath, NULL, opener_flags);
|
||||||
|
|
||||||
/* Move cursor to the next entry if not the last entry */
|
/* Move cursor to the next entry if not the last entry */
|
||||||
if ((g_states & STATE_AUTONEXT) && cur != ndents - 1)
|
if (g_state.autonext && cur != ndents - 1)
|
||||||
move_cursor((cur + 1) % ndents, 0);
|
move_cursor((cur + 1) % ndents, 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -5670,7 +5670,7 @@ nochange:
|
||||||
case SEL_HOME: // fallthrough
|
case SEL_HOME: // fallthrough
|
||||||
case SEL_END: // fallthrough
|
case SEL_END: // fallthrough
|
||||||
case SEL_FIRST:
|
case SEL_FIRST:
|
||||||
g_states |= STATE_MOVE_OP;
|
g_state.move = 1;
|
||||||
if (ndents)
|
if (ndents)
|
||||||
handle_screen_move(sel);
|
handle_screen_move(sel);
|
||||||
break;
|
break;
|
||||||
|
@ -5888,7 +5888,7 @@ nochange:
|
||||||
show_help(path); // fallthrough
|
show_help(path); // fallthrough
|
||||||
case SEL_AUTONEXT:
|
case SEL_AUTONEXT:
|
||||||
if (sel == SEL_AUTONEXT)
|
if (sel == SEL_AUTONEXT)
|
||||||
g_states ^= STATE_AUTONEXT;
|
g_state.autonext ^= 1;
|
||||||
if (cfg.filtermode)
|
if (cfg.filtermode)
|
||||||
presel = FILTER;
|
presel = FILTER;
|
||||||
if (ndents)
|
if (ndents)
|
||||||
|
@ -5921,8 +5921,8 @@ nochange:
|
||||||
goto nochange;
|
goto nochange;
|
||||||
|
|
||||||
startselection();
|
startselection();
|
||||||
if (g_states & STATE_RANGESEL)
|
if (g_state.rangesel)
|
||||||
g_states &= ~STATE_RANGESEL;
|
g_state.rangesel = 0;
|
||||||
|
|
||||||
/* Toggle selection status */
|
/* Toggle selection status */
|
||||||
dents[cur].flags ^= FILE_SELECTED;
|
dents[cur].flags ^= FILE_SELECTED;
|
||||||
|
@ -5959,14 +5959,14 @@ nochange:
|
||||||
goto nochange;
|
goto nochange;
|
||||||
|
|
||||||
startselection();
|
startselection();
|
||||||
g_states ^= STATE_RANGESEL;
|
g_state.rangesel ^= 1;
|
||||||
|
|
||||||
if (stat(path, &sb) == -1) {
|
if (stat(path, &sb) == -1) {
|
||||||
printwarn(&presel);
|
printwarn(&presel);
|
||||||
goto nochange;
|
goto nochange;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_states & STATE_RANGESEL) { /* Range selection started */
|
if (g_state.rangesel) { /* Range selection started */
|
||||||
#ifndef DIR_LIMITED_SELECTION
|
#ifndef DIR_LIMITED_SELECTION
|
||||||
inode = sb.st_ino;
|
inode = sb.st_ino;
|
||||||
#endif
|
#endif
|
||||||
|
@ -5998,8 +5998,8 @@ nochange:
|
||||||
goto nochange;
|
goto nochange;
|
||||||
|
|
||||||
startselection();
|
startselection();
|
||||||
if (g_states & STATE_RANGESEL)
|
if (g_state.rangesel)
|
||||||
g_states &= ~STATE_RANGESEL;
|
g_state.rangesel = 0;
|
||||||
|
|
||||||
selstartid = 0;
|
selstartid = 0;
|
||||||
selendid = ndents - 1;
|
selendid = ndents - 1;
|
||||||
|
@ -6462,7 +6462,7 @@ nochange:
|
||||||
setdirwatch();
|
setdirwatch();
|
||||||
goto begin;
|
goto begin;
|
||||||
}
|
}
|
||||||
} else if (!(g_states & STATE_FORCEQUIT)) {
|
} else if (!g_state.forcequit) {
|
||||||
for (r = 0; r < CTX_MAX; ++r)
|
for (r = 0; r < CTX_MAX; ++r)
|
||||||
if (r != cfg.curctx && g_ctx[r].c_cfg.ctxactive) {
|
if (r != cfg.curctx && g_ctx[r].c_cfg.ctxactive) {
|
||||||
r = get_input(messages[MSG_QUIT_ALL]);
|
r = get_input(messages[MSG_QUIT_ALL]);
|
||||||
|
@ -6710,7 +6710,7 @@ malloc_2:
|
||||||
free(paths[i]);
|
free(paths[i]);
|
||||||
malloc_1:
|
malloc_1:
|
||||||
if (msgnum) {
|
if (msgnum) {
|
||||||
if (g_states & STATE_PLUGIN_INIT) {
|
if (g_state.pluginit) {
|
||||||
printmsg(messages[msgnum]);
|
printmsg(messages[msgnum]);
|
||||||
xdelay(XDELAY_INTERVAL_MS);
|
xdelay(XDELAY_INTERVAL_MS);
|
||||||
} else
|
} else
|
||||||
|
@ -6902,7 +6902,7 @@ static void cleanup(void)
|
||||||
free(bookmark);
|
free(bookmark);
|
||||||
free(plug);
|
free(plug);
|
||||||
#ifndef NOFIFO
|
#ifndef NOFIFO
|
||||||
if (g_states & STATE_AUTOFIFO)
|
if (g_state.autofifo)
|
||||||
unlink(fifopath);
|
unlink(fifopath);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -6936,7 +6936,7 @@ int main(int argc, char *argv[])
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
#ifndef NOFIFO
|
#ifndef NOFIFO
|
||||||
case 'a':
|
case 'a':
|
||||||
g_states |= STATE_AUTOFIFO;
|
g_state.autofifo = 1;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 'A':
|
case 'A':
|
||||||
|
@ -6965,7 +6965,7 @@ int main(int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
g_states |= STATE_FORTUNE;
|
g_state.fortune = 1;
|
||||||
break;
|
break;
|
||||||
case 'g':
|
case 'g':
|
||||||
cfg.regex = 1;
|
cfg.regex = 1;
|
||||||
|
@ -7011,7 +7011,7 @@ int main(int argc, char *argv[])
|
||||||
pkey = (uchar)optarg[0];
|
pkey = (uchar)optarg[0];
|
||||||
break;
|
break;
|
||||||
case 'Q':
|
case 'Q':
|
||||||
g_states |= STATE_FORCEQUIT;
|
g_state.forcequit = 1;
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
@ -7144,7 +7144,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!S_ISDIR(sb.st_mode))
|
if (!S_ISDIR(sb.st_mode))
|
||||||
g_states |= STATE_INITFILE;
|
g_state.initfile = 1;
|
||||||
|
|
||||||
if (session)
|
if (session)
|
||||||
session = NULL;
|
session = NULL;
|
||||||
|
@ -7185,7 +7185,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
#ifndef NOFIFO
|
#ifndef NOFIFO
|
||||||
/* Create fifo */
|
/* Create fifo */
|
||||||
if (g_states & STATE_AUTOFIFO) {
|
if (g_state.autofifo) {
|
||||||
g_tmpfpath[tmpfplen - 1] = '\0';
|
g_tmpfpath[tmpfplen - 1] = '\0';
|
||||||
snprintf(g_buf, CMD_LEN_MAX, "%s/nnn-fifo.%d", g_tmpfpath, getpid());
|
snprintf(g_buf, CMD_LEN_MAX, "%s/nnn-fifo.%d", g_tmpfpath, getpid());
|
||||||
setenv("NNN_FIFO", g_buf, TRUE);
|
setenv("NNN_FIFO", g_buf, TRUE);
|
||||||
|
@ -7225,7 +7225,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
/* Configure trash preference */
|
/* Configure trash preference */
|
||||||
if (xgetenv_set(env_cfg[NNN_TRASH]))
|
if (xgetenv_set(env_cfg[NNN_TRASH]))
|
||||||
g_states |= STATE_TRASH;
|
g_state.trash = 1;
|
||||||
|
|
||||||
/* Ignore/handle certain signals */
|
/* Ignore/handle certain signals */
|
||||||
struct sigaction act = {.sa_handler = sigint_handler};
|
struct sigaction act = {.sa_handler = sigint_handler};
|
||||||
|
|
Loading…
Reference in a new issue