<div dir="ltr">Hi Christian,<div><br></div><div>Upon adding the command success the assertion has been gone.</div><div><br></div><div>Here is the function snippet which I had written and its working fine.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">static void json_peer_channel_state(struct command *cmd, const char *buffer,</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                               </span>    const jsmntok_t *params)</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">{</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">     </span>struct json_result *response = new_json_result(cmd);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">      </span>jsmntok_t *idtok;</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap"> </span>char buf[100];</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">    </span>sqlite3_stmt *stmt;</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">       </span>int channel_state=-1;</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">     </span>if (!json_get_params(cmd, buffer, params,</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                 </span>     "id", &idtok,</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                       </span>     NULL)) {</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">          </span>return;</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">   </span>}</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap"> </span>memcpy(buf,buffer + idtok->start,idtok->end - idtok->start);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">     </span>buf[idtok->end - idtok->start]='\0';</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">        </span>printf("\n%s:%d:id:%s",__FUNCTION__,__LINE__,buf);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">      </span>stmt = db_prepare(cmd->ld->wallet->db,</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                                           </span>  "SELECT state"</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                                               </span>  " FROM channels"</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                                             </span>  " Where id IN "</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                                              </span>  " (SELECT id"</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                                                </span>  "  FROM peers"</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                                              </span>  "  WHERE lower(hex(node_id))=?);");</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap"> </span>sqlite3_bind_text(stmt, 1, buf, strlen(buf), SQLITE_TRANSIENT);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">   </span>while (sqlite3_step(stmt) != SQLITE_DONE) {</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">               </span>int i;</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">            </span>int num_cols = sqlite3_column_count(stmt);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                </span></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">          </span>for (i = 0; i < num_cols; i++)</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">         </span>{</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                 </span>switch (sqlite3_column_type(stmt, i))</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                     </span>{</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                 </span>case (SQLITE3_TEXT):</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                              </span>printf("%s, ", sqlite3_column_text(stmt, i));</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                           </span>break;</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                    </span>case (SQLITE_INTEGER):</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                            </span>channel_state=sqlite3_column_int(stmt, i);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                                </span>break;</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                    </span>case (SQLITE_FLOAT):</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                              </span>printf("%g, ", sqlite3_column_double(stmt, i));</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                         </span>break;</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                    </span>default:</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                          </span>break;</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">                    </span>}</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">         </span>}</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap"> </span>}</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap"> </span>sqlite3_finalize(stmt);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">   </span>json_object_start(response, NULL);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">        </span>json_add_num(response, "channel-state", channel_state);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap"> </span>json_object_end(response);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">        </span>command_success(cmd, response);</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">}</blockquote></blockquote><div><br></div><div>and is registered as follows:</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">static const struct json_command peer_channel_state = {</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">       </span>"peer-channel-state", </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap"> </span>json_peer_channel_state,</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="white-space:pre-wrap">  </span>"Find the state of the channel with the peer {id}"</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">};</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">AUTODATA(json_command, &peer_channel_state);</blockquote><div><br></div><div>Thank You.</div><div> </div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">Regards,<br>Sarat G<br><div><br></div><div><br></div></div></div><br></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Dec 13, 2018 at 5:29 PM Christian Decker <<a href="mailto:decker.christian@gmail.com">decker.christian@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Sarat,<br>
<br>
just to be sure, this is on an unmodified version of c-lightning, and<br>
`peer-channel-state` is implemented as a plugin with JSON-RPC<br>
passthrough?<br>
<br>
The assertion that is mentioned in the backtrace makes sure that we have<br>
acknowledged that the given JSON-RPC command is still pending, or was<br>
completed. The JSON-RPC passthrough correctly marks the incoming request<br>
as still pending after forwarding the request to the plugin here [1],<br>
and I can't see a way around it, hence my questions above.<br>
<br>
Cheers,<br>
Christian<br>
<br>
[1] <a href="https://github.com/ElementsProject/lightning/blob/master/lightningd/plugin.c#L688" rel="noreferrer" target="_blank">https://github.com/ElementsProject/lightning/blob/master/lightningd/plugin.c#L688</a><br>
<br>
Sarat G <<a href="mailto:sarath.ginjupalli89@gmail.com" target="_blank">sarath.ginjupalli89@gmail.com</a>> writes:<br>
> Hi  ZmnSCPxj,<br>
><br>
> Sorry for the late reply, I overlooked the mail. I'm implementing few of<br>
> the commands mentioned below:<br>
><br>
> 1. invoice-count:  Returns the count of the invoices<br>
> 2. delete-all-invoices: Deletes all the existing invoices<br>
> 3. peer-channel-state: Returns the state of the channel for the given<br>
> peer_id.<br>
><br>
> As mentioned by Christian, for the commands to which I don;t need to pass<br>
> arguments I was able to implement them successfully. But for implementing<br>
> the command 'peer-channel-state' I need to pass peer_id as parameter. when<br>
> I passed so the it's crashing in the lightningd.<br>
><br>
> Below is the crash log, while passing parameters do we need to handle them<br>
> at the lightningd?<br>
><br>
> root@sg777-1 ~/lightning/cli # ./lightning-cli peer-channel-state<br>
> "03943d572eb97ac78055cf4c708660228a60b2956fdcfeaaceba5551f98e92e727"lightningd:<br>
> lightningd/jsonrpc.c:480: parse_request: Assertion `c->pending'<br>
> failed.2018-12-13T03:07:34.086Z lightningd(14958): FATAL SIGNAL 6<br>
> RECEIVED2018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> lightningd/log.c:494 (log_crash)<br>
> 0x55a79691c9932018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> (null):0 ((null)) 0x7ffae5b3cf1f2018-12-13T03:07:34.103Z<br>
> lightningd(14958): backtrace: (null):0 ((null))<br>
> 0x7ffae5b3ce972018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> (null):0 ((null)) 0x7ffae5b3e8002018-12-13T03:07:34.103Z<br>
> lightningd(14958): backtrace: (null):0 ((null))<br>
> 0x7ffae5b2e3992018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> (null):0 ((null)) 0x7ffae5b2e4112018-12-13T03:07:34.103Z<br>
> lightningd(14958): backtrace: lightningd/jsonrpc.c:480 (parse_request)<br>
> 0x55a796918cba2018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> lightningd/jsonrpc.c:645 (read_json)<br>
> 0x55a79691954a2018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> ccan/ccan/io/io.c:59 (next_plan)<br>
> 0x55a79696c3002018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> ccan/ccan/io/io.c:387 (do_plan) 0x55a79696cdfd2018-12-13T03:07:34.103Z<br>
> lightningd(14958): backtrace: ccan/ccan/io/io.c:397 (io_ready)<br>
> 0x55a79696ce3b2018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> ccan/ccan/io/poll.c:310 (io_loop)<br>
> 0x55a79696e8032018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> lightningd/lightningd.c:407 (main)<br>
> 0x55a79691b0a12018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> (null):0 ((null)) 0x7ffae5b1fb962018-12-13T03:07:34.103Z<br>
> lightningd(14958): backtrace: (null):0 ((null))<br>
> 0x55a7969099392018-12-13T03:07:34.103Z lightningd(14958): backtrace:<br>
> (null):0 ((null)) 0xffffffffffffffff<br>
> Fatal signal 6. 0x55a79691ca91 log_crash<br>
>       lightningd/log.c:5200x7ffae5b3cf1f ???<br>
>       ???:00x7ffae5b3ce97 ???<br>
>       ???:00x7ffae5b3e800 ???<br>
>       ???:00x7ffae5b2e399 ???<br>
>       ???:00x7ffae5b2e411 ???<br>
>       ???:00x55a796918cba parse_request<br>
>       lightningd/jsonrpc.c:4800x55a79691954a read_json<br>
>       lightningd/jsonrpc.c:6450x55a79696c300 next_plan<br>
>       ccan/ccan/io/io.c:590x55a79696cdfd do_plan<br>
>       ccan/ccan/io/io.c:3870x55a79696ce3b io_ready<br>
>       ccan/ccan/io/io.c:3970x55a79696e803 io_loop<br>
>       ccan/ccan/io/poll.c:3100x55a79691b0a1 main<br>
>       lightningd/lightningd.c:4070x7ffae5b1fb96 ???<br>
>       ???:00x55a796909939 ???<br>
>       ???:00xffffffffffffffff ???<br>
>       ???:0<br>
> Log dumped in crash.log<br>
> lightning-cli: Non-object response ''[1]+  Aborted<br>
> (core dumped) ../lightningd/lightningd<br>
><br>
><br>
> Thank You.<br>
><br>
> Regards,<br>
> Sarat G<br>
><br>
><br>
><br>
><br>
> On Fri, Dec 7, 2018 at 12:50 PM ZmnSCPxj <<a href="mailto:ZmnSCPxj@protonmail.com" target="_blank">ZmnSCPxj@protonmail.com</a>> wrote:<br>
><br>
>> Good morning Sarat,<br>
>><br>
>> What are you querying on the database?<br>
>> If you find it useful, it might be that others find it useful, so it is<br>
>> best if you feed it back to us upstream what extra command you made.<br>
>> It might also be possible, as cdecker said, that, extra command can be<br>
>> built from existing commands, and so it is better to put in some plugin<br>
>> instead.<br>
>><br>
>> Regards,<br>
>> ZmnSCPxj<br>
>><br>
>><br>
>> Sent with ProtonMail <<a href="https://protonmail.com" rel="noreferrer" target="_blank">https://protonmail.com</a>> Secure Email.<br>
>><br>
>> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐<br>
>> On Friday, December 7, 2018 2:30 PM, Sarat G <<br>
>> <a href="mailto:sarath.ginjupalli89@gmail.com" target="_blank">sarath.ginjupalli89@gmail.com</a>> wrote:<br>
>><br>
>> Hi Christian,<br>
>><br>
>> Thank you very much for the help, now I'm able to add the commands<br>
>> successfully by registering it with AUTODATA. Since I'm running the<br>
>> customised queries on the database now I'm registering my methods with<br>
>> AUTODATA and doing.<br>
>><br>
>> Prior to this, I'm opening the `lightningd.sqlite3` file from the program.<br>
>> But the problem which I encountered is if I make an RPC call the DB gets<br>
>> locked and that sometimes preventing me to access the DB directly from the<br>
>> same process.<br>
>><br>
>> Anyways I written few queries and registered them with AUTODATA and there<br>
>> are working fine.<br>
>><br>
>> Thank you once again.<br>
>><br>
>> Regards,<br>
>> Sarat G<br>
>><br>
>><br>
>><br>
>><br>
>> On Thu, Dec 6, 2018 at 7:50 PM Christian Decker <<br>
>> <a href="mailto:decker.christian@gmail.com" target="_blank">decker.christian@gmail.com</a>> wrote:<br>
>><br>
>>> Hi Sarat,<br>
>>><br>
>>> `AUTODATA` will take care of registering the json command with the<br>
>>> JSON-RPC framework and you should be able to see your command with<br>
>>> `lightning-cli help` after recompiling and restarting. The `struct<br>
>>> json_command` that you registered with `AUTODATA` contains the method<br>
>>> name and the function to be called when a request matching that method<br>
>>> name comes in. The compiler should be able to help you with the<br>
>>> signature of the function that we expect.<br>
>>><br>
>>> Notice that if the information you require is exposed in some other way,<br>
>>> you can also write a plugin, instead. Plugins can be written in whatever<br>
>>> language you want, and can register options and JSON-RPC methods as well<br>
>>> (more to come in future). So if you don't need information that is not<br>
>>> otherwise exposed that might be a good option (you'd need to run the<br>
>>> unreleased `master` version though).<br>
>>><br>
>>> Cheers,<br>
>>> Christian<br>
>>><br>
>>> Sarat G <<a href="mailto:sarath.ginjupalli89@gmail.com" target="_blank">sarath.ginjupalli89@gmail.com</a>> writes:<br>
>>> > Hi,<br>
>>> ><br>
>>> > As part of my project requirement, i got to need the command that<br>
>>> returns<br>
>>> > the status of the channel by taking input as peer id. For that I<br>
>>> written up<br>
>>> > the necessary logic and lined it using AUTODATA. My doubt is on the<br>
>>> > lightningd side at which part do I need to add the logic to process the<br>
>>> > command information sent by the lightning-cli.<br>
>>> ><br>
>>> > Can someone please provide me some insights into adding a single<br>
>>> command to<br>
>>> > the lightning-cli repo.<br>
>>> ><br>
>>> > Thanks in advance.<br>
>>> ><br>
>>> > Regards,<br>
>>> > Sarat G<br>
>>> > --<br>
>>> > c-lightning mailing list<br>
>>> > <a href="mailto:c-lightning@lists.ozlabs.org" target="_blank">c-lightning@lists.ozlabs.org</a><br>
>>> > <a href="https://lists.ozlabs.org/listinfo/c-lightning" rel="noreferrer" target="_blank">https://lists.ozlabs.org/listinfo/c-lightning</a><br>
>>><br>
>><br>
>><br>
</blockquote></div>