Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix sigint handling when running in helper mode #869

Merged
merged 7 commits into from
Jun 20, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions cli_helper/kart.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@
/**
* @brief Exit signal handler for SIGALRM
*/
void exit_on_alarm(int sig)
void exit_on_sigalrm(int sig)
{
int semval = semctl(semid, SEMNUM, GETVAL);
if (semval < 0)
Expand All @@ -209,6 +209,21 @@
exit(exit_code);
}

char *socket_filename;

/**
* @brief Exit signal handler for SIGINT
*/
void exit_on_sigint(int sig)
{
putchar('\n');
rcoup marked this conversation as resolved.
Show resolved Hide resolved
const char* kill_cmd_template = "lsof -t '%s' | xargs kill";
rcoup marked this conversation as resolved.
Show resolved Hide resolved
char* kill_cmd = malloc(strlen(kill_cmd_template) + strlen(socket_filename) + 2);
sprintf(kill_cmd, kill_cmd_template, socket_filename);
system(kill_cmd);

Check failure on line 223 in cli_helper/kart.c

View workflow job for this annotation

GitHub Actions / Build Linux dev

ignoring return value of ‘system’ declared with attribute ‘warn_unused_result’ [-Werror=unused-result]
exit(128 + sig);
}

int main(int argc, char **argv, char **environ)
{
char cmd_path[PATH_MAX];
Expand Down Expand Up @@ -267,7 +282,7 @@
int fp = open(getcwd(NULL, 0), O_RDONLY);
int fds[4] = {fileno(stdin), fileno(stdout), fileno(stderr), fp};

char *socket_filename = malloc(strlen(getenv("HOME")) + strlen(".kart.socket") + 2);
socket_filename = malloc(strlen(getenv("HOME")) + strlen(".kart.socket") + 2);
sprintf(socket_filename, "%s/%s", getenv("HOME"), ".kart.socket");
int socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);

Expand Down Expand Up @@ -370,7 +385,8 @@
memcpy((int *)CMSG_DATA(cmsg), fds, sizeof(fds));
msg.msg_controllen = cmsg->cmsg_len;

signal(SIGALRM, exit_on_alarm);
signal(SIGALRM, exit_on_sigalrm);
signal(SIGINT, exit_on_sigint);

if (sendmsg(socket_fd, &msg, 0) < 0)
{
Expand Down
5 changes: 4 additions & 1 deletion kart/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,10 @@ def _cleanup_process_group(signum, stack_frame):
if _kart_process_group_killed:
return
_kart_process_group_killed = True
os.killpg(os.getpid(), signum)
try:
os.killpg(os.getpid(), signum)
except Exception:
rcoup marked this conversation as resolved.
Show resolved Hide resolved
pass
sys.exit(128 + signum)

signal.signal(signal.SIGTERM, _cleanup_process_group)
Expand Down
Loading