)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"6045f7cd5ada4e2ce35b5e9c90d4334a96e9a7d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6bb119b2_be25336b","updated":"2026-04-22 10:14:28.000000000","message":"12:04 \u003c Giaan\u003e cron2: wait do not proceed with #1635\n12:04 \u003c Giaan\u003e just found more","commit_id":"d8790f943f8387788a3e5af55c87a3d240120754"}],"src/openvpn/forward.c":[{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"ec5806e541e5936b57e01d8664cb68f22baa45af","unresolved":true,"context_lines":[{"line_number":2032,"context_line":""},{"line_number":2033,"context_line":"void"},{"line_number":2034,"context_line":"multi_io_process_flags(struct context *c, struct event_set *es, struct link_socket *sock, const unsigned int flags)"},{"line_number":2035,"context_line":"{"},{"line_number":2036,"context_line":"    unsigned int socket \u003d 0;"},{"line_number":2037,"context_line":"    unsigned int tuntap \u003d 0;"},{"line_number":2038,"context_line":"    static uintptr_t tun_shift \u003d TUN_SHIFT;"}],"source_content_type":"text/x-csrc","patch_set":5,"id":"7defcd1c_cc9f7cff","line":2035,"updated":"2026-06-12 18:05:08.000000000","message":"This function most definitely needs a comment to explain what it does, and where it is called from (here or in forward.h).","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"},{"author":{"_account_id":1000034,"name":"its_Giaan","display_name":"Gianmarco De Gregori","email":"gianmarco@mandelbit.com","username":"its_Giaan"},"change_message_id":"10e2cfb76a1b5f2114a28086b0032d61eafd6f07","unresolved":false,"context_lines":[{"line_number":2032,"context_line":""},{"line_number":2033,"context_line":"void"},{"line_number":2034,"context_line":"multi_io_process_flags(struct context *c, struct event_set *es, struct link_socket *sock, const unsigned int flags)"},{"line_number":2035,"context_line":"{"},{"line_number":2036,"context_line":"    unsigned int socket \u003d 0;"},{"line_number":2037,"context_line":"    unsigned int tuntap \u003d 0;"},{"line_number":2038,"context_line":"    static uintptr_t tun_shift \u003d TUN_SHIFT;"}],"source_content_type":"text/x-csrc","patch_set":5,"id":"32383fc8_4265d587","line":2035,"in_reply_to":"7defcd1c_cc9f7cff","updated":"2026-06-15 10:06:13.000000000","message":"Done","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"ec5806e541e5936b57e01d8664cb68f22baa45af","unresolved":true,"context_lines":[{"line_number":2129,"context_line":"/*"},{"line_number":2130,"context_line":" * This is the core I/O wait function, used for all I/O waits except"},{"line_number":2131,"context_line":" * for the top-level server sockets."},{"line_number":2132,"context_line":" */"},{"line_number":2133,"context_line":"void"},{"line_number":2134,"context_line":"io_wait(struct context *c, const unsigned int flags)"},{"line_number":2135,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":5,"id":"0a8e9c78_fb46a0ad","line":2132,"updated":"2026-06-12 18:05:08.000000000","message":"We need to extend this comment a bit - the fact that it deals with only one socket confuses me every time, and then I go \"git grep\" and read up on the callers.\n\nMaybe something like `it is either called from tunnel_point_to_point() (p2p mode) or with the per-client-context from multi_io.c` or something like that.","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"},{"author":{"_account_id":1000034,"name":"its_Giaan","display_name":"Gianmarco De Gregori","email":"gianmarco@mandelbit.com","username":"its_Giaan"},"change_message_id":"10e2cfb76a1b5f2114a28086b0032d61eafd6f07","unresolved":false,"context_lines":[{"line_number":2129,"context_line":"/*"},{"line_number":2130,"context_line":" * This is the core I/O wait function, used for all I/O waits except"},{"line_number":2131,"context_line":" * for the top-level server sockets."},{"line_number":2132,"context_line":" */"},{"line_number":2133,"context_line":"void"},{"line_number":2134,"context_line":"io_wait(struct context *c, const unsigned int flags)"},{"line_number":2135,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":5,"id":"86200023_d64fa367","line":2132,"in_reply_to":"0a8e9c78_fb46a0ad","updated":"2026-06-15 10:06:13.000000000","message":"Done","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"}],"src/openvpn/forward.h":[{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"ec5806e541e5936b57e01d8664cb68f22baa45af","unresolved":true,"context_lines":[{"line_number":75,"context_line":"void pre_select(struct context *c);"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"void process_io(struct context *c, struct link_socket *sock);"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"/**********************************************************************/"},{"line_number":81,"context_line":"/**"}],"source_content_type":"text/x-csrc","patch_set":5,"id":"29dd8fc7_d3d600d3","line":78,"updated":"2026-06-12 18:05:08.000000000","message":"can we have proper documentation comments here?","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"},{"author":{"_account_id":1000034,"name":"its_Giaan","display_name":"Gianmarco De Gregori","email":"gianmarco@mandelbit.com","username":"its_Giaan"},"change_message_id":"10e2cfb76a1b5f2114a28086b0032d61eafd6f07","unresolved":false,"context_lines":[{"line_number":75,"context_line":"void pre_select(struct context *c);"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"void process_io(struct context *c, struct link_socket *sock);"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"/**********************************************************************/"},{"line_number":81,"context_line":"/**"}],"source_content_type":"text/x-csrc","patch_set":5,"id":"b33923dd_b35dd207","line":78,"in_reply_to":"29dd8fc7_d3d600d3","updated":"2026-06-15 10:06:13.000000000","message":"Done","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"}],"src/openvpn/mudp.c":[{"author":{"_account_id":1000007,"name":"ordex","display_name":"Antonio Quartulli","email":"antonio@mandelbit.com","username":"ordex"},"change_message_id":"eed416709797a93ba5c0bb194d633edaa007a29c","unresolved":true,"context_lines":[{"line_number":338,"context_line":"void"},{"line_number":339,"context_line":"multi_process_io_udp(struct multi_context *m, struct link_socket *sock, unsigned int rwflags)"},{"line_number":340,"context_line":"{"},{"line_number":341,"context_line":"    const unsigned int status \u003d rwflags;"},{"line_number":342,"context_line":"    const unsigned int mpp_flags \u003d (MPP_PRE_SELECT | MPP_CLOSE_ON_SIGNAL);"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    /* UDP port ready to accept write */"}],"source_content_type":"text/x-csrc","patch_set":1,"id":"4b1334a4_3f3cffbb","line":341,"updated":"2026-04-21 14:57:45.000000000","message":"I think we can remove `status` and directly use `rwflags` throughout the function body?","commit_id":"cc274444c85755d82fc31cc1128366a273baf808"},{"author":{"_account_id":1000034,"name":"its_Giaan","display_name":"Gianmarco De Gregori","email":"gianmarco@mandelbit.com","username":"its_Giaan"},"change_message_id":"7c364b77cdf6a5aa655ff43b3710ed7655c3466f","unresolved":false,"context_lines":[{"line_number":338,"context_line":"void"},{"line_number":339,"context_line":"multi_process_io_udp(struct multi_context *m, struct link_socket *sock, unsigned int rwflags)"},{"line_number":340,"context_line":"{"},{"line_number":341,"context_line":"    const unsigned int status \u003d rwflags;"},{"line_number":342,"context_line":"    const unsigned int mpp_flags \u003d (MPP_PRE_SELECT | MPP_CLOSE_ON_SIGNAL);"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    /* UDP port ready to accept write */"}],"source_content_type":"text/x-csrc","patch_set":1,"id":"b423be31_f2681555","line":341,"in_reply_to":"4b1334a4_3f3cffbb","updated":"2026-04-21 15:20:38.000000000","message":"Done","commit_id":"cc274444c85755d82fc31cc1128366a273baf808"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"ec5806e541e5936b57e01d8664cb68f22baa45af","unresolved":true,"context_lines":[{"line_number":361,"context_line":" * a point-to-multipoint tunnel."},{"line_number":362,"context_line":" */"},{"line_number":363,"context_line":"unsigned int"},{"line_number":364,"context_line":"p2mp_iow_flags(const struct multi_context *m, struct link_socket *sock)"},{"line_number":365,"context_line":"{"},{"line_number":366,"context_line":"    unsigned int flags \u003d IOW_WAIT_SIGNAL;"},{"line_number":367,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":5,"id":"e3384f44_0cc9c3e9","line":364,"updated":"2026-06-12 18:05:08.000000000","message":"let\u0027s move this function to multi_io.c - this is the only place it\u0027s called from","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"},{"author":{"_account_id":1000034,"name":"its_Giaan","display_name":"Gianmarco De Gregori","email":"gianmarco@mandelbit.com","username":"its_Giaan"},"change_message_id":"10e2cfb76a1b5f2114a28086b0032d61eafd6f07","unresolved":false,"context_lines":[{"line_number":361,"context_line":" * a point-to-multipoint tunnel."},{"line_number":362,"context_line":" */"},{"line_number":363,"context_line":"unsigned int"},{"line_number":364,"context_line":"p2mp_iow_flags(const struct multi_context *m, struct link_socket *sock)"},{"line_number":365,"context_line":"{"},{"line_number":366,"context_line":"    unsigned int flags \u003d IOW_WAIT_SIGNAL;"},{"line_number":367,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":5,"id":"37b6bec0_fd604124","line":364,"in_reply_to":"e3384f44_0cc9c3e9","updated":"2026-06-15 10:06:13.000000000","message":"Done","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"ec5806e541e5936b57e01d8664cb68f22baa45af","unresolved":true,"context_lines":[{"line_number":372,"context_line":"            flags |\u003d IOW_TO_TUN;"},{"line_number":373,"context_line":"        }"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        if (LINK_OUT(\u0026m-\u003epending-\u003econtext) \u0026\u0026 m-\u003epending-\u003econtext.c2.link_sockets[0] \u003d\u003d sock)"},{"line_number":376,"context_line":"        {"},{"line_number":377,"context_line":"            flags |\u003d IOW_TO_LINK;"},{"line_number":378,"context_line":"        }"}],"source_content_type":"text/x-csrc","patch_set":5,"id":"6767bb95_e5e79af3","line":375,"updated":"2026-06-12 18:05:08.000000000","message":"I have my doubts about this change - IOW, I am not understanding this at all.\n\nWe call this function in a loop \"for all UDP sockets\", and then this part does nothing unless the socket passed in happens to be \"link_sockets[0]\".  This is really hard to understand code - and if link_sockets[0] happens to be a TCP socket, this does nothing at all.  No?\n\nIn any case this needs a comment :-) - if I can\u0027t understand it, how can we expect future maintainers to understand it.","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"},{"author":{"_account_id":1000034,"name":"its_Giaan","display_name":"Gianmarco De Gregori","email":"gianmarco@mandelbit.com","username":"its_Giaan"},"change_message_id":"10e2cfb76a1b5f2114a28086b0032d61eafd6f07","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            flags |\u003d IOW_TO_TUN;"},{"line_number":373,"context_line":"        }"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        if (LINK_OUT(\u0026m-\u003epending-\u003econtext) \u0026\u0026 m-\u003epending-\u003econtext.c2.link_sockets[0] \u003d\u003d sock)"},{"line_number":376,"context_line":"        {"},{"line_number":377,"context_line":"            flags |\u003d IOW_TO_LINK;"},{"line_number":378,"context_line":"        }"}],"source_content_type":"text/x-csrc","patch_set":5,"id":"83887180_78763e16","line":375,"in_reply_to":"6767bb95_e5e79af3","updated":"2026-06-15 10:06:13.000000000","message":"Done","commit_id":"6e690c619252e5d88271ace9b302f8abd626c965"}],"src/openvpn/multi_io.c":[{"author":{"_account_id":1000007,"name":"ordex","display_name":"Antonio Quartulli","email":"antonio@mandelbit.com","username":"ordex"},"change_message_id":"76de2f1f2c338d332f04e2b2932127fa58922df2","unresolved":true,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"            if ((m-\u003etop.options.mode \u003d\u003d MODE_SERVER) \u0026\u0026 proto_is_dgram(sock-\u003einfo.proto))"},{"line_number":179,"context_line":"            {"},{"line_number":180,"context_line":"                unsigned int flags \u003d"},{"line_number":181,"context_line":"                    p2mp_iow_flags(m, sock);"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"                multi_io_process_flags(\u0026m-\u003etop, m-\u003emulti_io-\u003ees, sock, flags);"}],"source_content_type":"text/x-csrc","patch_set":4,"id":"309711da_b4aa2afc","line":180,"updated":"2026-06-08 12:35:18.000000000","message":"not sure why we need to go to a new line here.","commit_id":"ba94f49bf8492ba5a9b6a8442181f233d5917d25"},{"author":{"_account_id":1000034,"name":"its_Giaan","display_name":"Gianmarco De Gregori","email":"gianmarco@mandelbit.com","username":"its_Giaan"},"change_message_id":"28efa3b88884ec57bd6d1e7d2e3fab3be1512d97","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"            if ((m-\u003etop.options.mode \u003d\u003d MODE_SERVER) \u0026\u0026 proto_is_dgram(sock-\u003einfo.proto))"},{"line_number":179,"context_line":"            {"},{"line_number":180,"context_line":"                unsigned int flags \u003d"},{"line_number":181,"context_line":"                    p2mp_iow_flags(m, sock);"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"                multi_io_process_flags(\u0026m-\u003etop, m-\u003emulti_io-\u003ees, sock, flags);"}],"source_content_type":"text/x-csrc","patch_set":4,"id":"e598761a_da17cde1","line":180,"in_reply_to":"309711da_b4aa2afc","updated":"2026-06-08 12:50:31.000000000","message":"Done","commit_id":"ba94f49bf8492ba5a9b6a8442181f233d5917d25"}]}
