@@ -2032,10 +2032,13 @@ write_envelope_with_native_stacktrace(const sentry_options_t *options,
20322032
20332033 // Serialize event to JSON
20342034 char * event_json = sentry_value_to_json (event );
2035+ char * event_id = sentry__string_clone (
2036+ sentry_value_as_string (sentry_value_get_by_key (event , "event_id" )));
20352037 sentry_value_decref (event );
20362038
20372039 if (!event_json ) {
20382040 SENTRY_WARN ("Failed to serialize native crash event to JSON" );
2041+ sentry_free (event_id );
20392042 return false;
20402043 }
20412044
@@ -2054,6 +2057,7 @@ write_envelope_with_native_stacktrace(const sentry_options_t *options,
20542057 if (fd < 0 ) {
20552058 SENTRY_WARN ("Failed to open envelope file for writing" );
20562059 sentry_free (event_json );
2060+ sentry_free (event_id );
20572061 return false;
20582062 }
20592063
@@ -2062,12 +2066,19 @@ write_envelope_with_native_stacktrace(const sentry_options_t *options,
20622066 = options && options -> dsn ? sentry_options_get_dsn (options ) : NULL ;
20632067 char header_buf [SENTRY_CRASH_ENVELOPE_HEADER_SIZE ];
20642068 int header_len ;
2065- if (dsn ) {
2069+ if (dsn && event_id && event_id [0 ] != '\0' ) {
2070+ header_len = snprintf (header_buf , sizeof (header_buf ),
2071+ "{\"dsn\":\"%s\",\"event_id\":\"%s\"}\n" , dsn , event_id );
2072+ } else if (dsn ) {
20662073 header_len = snprintf (
20672074 header_buf , sizeof (header_buf ), "{\"dsn\":\"%s\"}\n" , dsn );
2075+ } else if (event_id && event_id [0 ] != '\0' ) {
2076+ header_len = snprintf (header_buf , sizeof (header_buf ),
2077+ "{\"event_id\":\"%s\"}\n" , event_id );
20682078 } else {
20692079 header_len = snprintf (header_buf , sizeof (header_buf ), "{}\n" );
20702080 }
2081+ sentry_free (event_id );
20712082 if (header_len > 0 && header_len < (int )sizeof (header_buf )) {
20722083#if defined(SENTRY_PLATFORM_UNIX )
20732084 if (write (fd , header_buf , header_len ) != header_len ) {
@@ -2238,6 +2249,23 @@ write_envelope_with_minidump(const sentry_options_t *options,
22382249 const char * envelope_path , const char * event_msgpack_path ,
22392250 const char * minidump_path , sentry_path_t * run_folder )
22402251{
2252+ // Read event JSON data
2253+ size_t event_size = 0 ;
2254+ char * event_json = NULL ;
2255+ char * event_id = NULL ;
2256+ sentry_path_t * ev_path = sentry__path_from_str (event_msgpack_path );
2257+ if (ev_path ) {
2258+ event_json = sentry__path_read_to_buffer (ev_path , & event_size );
2259+ sentry__path_free (ev_path );
2260+ if (event_json && event_size > 0 ) {
2261+ sentry_value_t event
2262+ = sentry__value_from_json (event_json , event_size );
2263+ event_id = sentry__string_clone (sentry_value_as_string (
2264+ sentry_value_get_by_key (event , "event_id" )));
2265+ sentry_value_decref (event );
2266+ }
2267+ }
2268+
22412269 // Open envelope file for writing
22422270#if defined(SENTRY_PLATFORM_UNIX )
22432271 int fd = open (envelope_path , O_WRONLY | O_CREAT | O_TRUNC , 0644 );
@@ -2251,20 +2279,29 @@ write_envelope_with_minidump(const sentry_options_t *options,
22512279#endif
22522280 if (fd < 0 ) {
22532281 SENTRY_WARN ("Failed to open envelope file for writing" );
2282+ sentry_free (event_json );
2283+ sentry_free (event_id );
22542284 return false;
22552285 }
22562286
2257- // Write envelope headers (just DSN if available)
2287+ // Write envelope headers (just DSN and event ID if available)
22582288 const char * dsn
22592289 = options && options -> dsn ? sentry_options_get_dsn (options ) : NULL ;
22602290 char header_buf [SENTRY_CRASH_ENVELOPE_HEADER_SIZE ];
22612291 int header_len ;
2262- if (dsn ) {
2292+ if (dsn && event_id && event_id [0 ] != '\0' ) {
2293+ header_len = snprintf (header_buf , sizeof (header_buf ),
2294+ "{\"dsn\":\"%s\",\"event_id\":\"%s\"}\n" , dsn , event_id );
2295+ } else if (dsn ) {
22632296 header_len = snprintf (
22642297 header_buf , sizeof (header_buf ), "{\"dsn\":\"%s\"}\n" , dsn );
2298+ } else if (event_id && event_id [0 ] != '\0' ) {
2299+ header_len = snprintf (header_buf , sizeof (header_buf ),
2300+ "{\"event_id\":\"%s\"}\n" , event_id );
22652301 } else {
22662302 header_len = snprintf (header_buf , sizeof (header_buf ), "{}\n" );
22672303 }
2304+ sentry_free (event_id );
22682305 if (header_len > 0 && header_len < (int )sizeof (header_buf )) {
22692306#if defined(SENTRY_PLATFORM_UNIX )
22702307 if (write (fd , header_buf , header_len ) != header_len ) {
@@ -2275,39 +2312,30 @@ write_envelope_with_minidump(const sentry_options_t *options,
22752312#endif
22762313 }
22772314
2278- // Read event JSON data
2279- sentry_path_t * ev_path = sentry__path_from_str (event_msgpack_path );
2280- if (ev_path ) {
2281- size_t event_size = 0 ;
2282- char * event_json = sentry__path_read_to_buffer (ev_path , & event_size );
2283- sentry__path_free (ev_path );
2284-
2285- if (event_json && event_size > 0 ) {
2286- // Write event item header
2287- char event_header [SENTRY_CRASH_ITEM_HEADER_SIZE ];
2288- int ev_header_len = snprintf (event_header , sizeof (event_header ),
2289- "{\"type\":\"event\",\"length\":%zu}\n" , event_size );
2290- if (ev_header_len > 0
2291- && ev_header_len < (int )sizeof (event_header )) {
2315+ // Write event item
2316+ if (event_json && event_size > 0 ) {
2317+ char event_header [SENTRY_CRASH_ITEM_HEADER_SIZE ];
2318+ int ev_header_len = snprintf (event_header , sizeof (event_header ),
2319+ "{\"type\":\"event\",\"length\":%zu}\n" , event_size );
2320+ if (ev_header_len > 0 && ev_header_len < (int )sizeof (event_header )) {
22922321#if defined(SENTRY_PLATFORM_UNIX )
2293- if (write (fd , event_header , ev_header_len ) != ev_header_len ) {
2294- SENTRY_WARN ("Failed to write event header to envelope" );
2295- }
2296- if (write (fd , event_json , event_size ) != (ssize_t )event_size ) {
2297- SENTRY_WARN ("Failed to write event data to envelope" );
2298- }
2299- if (write (fd , "\n" , 1 ) != 1 ) {
2300- SENTRY_WARN ("Failed to write event newline to envelope" );
2301- }
2322+ if (write (fd , event_header , ev_header_len ) != ev_header_len ) {
2323+ SENTRY_WARN ("Failed to write event header to envelope" );
2324+ }
2325+ if (write (fd , event_json , event_size ) != (ssize_t )event_size ) {
2326+ SENTRY_WARN ("Failed to write event data to envelope" );
2327+ }
2328+ if (write (fd , "\n" , 1 ) != 1 ) {
2329+ SENTRY_WARN ("Failed to write event newline to envelope" );
2330+ }
23022331#elif defined(SENTRY_PLATFORM_WINDOWS )
2303- _write (fd , event_header , (unsigned int )ev_header_len );
2304- _write (fd , event_json , (unsigned int )event_size );
2305- _write (fd , "\n" , 1 );
2332+ _write (fd , event_header , (unsigned int )ev_header_len );
2333+ _write (fd , event_json , (unsigned int )event_size );
2334+ _write (fd , "\n" , 1 );
23062335#endif
2307- }
2308- sentry_free (event_json );
23092336 }
23102337 }
2338+ sentry_free (event_json );
23112339
23122340 // Add minidump as attachment
23132341#if defined(SENTRY_PLATFORM_UNIX )
@@ -2712,14 +2740,17 @@ sentry__process_crash(const sentry_options_t *options, sentry_crash_ipc_t *ipc)
27122740
27132741 SENTRY_DEBUG ("Envelope loaded, sending via transport" );
27142742
2715- // Send directly via transport
2716- if (options && options -> transport ) {
2717- SENTRY_DEBUG ("Calling transport send_envelope" );
2718- sentry__transport_send_envelope (options -> transport , envelope );
2719- SENTRY_DEBUG ("Crash envelope sent to transport (queued)" );
2720- } else {
2721- SENTRY_WARN ("No transport available for sending envelope" );
2722- sentry_envelope_free (envelope );
2743+ // Send directly via transport, or to external crash reporter
2744+ if (!sentry__launch_external_crash_reporter (options , envelope )) {
2745+ // Send directly via transport
2746+ if (options && options -> transport ) {
2747+ SENTRY_DEBUG ("Calling transport send_envelope" );
2748+ sentry__transport_send_envelope (options -> transport , envelope );
2749+ SENTRY_DEBUG ("Crash envelope sent to transport (queued)" );
2750+ } else {
2751+ SENTRY_WARN ("No transport available for sending envelope" );
2752+ sentry_envelope_free (envelope );
2753+ }
27232754 }
27242755
27252756 // Clean up temporary envelope file (keep minidump for
0 commit comments