@@ -395,6 +395,17 @@ PyObject *hostid_from_file();
395395#include " fabrics.h"
396396#define STR_OR_NONE (str ) (!(str) ? " None" : str)
397397
398+ struct nvme_host * nvme_first_host (struct nvme_root * r);
399+ struct nvme_host * nvme_next_host (struct nvme_root * r, struct nvme_host * h);
400+ struct nvme_subsystem * nvme_first_subsystem (struct nvme_host * h);
401+ struct nvme_subsystem * nvme_next_subsystem (struct nvme_host * h, struct nvme_subsystem * s);
402+ struct nvme_ctrl * nvme_subsystem_first_ctrl (struct nvme_subsystem * s);
403+ struct nvme_ctrl * nvme_subsystem_next_ctrl (struct nvme_subsystem * s, struct nvme_ctrl * c);
404+ struct nvme_ns * nvme_subsystem_first_ns (struct nvme_subsystem * s);
405+ struct nvme_ns * nvme_subsystem_next_ns (struct nvme_subsystem * s, struct nvme_ns * n);
406+ struct nvme_ns * nvme_ctrl_first_ns (struct nvme_ctrl * c);
407+ struct nvme_ns * nvme_ctrl_next_ns (struct nvme_ctrl * c, struct nvme_ns * n);
408+
398409struct nvme_root {
399410 %immutable config_file;
400411 %immutable application;
@@ -544,9 +555,14 @@ struct nvme_ns {
544555 else if (!strcmp (level, " emerg" )) log_level = LOG_EMERG;
545556 nvme_init_logging ($self, log_level, false , false );
546557 }
547- struct nvme_host *hosts () {
548- return nvme_first_host ($self);
549- }
558+ %pythoncode %{
559+ def hosts (self):
560+ " " " Iterator over all host objects" " "
561+ h = nvme_first_host (self)
562+ while h:
563+ yield h
564+ h = nvme_next_host (self, h)
565+ %}
550566 void refresh_topology () {
551567 nvme_refresh_topology ($self);
552568 }
@@ -620,9 +636,14 @@ struct nvme_ns {
620636 };
621637 return ret;
622638 }
623- struct nvme_subsystem * subsystems () {
624- return nvme_first_subsystem ($self);
625- }
639+ %pythoncode %{
640+ def subsystems (self):
641+ " " " Iterator over all subsystem objects" " "
642+ s = nvme_first_subsystem (self)
643+ while s:
644+ yield s
645+ s = nvme_next_subsystem (self, s)
646+ %}
626647}
627648
628649%{
@@ -692,12 +713,22 @@ struct nvme_ns {
692713 };
693714 return ret;
694715 }
695- struct nvme_ctrl *controllers () {
696- return nvme_subsystem_first_ctrl ($self);
697- }
698- struct nvme_ns *namespaces () {
699- return nvme_subsystem_first_ns ($self);
700- }
716+ %pythoncode %{
717+ def controllers (self):
718+ " " " Iterator over all controller objects" " "
719+ c = nvme_subsystem_first_ctrl (self)
720+ while c:
721+ yield c
722+ c = nvme_subsystem_next_ctrl (self, c)
723+ %}
724+ %pythoncode %{
725+ def namespaces (self):
726+ " " " Iterator over all namespace objects" " "
727+ ns = nvme_subsystem_first_ns (self)
728+ while ns:
729+ yield ns
730+ ns = nvme_subsystem_next_ns (self, ns)
731+ %}
701732 %immutable name;
702733 const char *name;
703734 %immutable host;
@@ -898,9 +929,14 @@ struct nvme_ns {
898929 };
899930 return ret;
900931 }
901- struct nvme_ns * namespaces () {
902- return nvme_ctrl_first_ns ($self);
903- }
932+ %pythoncode %{
933+ def namespaces (self):
934+ " " " Iterator over all namespace objects" " "
935+ ns = nvme_ctrl_first_ns (self)
936+ while ns:
937+ yield ns
938+ ns = nvme_ctrl_next_ns (self, ns)
939+ %}
904940}
905941
906942%{
0 commit comments