@@ -210,17 +210,21 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
210210 struct iovec req_iov [3 ], resp_iov [3 ];
211211 struct msghdr req_msg , resp_msg ;
212212 struct sockaddr_mctp addr ;
213+ int i , rc , errno_save ;
213214 ssize_t len ;
214215 __le32 mic ;
215- int i , rc ;
216216 __u8 tag ;
217217
218- if (ep -> transport != & nvme_mi_transport_mctp )
219- return - EINVAL ;
218+ if (ep -> transport != & nvme_mi_transport_mctp ) {
219+ errno = EINVAL ;
220+ return -1 ;
221+ }
220222
221223 /* we need enough space for at least a generic (/error) response */
222- if (resp -> hdr_len < sizeof (struct nvme_mi_msg_resp ))
223- return - EINVAL ;
224+ if (resp -> hdr_len < sizeof (struct nvme_mi_msg_resp )) {
225+ errno = EINVAL ;
226+ return -1 ;
227+ }
224228
225229 mctp = ep -> transport_data ;
226230 tag = nvme_mi_mctp_tag_alloc (ep );
@@ -256,9 +260,11 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
256260
257261 len = ops .sendmsg (mctp -> sd , & req_msg , 0 );
258262 if (len < 0 ) {
263+ errno_save = errno ;
259264 nvme_msg (ep -> root , LOG_ERR ,
260265 "Failure sending MCTP message: %m\n" );
261- rc = len ;
266+ errno = errno_save ;
267+ rc = -1 ;
262268 goto out ;
263269 }
264270
@@ -282,14 +288,17 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
282288 len = ops .recvmsg (mctp -> sd , & resp_msg , 0 );
283289
284290 if (len < 0 ) {
291+ errno_save = errno ;
285292 nvme_msg (ep -> root , LOG_ERR ,
286293 "Failure receiving MCTP message: %m\n" );
294+ errno = errno_save ;
287295 goto out ;
288296 }
289297
290298
291299 if (len == 0 ) {
292300 nvme_msg (ep -> root , LOG_WARNING , "No data from MCTP endpoint\n" );
301+ errno = EIO ;
293302 goto out ;
294303 }
295304
@@ -304,6 +313,7 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
304313 nvme_msg (ep -> root , LOG_ERR ,
305314 "Invalid MCTP response: too short (%zd bytes, needed %zd)\n" ,
306315 len , 8 + sizeof (mic ));
316+ errno = EPROTO ;
307317 goto out ;
308318 }
309319
@@ -312,6 +322,7 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
312322 nvme_msg (ep -> root , LOG_WARNING ,
313323 "Response message has unaligned length (%zd)!\n" ,
314324 len );
325+ errno = EPROTO ;
315326 goto out ;
316327 }
317328
@@ -379,8 +390,10 @@ static int nvme_mi_mctp_desc_ep(struct nvme_mi_ep *ep, char *buf, size_t len)
379390{
380391 struct nvme_mi_transport_mctp * mctp ;
381392
382- if (ep -> transport != & nvme_mi_transport_mctp )
393+ if (ep -> transport != & nvme_mi_transport_mctp ) {
394+ errno = EINVAL ;
383395 return -1 ;
396+ }
384397
385398 mctp = ep -> transport_data ;
386399
@@ -401,6 +414,7 @@ nvme_mi_ep_t nvme_mi_open_mctp(nvme_root_t root, unsigned int netid, __u8 eid)
401414{
402415 struct nvme_mi_transport_mctp * mctp ;
403416 struct nvme_mi_ep * ep ;
417+ int errno_save ;
404418
405419 ep = nvme_mi_init_ep (root );
406420 if (!ep )
@@ -423,39 +437,44 @@ nvme_mi_ep_t nvme_mi_open_mctp(nvme_root_t root, unsigned int netid, __u8 eid)
423437 return ep ;
424438
425439err_free_ep :
440+ errno_save = errno ;
426441 free (ep );
442+ errno = errno_save ;
427443 return NULL ;
428444}
429445
430446#ifdef CONFIG_LIBSYSTEMD
431447
432- static void _dbus_err (nvme_root_t root , int rc , int line ) {
448+ /* helper for handling dbus errors: D-Bus API returns a negtive errno on
449+ * failure; set errno and log.
450+ */
451+ static void _dbus_err (nvme_root_t root , int rc , int line )
452+ {
433453 nvme_msg (root , LOG_ERR , "MCTP D-Bus failed line %d: %s %d\n" ,
434454 line , strerror (- rc ), rc );
455+ errno = - rc ;
435456}
436457
437458#define dbus_err (r , rc ) _dbus_err(r, rc, __LINE__)
438459
439- /* Returns -EEXISTS on duplicate */
440460static int nvme_mi_mctp_add (nvme_root_t root , unsigned int netid , __u8 eid )
441461{
442462 nvme_mi_ep_t ep = NULL ;
443463
444- /* ensure we don't already have an endpoint with the same net/eid */
464+ /* ensure we don't already have an endpoint with the same net/eid. if
465+ * we do, just skip, no need to re-add. */
445466 list_for_each (& root -> endpoints , ep , root_entry ) {
446467 if (ep -> transport != & nvme_mi_transport_mctp ) {
447468 continue ;
448469 }
449470 const struct nvme_mi_transport_mctp * t = ep -> transport_data ;
450- if (t -> eid == eid && t -> net == netid ) {
451- return - EEXIST ;
452- }
471+ if (t -> eid == eid && t -> net == netid )
472+ return 0 ;
453473 }
454474
455475 ep = nvme_mi_open_mctp (root , netid , eid );
456- if (!ep ) {
457- return - ENOMEM ;
458- }
476+ if (!ep )
477+ return -1 ;
459478
460479 return 0 ;
461480}
@@ -481,7 +500,7 @@ static int handle_mctp_endpoint(nvme_root_t root, const char* objpath,
481500 rc = sd_bus_message_enter_container (m , 'a' , "{sv}" );
482501 if (rc < 0 ) {
483502 dbus_err (root , rc );
484- return rc ;
503+ return -1 ;
485504 }
486505
487506 while (!container_end (m )) {
@@ -492,13 +511,13 @@ static int handle_mctp_endpoint(nvme_root_t root, const char* objpath,
492511 rc = sd_bus_message_enter_container (m , 'e' , "sv" );
493512 if (rc < 0 ) {
494513 dbus_err (root , rc );
495- return rc ;
514+ return -1 ;
496515 }
497516
498517 rc = sd_bus_message_read (m , "s" , & propname );
499518 if (rc < 0 ) {
500519 dbus_err (root , rc );
501- return rc ;
520+ return -1 ;
502521 }
503522
504523 if (strcmp (propname , "EID" ) == 0 ) {
@@ -521,36 +540,38 @@ static int handle_mctp_endpoint(nvme_root_t root, const char* objpath,
521540
522541 if (rc < 0 ) {
523542 dbus_err (root , rc );
524- return rc ;
543+ return -1 ;
525544 }
526545
527546 /* Exit prop item */
528547 rc = sd_bus_message_exit_container (m );
529548 if (rc < 0 ) {
530549 dbus_err (root , rc );
531- return rc ;
550+ return -1 ;
532551 }
533552 }
534553
535554 /* Exit property dict */
536555 rc = sd_bus_message_exit_container (m );
537556 if (rc < 0 ) {
538557 dbus_err (root , rc );
539- return rc ;
558+ return -1 ;
540559 }
541560 }
542561
543562 if (have_nvmemi ) {
544563 if (!(have_eid && have_net )) {
545564 nvme_msg (root , LOG_ERR ,
546565 "Missing property for %s\n" , objpath );
547- return - ENOENT ;
566+ errno = ENOENT ;
567+ return -1 ;
548568 }
549569 rc = nvme_mi_mctp_add (root , net , eid );
550570 if (rc < 0 ) {
571+ int errno_save = errno ;
551572 nvme_msg (root , LOG_ERR ,
552- "Error adding net %d eid %d: %s \n" ,
553- net , eid , strerror ( - rc )) ;
573+ "Error adding net %d eid %d: %m \n" , net , eid );
574+ errno = errno_save ;
554575 }
555576 } else {
556577 /* Ignore other endpoints */
@@ -568,15 +589,15 @@ static int handle_mctp_obj(nvme_root_t root, sd_bus_message *m)
568589 rc = sd_bus_message_read (m , "o" , & objpath );
569590 if (rc < 0 ) {
570591 dbus_err (root , rc );
571- return rc ;
592+ return -1 ;
572593 }
573594
574595 /* Enter response object: our array of (string, property dict)
575596 * values */
576597 rc = sd_bus_message_enter_container (m , 'a' , "{sa{sv}}" );
577598 if (rc < 0 ) {
578599 dbus_err (root , rc );
579- return rc ;
600+ return -1 ;
580601 }
581602
582603
@@ -586,13 +607,13 @@ static int handle_mctp_obj(nvme_root_t root, sd_bus_message *m)
586607 rc = sd_bus_message_enter_container (m , 'e' , "sa{sv}" );
587608 if (rc < 0 ) {
588609 dbus_err (root , rc );
589- return rc ;
610+ return -1 ;
590611 }
591612
592613 rc = sd_bus_message_read (m , "s" , & ifname );
593614 if (rc < 0 ) {
594615 dbus_err (root , rc );
595- return rc ;
616+ return -1 ;
596617 }
597618
598619 if (!strcmp (ifname , MCTP_DBUS_IFACE_ENDPOINT )) {
@@ -606,23 +627,23 @@ static int handle_mctp_obj(nvme_root_t root, sd_bus_message *m)
606627 rc = sd_bus_message_skip (m , "a{sv}" );
607628 if (rc < 0 ) {
608629 dbus_err (root , rc );
609- return rc ;
630+ return -1 ;
610631 }
611632 }
612633
613634 /* Exit interface item */
614635 rc = sd_bus_message_exit_container (m );
615636 if (rc < 0 ) {
616637 dbus_err (root , rc );
617- return rc ;
638+ return -1 ;
618639 }
619640 }
620641
621642 /* Exit response object */
622643 rc = sd_bus_message_exit_container (m );
623644 if (rc < 0 ) {
624645 dbus_err (root , rc );
625- return rc ;
646+ return -1 ;
626647 }
627648
628649 return 0 ;
@@ -633,19 +654,22 @@ nvme_root_t nvme_mi_scan_mctp(void)
633654 sd_bus * bus = NULL ;
634655 sd_bus_message * resp = NULL ;
635656 sd_bus_error berr = SD_BUS_ERROR_NULL ;
657+ int rc , errno_save ;
636658 nvme_root_t root ;
637- int rc ;
638659
639660 root = nvme_mi_create_root (NULL , DEFAULT_LOGLEVEL );
640661 if (!root ) {
641- rc = - ENOMEM ;
662+ errno = ENOMEM ;
663+ rc = -1 ;
642664 goto out ;
643665 }
644666
645667 rc = sd_bus_default_system (& bus );
646668 if (rc < 0 ) {
647669 nvme_msg (root , LOG_ERR , "Failed opening D-Bus: %s\n" ,
648670 strerror (- rc ));
671+ errno = - rc ;
672+ rc = -1 ;
649673 goto out ;
650674 }
651675
@@ -660,14 +684,17 @@ nvme_root_t nvme_mi_scan_mctp(void)
660684 if (rc < 0 ) {
661685 nvme_msg (root , LOG_ERR , "Failed querying MCTP D-Bus: %s (%s)\n" ,
662686 berr .message , berr .name );
687+ errno = - rc ;
688+ rc = -1 ;
663689 goto out ;
664690 }
665691
666692 rc = sd_bus_message_enter_container (resp , 'a' , "{oa{sa{sv}}}" );
667693 if (rc != 1 ) {
668694 dbus_err (root , rc );
669695 if (rc == 0 )
670- rc = - EPROTO ;
696+ errno = EPROTO ;
697+ rc = -1 ;
671698 goto out ;
672699 }
673700
@@ -676,6 +703,7 @@ nvme_root_t nvme_mi_scan_mctp(void)
676703 rc = sd_bus_message_enter_container (resp , 'e' , "oa{sa{sv}}" );
677704 if (rc < 0 ) {
678705 dbus_err (root , rc );
706+ rc = -1 ;
679707 goto out ;
680708 }
681709
@@ -684,18 +712,21 @@ nvme_root_t nvme_mi_scan_mctp(void)
684712 rc = sd_bus_message_exit_container (resp );
685713 if (rc < 0 ) {
686714 dbus_err (root , rc );
715+ rc = -1 ;
687716 goto out ;
688717 }
689718 }
690719
691720 rc = sd_bus_message_exit_container (resp );
692721 if (rc < 0 ) {
693722 dbus_err (root , rc );
723+ rc = -1 ;
694724 goto out ;
695725 }
696726 rc = 0 ;
697727
698728out :
729+ errno_save = errno ;
699730 sd_bus_error_free (& berr );
700731 sd_bus_message_unref (resp );
701732 sd_bus_unref (bus );
@@ -704,6 +735,7 @@ nvme_root_t nvme_mi_scan_mctp(void)
704735 if (root ) {
705736 nvme_mi_free_root (root );
706737 }
738+ errno = errno_save ;
707739 root = NULL ;
708740 }
709741 return root ;
0 commit comments