@@ -28,13 +28,22 @@ struct cmd_results *cmd_exec_validate(int argc, char **argv) {
28
28
struct cmd_results * cmd_exec_process (int argc , char * * argv ) {
29
29
struct cmd_results * error = NULL ;
30
30
char * cmd = NULL ;
31
+ bool matched_container_id = false;
31
32
bool no_startup_id = false;
32
- if (strcmp (argv [0 ], "--no-startup-id" ) == 0 ) {
33
- no_startup_id = true;
34
- -- argc ; ++ argv ;
35
- if ((error = checkarg (argc , argv [-1 ], EXPECTED_AT_LEAST , 1 ))) {
36
- return error ;
33
+ int argv_counter = -1 ;
34
+ while (argc > 0 && has_prefix (* argv , "--" )) {
35
+ if (strcmp (argv [0 ], "--matched-container-id" ) == 0 ) {
36
+ matched_container_id = true;
37
+ } else if (strcmp (argv [0 ], "--no-startup-id" ) == 0 ) {
38
+ no_startup_id = true;
39
+ } else {
40
+ return cmd_results_new (CMD_INVALID , "Unrecognized argument '%s'" , * argv );
37
41
}
42
+ -- argc ; ++ argv ; argv_counter -- ;
43
+ }
44
+
45
+ if ((error = checkarg (argc , argv [argv_counter ], EXPECTED_AT_LEAST , 1 ))) {
46
+ return error ;
38
47
}
39
48
40
49
if (argc == 1 && (argv [0 ][0 ] == '\'' || argv [0 ][0 ] == '"' )) {
@@ -61,6 +70,26 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) {
61
70
}
62
71
}
63
72
73
+ if (matched_container_id && config -> handler_context .node != NULL ) {
74
+ size_t con_id = config -> handler_context .node -> id ;
75
+ int con_id_len = snprintf (NULL , 0 , "%zu" , con_id );
76
+ if (con_id_len < 0 ) {
77
+ sway_log (SWAY_ERROR , "Unable to determine buffer length for SWAY_EXEC_CON_ID" );
78
+ goto no_con_id_export ;
79
+ }
80
+ // accommodate \0
81
+ con_id_len ++ ;
82
+ char * con_id_str = malloc (con_id_len );
83
+ if (!con_id_str ) {
84
+ sway_log (SWAY_ERROR , "Unable to allocate buffer for SWAY_EXEC_CON_ID" );
85
+ goto no_con_id_export ;
86
+ }
87
+ snprintf (con_id_str , con_id_len , "%zu" , con_id );
88
+ setenv ("SWAY_EXEC_CON_ID" , con_id_str , 1 );
89
+ free (con_id_str );
90
+ }
91
+ no_con_id_export :
92
+
64
93
execlp ("sh" , "sh" , "-c" , cmd , (void * )NULL );
65
94
sway_log_errno (SWAY_ERROR , "execve failed" );
66
95
_exit (0 ); // Close child process
0 commit comments