@@ -131,17 +131,26 @@ int get_peer_pidfd(int fd)
131131 int ret = getsockopt (fd , SOL_SOCKET , SO_PEERPIDFD , & fd_peer_pidfd ,
132132 & fd_peer_pidfd_len );
133133 if (ret < 0 ) {
134- fprintf (stderr , "%m - Failed to retrieve peer pidfd for coredump socket connection \n" );
134+ fprintf (stderr , "get_peer_pidfd: getsockopt(SO_PEERPIDFD) failed: %m \n" );
135135 return -1 ;
136136 }
137+ fprintf (stderr , "get_peer_pidfd: successfully retrieved pidfd %d\n" , fd_peer_pidfd );
137138 return fd_peer_pidfd ;
138139}
139140
140141bool get_pidfd_info (int fd_peer_pidfd , struct pidfd_info * info )
141142{
143+ int ret ;
142144 memset (info , 0 , sizeof (* info ));
143145 info -> mask = PIDFD_INFO_EXIT | PIDFD_INFO_COREDUMP | PIDFD_INFO_COREDUMP_SIGNAL ;
144- return ioctl (fd_peer_pidfd , PIDFD_GET_INFO , info ) == 0 ;
146+ ret = ioctl (fd_peer_pidfd , PIDFD_GET_INFO , info );
147+ if (ret < 0 ) {
148+ fprintf (stderr , "get_pidfd_info: ioctl(PIDFD_GET_INFO) failed: %m\n" );
149+ return false;
150+ }
151+ fprintf (stderr , "get_pidfd_info: mask=0x%llx, coredump_mask=0x%x, coredump_signal=%d\n" ,
152+ (unsigned long long )info -> mask , info -> coredump_mask , info -> coredump_signal );
153+ return true;
145154}
146155
147156/* Protocol helper functions */
@@ -198,14 +207,23 @@ bool read_coredump_req(int fd, struct coredump_req *req)
198207
199208 /* Peek the size of the coredump request. */
200209 ret = recv (fd , req , field_size , MSG_PEEK | MSG_WAITALL );
201- if (ret != field_size )
210+ if (ret != field_size ) {
211+ fprintf (stderr , "read_coredump_req: peek failed (got %zd, expected %zu): %m\n" ,
212+ ret , field_size );
202213 return false;
214+ }
203215 kernel_size = req -> size ;
204216
205- if (kernel_size < COREDUMP_ACK_SIZE_VER0 )
217+ if (kernel_size < COREDUMP_ACK_SIZE_VER0 ) {
218+ fprintf (stderr , "read_coredump_req: kernel_size %zu < min %d\n" ,
219+ kernel_size , COREDUMP_ACK_SIZE_VER0 );
206220 return false;
207- if (kernel_size >= PAGE_SIZE )
221+ }
222+ if (kernel_size >= PAGE_SIZE ) {
223+ fprintf (stderr , "read_coredump_req: kernel_size %zu >= PAGE_SIZE %d\n" ,
224+ kernel_size , PAGE_SIZE );
208225 return false;
226+ }
209227
210228 /* Use the minimum of user and kernel size to read the full request. */
211229 user_size = sizeof (struct coredump_req );
@@ -295,25 +313,35 @@ void process_coredump_worker(int fd_coredump, int fd_peer_pidfd, int fd_core_fil
295313
296314 /* Set socket to non-blocking mode for edge-triggered epoll */
297315 flags = fcntl (fd_coredump , F_GETFL , 0 );
298- if (flags < 0 )
316+ if (flags < 0 ) {
317+ fprintf (stderr , "Worker: fcntl(F_GETFL) failed: %m\n" );
299318 goto out ;
300- if (fcntl (fd_coredump , F_SETFL , flags | O_NONBLOCK ) < 0 )
319+ }
320+ if (fcntl (fd_coredump , F_SETFL , flags | O_NONBLOCK ) < 0 ) {
321+ fprintf (stderr , "Worker: fcntl(F_SETFL, O_NONBLOCK) failed: %m\n" );
301322 goto out ;
323+ }
302324
303325 epfd = epoll_create1 (0 );
304- if (epfd < 0 )
326+ if (epfd < 0 ) {
327+ fprintf (stderr , "Worker: epoll_create1() failed: %m\n" );
305328 goto out ;
329+ }
306330
307331 ev .events = EPOLLIN | EPOLLRDHUP | EPOLLET ;
308332 ev .data .fd = fd_coredump ;
309- if (epoll_ctl (epfd , EPOLL_CTL_ADD , fd_coredump , & ev ) < 0 )
333+ if (epoll_ctl (epfd , EPOLL_CTL_ADD , fd_coredump , & ev ) < 0 ) {
334+ fprintf (stderr , "Worker: epoll_ctl(EPOLL_CTL_ADD) failed: %m\n" );
310335 goto out ;
336+ }
311337
312338 for (;;) {
313339 struct epoll_event events [1 ];
314340 int n = epoll_wait (epfd , events , 1 , -1 );
315- if (n < 0 )
341+ if (n < 0 ) {
342+ fprintf (stderr , "Worker: epoll_wait() failed: %m\n" );
316343 break ;
344+ }
317345
318346 if (events [0 ].events & (EPOLLIN | EPOLLRDHUP )) {
319347 for (;;) {
@@ -322,19 +350,24 @@ void process_coredump_worker(int fd_coredump, int fd_peer_pidfd, int fd_core_fil
322350 if (bytes_read < 0 ) {
323351 if (errno == EAGAIN || errno == EWOULDBLOCK )
324352 break ;
353+ fprintf (stderr , "Worker: read() failed: %m\n" );
325354 goto out ;
326355 }
327356 if (bytes_read == 0 )
328357 goto done ;
329358 ssize_t bytes_write = write (fd_core_file , buffer , bytes_read );
330- if (bytes_write != bytes_read )
359+ if (bytes_write != bytes_read ) {
360+ fprintf (stderr , "Worker: write() failed (read=%zd, write=%zd): %m\n" ,
361+ bytes_read , bytes_write );
331362 goto out ;
363+ }
332364 }
333365 }
334366 }
335367
336368done :
337369 exit_code = EXIT_SUCCESS ;
370+ fprintf (stderr , "Worker: completed successfully\n" );
338371out :
339372 if (epfd >= 0 )
340373 close (epfd );
0 commit comments