<feed xmlns='http://www.w3.org/2005/Atom'>
<title>freeipa.git/install/migration/invalid.html, branch cachetickets</title>
<subtitle>FreeIPA patches</subtitle>
<link rel='alternate' type='text/html' href='https://fedorapeople.org/cgit/simo/public_git/freeipa.git/'/>
<entry>
<title>webui: apply PatternFly theme on migration pages</title>
<updated>2014-06-10T08:23:22+00:00</updated>
<author>
<name>Petr Vobornik</name>
<email>pvoborni@redhat.com</email>
</author>
<published>2014-03-31T13:55:12+00:00</published>
<link rel='alternate' type='text/html' href='https://fedorapeople.org/cgit/simo/public_git/freeipa.git/commit/?id=f0cf2e10d5ca6ce261c256288e2b6d15b23b1418'/>
<id>f0cf2e10d5ca6ce261c256288e2b6d15b23b1418</id>
<content type='text'>
https://fedorahosted.org/freeipa/ticket/4278

Reviewed-By: Endi Sukma Dewata &lt;edewata@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
https://fedorahosted.org/freeipa/ticket/4278

Reviewed-By: Endi Sukma Dewata &lt;edewata@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Forms based authentication UI</title>
<updated>2012-03-02T10:04:33+00:00</updated>
<author>
<name>Petr Voborník</name>
<email>pvoborni@redhat.com</email>
</author>
<published>2012-02-27T14:31:20+00:00</published>
<link rel='alternate' type='text/html' href='https://fedorapeople.org/cgit/simo/public_git/freeipa.git/commit/?id=368c624a7445f6d3a34993a3835026bb383506e4'/>
<id>368c624a7445f6d3a34993a3835026bb383506e4</id>
<content type='text'>
Support for forms based authentication was added to UI.

It consist of:

1) new login page
Page url is [ipa server]/ipa/ui/login.html

Page contains a login form. For authentication it sends ajax request at [ipa server]/session/json/login_password. If authentication is successfull page is redirected to [ipa server]/ipa/ui if it fails from whatever reason a message is shown.

2) new enhanced error dialog - authorization_dialog.

This dialog is displayed when user is not authorized to perform action - usually when ticket and session expires.
It is a standard error dialog which shows kerberos ticket related error message and newly offers (as a link) to use form based authentication. If user click on the link, the dialog content and buttons switch to login dialog which has same functionality as 'new login page'. User is able to return back to the error message by clicking on a back button.

login.html uses same css styles as migration page -&gt; ipa-migration.css was merged into ipa.css.

https://fedorahosted.org/freeipa/ticket/2450
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Support for forms based authentication was added to UI.

It consist of:

1) new login page
Page url is [ipa server]/ipa/ui/login.html

Page contains a login form. For authentication it sends ajax request at [ipa server]/session/json/login_password. If authentication is successfull page is redirected to [ipa server]/ipa/ui if it fails from whatever reason a message is shown.

2) new enhanced error dialog - authorization_dialog.

This dialog is displayed when user is not authorized to perform action - usually when ticket and session expires.
It is a standard error dialog which shows kerberos ticket related error message and newly offers (as a link) to use form based authentication. If user click on the link, the dialog content and buttons switch to login dialog which has same functionality as 'new login page'. User is able to return back to the error message by clicking on a back button.

login.html uses same css styles as migration page -&gt; ipa-migration.css was merged into ipa.css.

https://fedorahosted.org/freeipa/ticket/2450
</pre>
</div>
</content>
</entry>
<entry>
<title>Fixed inconsistent image names.</title>
<updated>2011-10-27T14:05:12+00:00</updated>
<author>
<name>Endi S. Dewata</name>
<email>edewata@redhat.com</email>
</author>
<published>2011-10-26T21:06:17+00:00</published>
<link rel='alternate' type='text/html' href='https://fedorapeople.org/cgit/simo/public_git/freeipa.git/commit/?id=52981883aba2a2ce7a0152c50ad94201f327f411'/>
<id>52981883aba2a2ce7a0152c50ad94201f327f411</id>
<content type='text'>
The images have been renamed to be more consistent and moved into
the "images" directory to mimic the original jQuery UI structure.

Ticket #1613
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The images have been renamed to be more consistent and moved into
the "images" directory to mimic the original jQuery UI structure.

Ticket #1613
</pre>
</div>
</content>
</entry>
<entry>
<title>Fixed: Duplicate CSS definitions</title>
<updated>2011-10-19T12:44:44+00:00</updated>
<author>
<name>Petr Vobornik</name>
<email>pvoborni@redhat.com</email>
</author>
<published>2011-10-11T07:42:35+00:00</published>
<link rel='alternate' type='text/html' href='https://fedorapeople.org/cgit/simo/public_git/freeipa.git/commit/?id=1dda03120e5873d231072468c5637c4718656ed3'/>
<id>1dda03120e5873d231072468c5637c4718656ed3</id>
<content type='text'>
https://fedorahosted.org/freeipa/ticket/1565

The ipa.css, ipa_error.css and ipa_migration.css contain some duplicate definitions which cause maintenance problems.

Additional changes:
* fixed whitespaces in ipa.css
* unified headings in config pages
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
https://fedorahosted.org/freeipa/ticket/1565

The ipa.css, ipa_error.css and ipa_migration.css contain some duplicate definitions which cause maintenance problems.

Additional changes:
* fixed whitespaces in ipa.css
* unified headings in config pages
</pre>
</div>
</content>
</entry>
<entry>
<title>Fixed links to images in config and migration pages</title>
<updated>2011-10-07T04:24:12+00:00</updated>
<author>
<name>Petr Vobornik</name>
<email>pvoborni@redhat.com</email>
</author>
<published>2011-10-06T12:30:26+00:00</published>
<link rel='alternate' type='text/html' href='https://fedorapeople.org/cgit/simo/public_git/freeipa.git/commit/?id=a0470afdcddcfcdade802b6cf04c43898f52421d'/>
<id>a0470afdcddcfcdade802b6cf04c43898f52421d</id>
<content type='text'>
https://fedorahosted.org/freeipa/ticket/1932

Description of problem:
Title is missing while configuring browser for the first time.

Actual results:
There is no title on this screen. I noticed it only on step 8 and later so I am not sure if title is also missing earlier at step 6 or not.

Expected results:
Title "Identity Management" is always present.

Fixed:
 * modified paths to images
 * fixed padding in ssbrowser.html
 * moved browser icons to ui folder
 * deleted unused images in html and migration folders (they are already in ui folder, and weren't deployed)

whitespaces
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
https://fedorahosted.org/freeipa/ticket/1932

Description of problem:
Title is missing while configuring browser for the first time.

Actual results:
There is no title on this screen. I noticed it only on step 8 and later so I am not sure if title is also missing earlier at step 6 or not.

Expected results:
Title "Identity Management" is always present.

Fixed:
 * modified paths to images
 * fixed padding in ssbrowser.html
 * moved browser icons to ui folder
 * deleted unused images in html and migration folders (they are already in ui folder, and weren't deployed)

whitespaces
</pre>
</div>
</content>
</entry>
<entry>
<title>Migration: don't assume there is only one naming context, add logging.</title>
<updated>2011-10-04T14:14:11+00:00</updated>
<author>
<name>Rob Crittenden</name>
<email>rcritten@redhat.com</email>
</author>
<published>2011-09-27T02:19:57+00:00</published>
<link rel='alternate' type='text/html' href='https://fedorapeople.org/cgit/simo/public_git/freeipa.git/commit/?id=30b29bd8e8a17d9a869b261f210854d6191572b8'/>
<id>30b29bd8e8a17d9a869b261f210854d6191572b8</id>
<content type='text'>
We can't assume that there will be only one naming context. Look at each
one until we find an IPA one.

Add logging so you can know that a migration attempt fails and why.

https://fedorahosted.org/freeipa/ticket/1834
https://fedorahosted.org/freeipa/ticket/1835
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
We can't assume that there will be only one naming context. Look at each
one until we find an IPA one.

Add logging so you can know that a migration attempt fails and why.

https://fedorahosted.org/freeipa/ticket/1834
https://fedorahosted.org/freeipa/ticket/1835
</pre>
</div>
</content>
</entry>
<entry>
<title>Main UI, migration, and html Style updates</title>
<updated>2011-01-25T21:46:59+00:00</updated>
<author>
<name>Kyle Baker</name>
<email>kybaker@redhat.com</email>
</author>
<published>2011-01-20T20:39:59+00:00</published>
<link rel='alternate' type='text/html' href='https://fedorapeople.org/cgit/simo/public_git/freeipa.git/commit/?id=02803be1ba39e7c9e642f9a45889d196ff3598dc'/>
<id>02803be1ba39e7c9e642f9a45889d196ff3598dc</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add DS migration plugin and password migration page.</title>
<updated>2010-01-20T21:54:17+00:00</updated>
<author>
<name>Pavel Zuna</name>
<email>pzuna@redhat.com</email>
</author>
<published>2010-01-12T15:40:09+00:00</published>
<link rel='alternate' type='text/html' href='https://fedorapeople.org/cgit/simo/public_git/freeipa.git/commit/?id=c15c1eee729e912f4f55c90861d4dd0be0bdd601'/>
<id>c15c1eee729e912f4f55c90861d4dd0be0bdd601</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
 id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
<a id='n425' href='#n425'>425</a>
<a id='n426' href='#n426'>426</a>
<a id='n427' href='#n427'>427</a>
<a id='n428' href='#n428'>428</a>
<a id='n429' href='#n429'>429</a>
<a id='n430' href='#n430'>430</a>
<a id='n431' href='#n431'>431</a>
<a id='n432' href='#n432'>432</a>
<a id='n433' href='#n433'>433</a>
<a id='n434' href='#n434'>434</a>
<a id='n435' href='#n435'>435</a>
<a id='n436' href='#n436'>436</a>
<a id='n437' href='#n437'>437</a>
<a id='n438' href='#n438'>438</a>
<a id='n439' href='#n439'>439</a>
<a id='n440' href='#n440'>440</a>
<a id='n441' href='#n441'>441</a>
<a id='n442' href='#n442'>442</a>
<a id='n443' href='#n443'>443</a>
<a id='n444' href='#n444'>444</a>
<a id='n445' href='#n445'>445</a>
<a id='n446' href='#n446'>446</a>
<a id='n447' href='#n447'>447</a>
<a id='n448' href='#n448'>448</a>
<a id='n449' href='#n449'>449</a>
<a id='n450' href='#n450'>450</a>
<a id='n451' href='#n451'>451</a>
<a id='n452' href='#n452'>452</a>
<a id='n453' href='#n453'>453</a>
<a id='n454' href='#n454'>454</a>
<a id='n455' href='#n455'>455</a>
<a id='n456' href='#n456'>456</a>
<a id='n457' href='#n457'>457</a>
<a id='n458' href='#n458'>458</a>
<a id='n459' href='#n459'>459</a>
<a id='n460' href='#n460'>460</a>
<a id='n461' href='#n461'>461</a>
<a id='n462' href='#n462'>462</a>
<a id='n463' href='#n463'>463</a>
<a id='n464' href='#n464'>464</a>
<a id='n465' href='#n465'>465</a>
<a id='n466' href='#n466'>466</a>
<a id='n467' href='#n467'>467</a>
<a id='n468' href='#n468'>468</a>
<a id='n469' href='#n469'>469</a>
<a id='n470' href='#n470'>470</a>
<a id='n471' href='#n471'>471</a>
<a id='n472' href='#n472'>472</a>
<a id='n473' href='#n473'>473</a>
<a id='n474' href='#n474'>474</a>
<a id='n475' href='#n475'>475</a>
<a id='n476' href='#n476'>476</a>
<a id='n477' href='#n477'>477</a>
<a id='n478' href='#n478'>478</a>
<a id='n479' href='#n479'>479</a>
<a id='n480' href='#n480'>480</a>
<a id='n481' href='#n481'>481</a>
<a id='n482' href='#n482'>482</a>
<a id='n483' href='#n483'>483</a>
<a id='n484' href='#n484'>484</a>
<a id='n485' href='#n485'>485</a>
<a id='n486' href='#n486'>486</a>
<a id='n487' href='#n487'>487</a>
<a id='n488' href='#n488'>488</a>
<a id='n489' href='#n489'>489</a>
<a id='n490' href='#n490'>490</a>
<a id='n491' href='#n491'>491</a>
<a id='n492' href='#n492'>492</a>
<a id='n493' href='#n493'>493</a>
<a id='n494' href='#n494'>494</a>
<a id='n495' href='#n495'>495</a>
<a id='n496' href='#n496'>496</a>
<a id='n497' href='#n497'>497</a>
<a id='n498' href='#n498'>498</a>
<a id='n499' href='#n499'>499</a>
<a id='n500' href='#n500'>500</a>
<a id='n501' href='#n501'>501</a>
<a id='n502' href='#n502'>502</a>
<a id='n503' href='#n503'>503</a>
<a id='n504' href='#n504'>504</a>
<a id='n505' href='#n505'>505</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
<a id='n517' href='#n517'>517</a>
<a id='n518' href='#n518'>518</a>
<a id='n519' href='#n519'>519</a>
<a id='n520' href='#n520'>520</a>
<a id='n521' href='#n521'>521</a>
<a id='n522' href='#n522'>522</a>
<a id='n523' href='#n523'>523</a>
<a id='n524' href='#n524'>524</a>
<a id='n525' href='#n525'>525</a>
<a id='n526' href='#n526'>526</a>
<a id='n527' href='#n527'>527</a>
<a id='n528' href='#n528'>528</a>
<a id='n529' href='#n529'>529</a>
<a id='n530' href='#n530'>530</a>
<a id='n531' href='#n531'>531</a>
<a id='n532' href='#n532'>532</a>
<a id='n533' href='#n533'>533</a>
<a id='n534' href='#n534'>534</a>
<a id='n535' href='#n535'>535</a>
<a id='n536' href='#n536'>536</a>
<a id='n537' href='#n537'>537</a>
<a id='n538' href='#n538'>538</a>
<a id='n539' href='#n539'>539</a>
<a id='n540' href='#n540'>540</a>
<a id='n541' href='#n541'>541</a>
<a id='n542' href='#n542'>542</a>
<a id='n543' href='#n543'>543</a>
<a id='n544' href='#n544'>544</a>
<a id='n545' href='#n545'>545</a>
<a id='n546' href='#n546'>546</a>
<a id='n547' href='#n547'>547</a>
<a id='n548' href='#n548'>548</a>
<a id='n549' href='#n549'>549</a>
<a id='n550' href='#n550'>550</a>
<a id='n551' href='#n551'>551</a>
<a id='n552' href='#n552'>552</a>
<a id='n553' href='#n553'>553</a>
<a id='n554' href='#n554'>554</a>
<a id='n555' href='#n555'>555</a>
<a id='n556' href='#n556'>556</a>
<a id='n557' href='#n557'>557</a>
<a id='n558' href='#n558'>558</a>
<a id='n559' href='#n559'>559</a>
<a id='n560' href='#n560'>560</a>
<a id='n561' href='#n561'>561</a>
<a id='n562' href='#n562'>562</a>
<a id='n563' href='#n563'>563</a>
<a id='n564' href='#n564'>564</a>
<a id='n565' href='#n565'>565</a>
<a id='n566' href='#n566'>566</a>
<a id='n567' href='#n567'>567</a>
<a id='n568' href='#n568'>568</a>
<a id='n569' href='#n569'>569</a>
<a id='n570' href='#n570'>570</a>
<a id='n571' href='#n571'>571</a>
<a id='n572' href='#n572'>572</a>
<a id='n573' href='#n573'>573</a>
<a id='n574' href='#n574'>574</a>
<a id='n575' href='#n575'>575</a>
<a id='n576' href='#n576'>576</a>
<a id='n577' href='#n577'>577</a>
<a id='n578' href='#n578'>578</a>
<a id='n579' href='#n579'>579</a>
<a id='n580' href='#n580'>580</a>
<a id='n581' href='#n581'>581</a>
<a id='n582' href='#n582'>582</a>
<a id='n583' href='#n583'>583</a>
<a id='n584' href='#n584'>584</a>
<a id='n585' href='#n585'>585</a>
<a id='n586' href='#n586'>586</a>
<a id='n587' href='#n587'>587</a>
<a id='n588' href='#n588'>588</a>
<a id='n589' href='#n589'>589</a>
<a id='n590' href='#n590'>590</a>
<a id='n591' href='#n591'>591</a>
<a id='n592' href='#n592'>592</a>
<a id='n593' href='#n593'>593</a>
<a id='n594' href='#n594'>594</a>
<a id='n595' href='#n595'>595</a>
<a id='n596' href='#n596'>596</a>
<a id='n597' href='#n597'>597</a>
<a id='n598' href='#n598'>598</a>
<a id='n599' href='#n599'>599</a>
<a id='n600' href='#n600'>600</a>
<a id='n601' href='#n601'>601</a>
<a id='n602' href='#n602'>602</a>
<a id='n603' href='#n603'>603</a>
<a id='n604' href='#n604'>604</a>
<a id='n605' href='#n605'>605</a>
<a id='n606' href='#n606'>606</a>
<a id='n607' href='#n607'>607</a>
<a id='n608' href='#n608'>608</a>
<a id='n609' href='#n609'>609</a>
<a id='n610' href='#n610'>610</a>
<a id='n611' href='#n611'>611</a>
<a id='n612' href='#n612'>612</a>
<a id='n613' href='#n613'>613</a>
<a id='n614' href='#n614'>614</a>
<a id='n615' href='#n615'>615</a>
<a id='n616' href='#n616'>616</a>
<a id='n617' href='#n617'>617</a>
<a id='n618' href='#n618'>618</a>
<a id='n619' href='#n619'>619</a>
<a id='n620' href='#n620'>620</a>
<a id='n621' href='#n621'>621</a>
<a id='n622' href='#n622'>622</a>
<a id='n623' href='#n623'>623</a>
<a id='n624' href='#n624'>624</a>
<a id='n625' href='#n625'>625</a>
<a id='n626' href='#n626'>626</a>
<a id='n627' href='#n627'>627</a>
<a id='n628' href='#n628'>628</a>
<a id='n629' href='#n629'>629</a>
<a id='n630' href='#n630'>630</a>
<a id='n631' href='#n631'>631</a>
<a id='n632' href='#n632'>632</a>
<a id='n633' href='#n633'>633</a>
<a id='n634' href='#n634'>634</a>
<a id='n635' href='#n635'>635</a>
<a id='n636' href='#n636'>636</a>
<a id='n637' href='#n637'>637</a>
<a id='n638' href='#n638'>638</a>
<a id='n639' href='#n639'>639</a>
<a id='n640' href='#n640'>640</a>
<a id='n641' href='#n641'>641</a>
<a id='n642' href='#n642'>642</a>
<a id='n643' href='#n643'>643</a>
<a id='n644' href='#n644'>644</a>
<a id='n645' href='#n645'>645</a>
<a id='n646' href='#n646'>646</a>
<a id='n647' href='#n647'>647</a>
<a id='n648' href='#n648'>648</a>
<a id='n649' href='#n649'>649</a>
<a id='n650' href='#n650'>650</a>
<a id='n651' href='#n651'>651</a>
<a id='n652' href='#n652'>652</a>
<a id='n653' href='#n653'>653</a>
<a id='n654' href='#n654'>654</a>
<a id='n655' href='#n655'>655</a>
<a id='n656' href='#n656'>656</a>
<a id='n657' href='#n657'>657</a>
<a id='n658' href='#n658'>658</a>
<a id='n659' href='#n659'>659</a>
<a id='n660' href='#n660'>660</a>
<a id='n661' href='#n661'>661</a>
<a id='n662' href='#n662'>662</a>
<a id='n663' href='#n663'>663</a>
<a id='n664' href='#n664'>664</a>
<a id='n665' href='#n665'>665</a>
<a id='n666' href='#n666'>666</a>
<a id='n667' href='#n667'>667</a>
<a id='n668' href='#n668'>668</a>
<a id='n669' href='#n669'>669</a>
<a id='n670' href='#n670'>670</a>
<a id='n671' href='#n671'>671</a>
<a id='n672' href='#n672'>672</a>
<a id='n673' href='#n673'>673</a>
<a id='n674' href='#n674'>674</a>
<a id='n675' href='#n675'>675</a>
<a id='n676' href='#n676'>676</a>
<a id='n677' href='#n677'>677</a>
<a id='n678' href='#n678'>678</a>
<a id='n679' href='#n679'>679</a>
<a id='n680' href='#n680'>680</a>
<a id='n681' href='#n681'>681</a>
<a id='n682' href='#n682'>682</a>
<a id='n683' href='#n683'>683</a>
<a id='n684' href='#n684'>684</a>
<a id='n685' href='#n685'>685</a>
<a id='n686' href='#n686'>686</a>
<a id='n687' href='#n687'>687</a>
<a id='n688' href='#n688'>688</a>
<a id='n689' href='#n689'>689</a>
<a id='n690' href='#n690'>690</a>
<a id='n691' href='#n691'>691</a>
<a id='n692' href='#n692'>692</a>
<a id='n693' href='#n693'>693</a>
<a id='n694' href='#n694'>694</a>
<a id='n695' href='#n695'>695</a>
<a id='n696' href='#n696'>696</a>
<a id='n697' href='#n697'>697</a>
<a id='n698' href='#n698'>698</a>
<a id='n699' href='#n699'>699</a>
<a id='n700' href='#n700'>700</a>
<a id='n701' href='#n701'>701</a>
<a id='n702' href='#n702'>702</a>
<a id='n703' href='#n703'>703</a>
<a id='n704' href='#n704'>704</a>
<a id='n705' href='#n705'>705</a>
<a id='n706' href='#n706'>706</a>
<a id='n707' href='#n707'>707</a>
<a id='n708' href='#n708'>708</a>
<a id='n709' href='#n709'>709</a>
<a id='n710' href='#n710'>710</a>
<a id='n711' href='#n711'>711</a>
<a id='n712' href='#n712'>712</a>
<a id='n713' href='#n713'>713</a>
<a id='n714' href='#n714'>714</a>
<a id='n715' href='#n715'>715</a>
<a id='n716' href='#n716'>716</a>
<a id='n717' href='#n717'>717</a>
<a id='n718' href='#n718'>718</a>
<a id='n719' href='#n719'>719</a>
<a id='n720' href='#n720'>720</a>
<a id='n721' href='#n721'>721</a>
<a id='n722' href='#n722'>722</a>
<a id='n723' href='#n723'>723</a>
<a id='n724' href='#n724'>724</a>
<a id='n725' href='#n725'>725</a>
<a id='n726' href='#n726'>726</a>
<a id='n727' href='#n727'>727</a>
<a id='n728' href='#n728'>728</a>
<a id='n729' href='#n729'>729</a>
<a id='n730' href='#n730'>730</a>
<a id='n731' href='#n731'>731</a>
<a id='n732' href='#n732'>732</a>
<a id='n733' href='#n733'>733</a>
<a id='n734' href='#n734'>734</a>
<a id='n735' href='#n735'>735</a>
<a id='n736' href='#n736'>736</a>
<a id='n737' href='#n737'>737</a>
<a id='n738' href='#n738'>738</a>
<a id='n739' href='#n739'>739</a>
<a id='n740' href='#n740'>740</a>
<a id='n741' href='#n741'>741</a>
<a id='n742' href='#n742'>742</a>
<a id='n743' href='#n743'>743</a>
<a id='n744' href='#n744'>744</a>
<a id='n745' href='#n745'>745</a>
<a id='n746' href='#n746'>746</a>
<a id='n747' href='#n747'>747</a>
<a id='n748' href='#n748'>748</a>
<a id='n749' href='#n749'>749</a>
<a id='n750' href='#n750'>750</a>
<a id='n751' href='#n751'>751</a>
<a id='n752' href='#n752'>752</a>
<a id='n753' href='#n753'>753</a>
<a id='n754' href='#n754'>754</a>
<a id='n755' href='#n755'>755</a>
<a id='n756' href='#n756'>756</a>
<a id='n757' href='#n757'>757</a>
<a id='n758' href='#n758'>758</a>
</pre></td>
<td class='lines'><pre><code><span class="hl com">/*</span>
<span class="hl com">    Authors:</span>
<span class="hl com">        Simo Sorce &lt;ssorce&#64;redhat.com&gt;</span>
<span class="hl com">        Stephen Gallagher &lt;sgallagh&#64;redhat.com&gt;</span>
<span class="hl com"></span>
<span class="hl com">    Copyright (C) 2009 Red Hat</span>
<span class="hl com"></span>
<span class="hl com">    This program is free software; you can redistribute it and/or modify</span>
<span class="hl com">    it under the terms of the GNU General Public License as published by</span>
<span class="hl com">    the Free Software Foundation; either version 3 of the License, or</span>
<span class="hl com">    (at your option) any later version.</span>
<span class="hl com"></span>
<span class="hl com">    This program is distributed in the hope that it will be useful,</span>
<span class="hl com">    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="hl com">    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<span class="hl com">    GNU General Public License for more details.</span>
<span class="hl com"></span>
<span class="hl com">    You should have received a copy of the GNU General Public License</span>
<span class="hl com">    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="hl com">*/</span>

<span class="hl ppc">#include &lt;sys/time.h&gt;</span>
<span class="hl ppc">#include</span> <span class="hl pps">&quot;util/util.h&quot;</span><span class="hl ppc"></span>
<span class="hl ppc">#include</span> <span class="hl pps">&quot;dbus/dbus.h&quot;</span><span class="hl ppc"></span>
<span class="hl ppc">#include</span> <span class="hl pps">&quot;sbus/sssd_dbus.h&quot;</span><span class="hl ppc"></span>
<span class="hl ppc">#include</span> <span class="hl pps">&quot;sbus/sssd_dbus_private.h&quot;</span><span class="hl ppc"></span>

<span class="hl com">/* Types */</span>
<span class="hl kwb">struct</span> dbus_ctx_list<span class="hl opt">;</span>

<span class="hl kwb">struct</span> sbus_interface_p <span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_interface_p <span class="hl opt">*</span>prev<span class="hl opt">, *</span>next<span class="hl opt">;</span>
    <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">;</span>
    <span class="hl kwb">struct</span> sbus_interface <span class="hl opt">*</span>intf<span class="hl opt">;</span>
<span class="hl opt">};</span>

<span class="hl kwb">static bool</span> <span class="hl kwd">path_in_interface_list</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_interface_p <span class="hl opt">*</span>list<span class="hl opt">,</span>
                                   <span class="hl kwb">const char</span> <span class="hl opt">*</span>path<span class="hl opt">);</span>
<span class="hl kwb">static void</span> <span class="hl kwd">sbus_unreg_object_paths</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">);</span>

<span class="hl kwb">static int</span> <span class="hl kwd">sbus_auto_reconnect</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">);</span>

<span class="hl kwb">static void</span> <span class="hl kwd">sbus_dispatch</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tevent_context <span class="hl opt">*</span>ev<span class="hl opt">,</span>
                          <span class="hl kwb">struct</span> tevent_timer <span class="hl opt">*</span>te<span class="hl opt">,</span>
                          <span class="hl kwb">struct</span> timeval tv<span class="hl opt">,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> tevent_timer <span class="hl opt">*</span>new_event<span class="hl opt">;</span>
    <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">;</span>
    DBusConnection <span class="hl opt">*</span>dbus_conn<span class="hl opt">;</span>
    <span class="hl kwb">int</span> ret<span class="hl opt">;</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span>data <span class="hl opt">==</span> NULL<span class="hl opt">)</span> <span class="hl kwa">return</span><span class="hl opt">;</span>

    conn <span class="hl opt">=</span> <span class="hl kwd">talloc_get_type</span><span class="hl opt">(</span>data<span class="hl opt">,</span> <span class="hl kwb">struct</span> sbus_connection<span class="hl opt">);</span>

    dbus_conn <span class="hl opt">=</span> conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">;</span>
    <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">9</span><span class="hl opt">, (</span><span class="hl str">&quot;dbus conn:</span> <span class="hl ipl">%l</span><span class="hl str">X</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> dbus_conn<span class="hl opt">));</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>retries <span class="hl opt">&gt;</span> <span class="hl num">0</span><span class="hl opt">) {</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">6</span><span class="hl opt">, (</span><span class="hl str">&quot;SBUS is reconnecting. Deferring.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl com">/* Currently trying to reconnect, defer dispatch for 30ms */</span>
        tv <span class="hl opt">=</span> <span class="hl kwd">tevent_timeval_current_ofs</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,</span> <span class="hl num">30</span><span class="hl opt">);</span>
        new_event <span class="hl opt">=</span> <span class="hl kwd">tevent_add_timer</span><span class="hl opt">(</span>ev<span class="hl opt">,</span> conn<span class="hl opt">,</span> tv<span class="hl opt">,</span> sbus_dispatch<span class="hl opt">,</span> conn<span class="hl opt">);</span>
        <span class="hl kwa">if</span> <span class="hl opt">(</span>new_event <span class="hl opt">==</span> NULL<span class="hl opt">) {</span>
            <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,(</span><span class="hl str">&quot;Could not defer dispatch!</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl opt">}</span>
        <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">if</span> <span class="hl opt">((!</span><span class="hl kwd">dbus_connection_get_is_connected</span><span class="hl opt">(</span>dbus_conn<span class="hl opt">)) &amp;&amp;</span>
        <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>max_retries <span class="hl opt">!=</span> <span class="hl num">0</span><span class="hl opt">)) {</span>
        <span class="hl com">/* Attempt to reconnect automatically */</span>
        ret <span class="hl opt">=</span> <span class="hl kwd">sbus_auto_reconnect</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>
        <span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">==</span> EOK<span class="hl opt">) {</span>
            <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">, (</span><span class="hl str">&quot;Performing auto-reconnect</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
            <span class="hl kwa">return</span><span class="hl opt">;</span>
        <span class="hl opt">}</span>

        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">, (</span><span class="hl str">&quot;Cannot start auto-reconnection.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        conn<span class="hl opt">-&gt;</span><span class="hl kwd">reconnect_callback</span><span class="hl opt">(</span>conn<span class="hl opt">,</span>
                                 SBUS_RECONNECT_ERROR<span class="hl opt">,</span>
                                 conn<span class="hl opt">-&gt;</span>reconnect_pvt<span class="hl opt">);</span>
        <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">if</span> <span class="hl opt">((</span>conn<span class="hl opt">-&gt;</span>disconnect<span class="hl opt">) ||</span>
        <span class="hl opt">(!</span><span class="hl kwd">dbus_connection_get_is_connected</span><span class="hl opt">(</span>dbus_conn<span class="hl opt">))) {</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">3</span><span class="hl opt">,(</span><span class="hl str">&quot;Connection is not open for dispatching.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl com">/*</span>
<span class="hl com">         * Free the connection object.</span>
<span class="hl com">         * This will invoke the destructor for the connection</span>
<span class="hl com">         */</span>
        <span class="hl kwd">talloc_free</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>
        conn <span class="hl opt">=</span> NULL<span class="hl opt">;</span>
        <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl com">/* Dispatch only once each time through the mainloop to avoid</span>
<span class="hl com">     * starving other features</span>
<span class="hl com">     */</span>
    ret <span class="hl opt">=</span> <span class="hl kwd">dbus_connection_get_dispatch_status</span><span class="hl opt">(</span>dbus_conn<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">!=</span> DBUS_DISPATCH_COMPLETE<span class="hl opt">) {</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">9</span><span class="hl opt">,(</span><span class="hl str">&quot;Dispatching.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl kwd">dbus_connection_dispatch</span><span class="hl opt">(</span>dbus_conn<span class="hl opt">);</span>
    <span class="hl opt">}</span>

    <span class="hl com">/* If other dispatches are waiting, queue up the dispatch function</span>
<span class="hl com">     * for the next loop.</span>
<span class="hl com">     */</span>
    ret <span class="hl opt">=</span> <span class="hl kwd">dbus_connection_get_dispatch_status</span><span class="hl opt">(</span>dbus_conn<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">!=</span> DBUS_DISPATCH_COMPLETE<span class="hl opt">) {</span>
        new_event <span class="hl opt">=</span> <span class="hl kwd">tevent_add_timer</span><span class="hl opt">(</span>ev<span class="hl opt">,</span> conn<span class="hl opt">,</span> tv<span class="hl opt">,</span> sbus_dispatch<span class="hl opt">,</span> conn<span class="hl opt">);</span>
        <span class="hl kwa">if</span> <span class="hl opt">(</span>new_event <span class="hl opt">==</span> NULL<span class="hl opt">) {</span>
            <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">2</span><span class="hl opt">,(</span><span class="hl str">&quot;Could not add dispatch event!</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>

            <span class="hl com">/* TODO: Calling exit here is bad */</span>
            <span class="hl kwd">exit</span><span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">);</span>
        <span class="hl opt">}</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl com">/* dbus_connection_wakeup_main</span>
<span class="hl com"> * D-BUS makes a callback to the wakeup_main function when</span>
<span class="hl com"> * it has data available for dispatching.</span>
<span class="hl com"> * In order to avoid blocking, this function will create a now()</span>
<span class="hl com"> * timed event to perform the dispatch during the next iteration</span>
<span class="hl com"> * through the mainloop</span>
<span class="hl com"> */</span>
<span class="hl kwb">static void</span> <span class="hl kwd">sbus_conn_wakeup_main</span><span class="hl opt">(</span><span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">;</span>
    <span class="hl kwb">struct</span> timeval tv<span class="hl opt">;</span>
    <span class="hl kwb">struct</span> tevent_timer <span class="hl opt">*</span>te<span class="hl opt">;</span>

    conn <span class="hl opt">=</span> <span class="hl kwd">talloc_get_type</span><span class="hl opt">(</span>data<span class="hl opt">,</span> <span class="hl kwb">struct</span> sbus_connection<span class="hl opt">);</span>

    tv <span class="hl opt">=</span> <span class="hl kwd">tevent_timeval_current</span><span class="hl opt">();</span>

    <span class="hl com">/* D-BUS calls this function when it is time to do a dispatch */</span>
    te <span class="hl opt">=</span> <span class="hl kwd">tevent_add_timer</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>ev<span class="hl opt">,</span> conn<span class="hl opt">,</span> tv<span class="hl opt">,</span> sbus_dispatch<span class="hl opt">,</span> conn<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>te <span class="hl opt">==</span> NULL<span class="hl opt">) {</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">2</span><span class="hl opt">,(</span><span class="hl str">&quot;Could not add dispatch event!</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl com">/* TODO: Calling exit here is bad */</span>
        <span class="hl kwd">exit</span><span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwb">static int</span> <span class="hl kwd">sbus_conn_set_fns</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">);</span>

<span class="hl com">/*</span>
<span class="hl com"> * integrate_connection_with_event_loop</span>
<span class="hl com"> * Set up a D-BUS connection to use the libevents mainloop</span>
<span class="hl com"> * for handling file descriptor and timed events</span>
<span class="hl com"> */</span>
<span class="hl kwb">int</span> <span class="hl kwd">sbus_init_connection</span><span class="hl opt">(</span>TALLOC_CTX <span class="hl opt">*</span>ctx<span class="hl opt">,</span>
                         <span class="hl kwb">struct</span> tevent_context <span class="hl opt">*</span>ev<span class="hl opt">,</span>
                         DBusConnection <span class="hl opt">*</span>dbus_conn<span class="hl opt">,</span>
                         <span class="hl kwb">struct</span> sbus_interface <span class="hl opt">*</span>intf<span class="hl opt">,</span>
                         <span class="hl kwb">int</span> connection_type<span class="hl opt">,</span>
                         <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">**</span>_conn<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">;</span>
    <span class="hl kwb">int</span> ret<span class="hl opt">;</span>

    <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">5</span><span class="hl opt">,(</span><span class="hl str">&quot;Adding connection</span> <span class="hl ipl">%l</span><span class="hl str">X</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> dbus_conn<span class="hl opt">));</span>
    conn <span class="hl opt">=</span> <span class="hl kwd">talloc_zero</span><span class="hl opt">(</span>ctx<span class="hl opt">,</span> <span class="hl kwb">struct</span> sbus_connection<span class="hl opt">);</span>

    conn<span class="hl opt">-&gt;</span>ev <span class="hl opt">=</span> ev<span class="hl opt">;</span>
    conn<span class="hl opt">-&gt;</span>type <span class="hl opt">=</span> SBUS_CONNECTION<span class="hl opt">;</span>
    conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn <span class="hl opt">=</span> dbus_conn<span class="hl opt">;</span>
    conn<span class="hl opt">-&gt;</span>connection_type <span class="hl opt">=</span> connection_type<span class="hl opt">;</span>

    ret <span class="hl opt">=</span> <span class="hl kwd">sbus_conn_add_interface</span><span class="hl opt">(</span>conn<span class="hl opt">,</span> intf<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">!=</span> EOK<span class="hl opt">) {</span>
        <span class="hl kwd">talloc_free</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>
        <span class="hl kwa">return</span> ret<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    ret <span class="hl opt">=</span> <span class="hl kwd">sbus_conn_set_fns</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">!=</span> EOK<span class="hl opt">) {</span>
        <span class="hl kwd">talloc_free</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>
        <span class="hl kwa">return</span> ret<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl opt">*</span>_conn <span class="hl opt">=</span> conn<span class="hl opt">;</span>
    <span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static int</span> <span class="hl kwd">sbus_conn_set_fns</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">)</span>
<span class="hl opt">{</span>
    dbus_bool_t dbret<span class="hl opt">;</span>

    <span class="hl com">/*</span>
<span class="hl com">     * Set the default destructor</span>
<span class="hl com">     * Connections can override this with</span>
<span class="hl com">     * sbus_conn_set_destructor</span>
<span class="hl com">     */</span>
    <span class="hl kwd">sbus_conn_set_destructor</span><span class="hl opt">(</span>conn<span class="hl opt">,</span> NULL<span class="hl opt">);</span>

    <span class="hl com">/* Set up DBusWatch functions */</span>
    dbret <span class="hl opt">=</span> <span class="hl kwd">dbus_connection_set_watch_functions</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                                sbus_add_watch<span class="hl opt">,</span>
                                                sbus_remove_watch<span class="hl opt">,</span>
                                                sbus_toggle_watch<span class="hl opt">,</span>
                                                conn<span class="hl opt">,</span> NULL<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>dbret<span class="hl opt">) {</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">2</span><span class="hl opt">,(</span><span class="hl str">&quot;Error setting up D-BUS connection watch functions</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl kwa">return</span> EIO<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl com">/* Set up DBusTimeout functions */</span>
    dbret <span class="hl opt">=</span> <span class="hl kwd">dbus_connection_set_timeout_functions</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                                  sbus_add_timeout<span class="hl opt">,</span>
                                                  sbus_remove_timeout<span class="hl opt">,</span>
                                                  sbus_toggle_timeout<span class="hl opt">,</span>
                                                  conn<span class="hl opt">,</span> NULL<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>dbret<span class="hl opt">) {</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">2</span><span class="hl opt">,(</span><span class="hl str">&quot;Error setting up D-BUS server timeout functions</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl com">/* FIXME: free resources ? */</span>
        <span class="hl kwa">return</span> EIO<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl com">/* Set up dispatch handler */</span>
    <span class="hl kwd">dbus_connection_set_wakeup_main_function</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                             sbus_conn_wakeup_main<span class="hl opt">,</span>
                                             conn<span class="hl opt">,</span> NULL<span class="hl opt">);</span>

    <span class="hl com">/* Set up any method_contexts passed in */</span>

    <span class="hl com">/* Attempt to dispatch immediately in case of opportunistic</span>
<span class="hl com">     * services connecting before the handlers were all up.</span>
<span class="hl com">     * If there are no messages to be dispatched, this will do</span>
<span class="hl com">     * nothing.</span>
<span class="hl com">     */</span>
    <span class="hl kwd">sbus_conn_wakeup_main</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>

    <span class="hl kwa">return</span> EOK<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">int</span> <span class="hl kwd">sbus_new_connection</span><span class="hl opt">(</span>TALLOC_CTX <span class="hl opt">*</span>ctx<span class="hl opt">,</span> <span class="hl kwb">struct</span> tevent_context <span class="hl opt">*</span>ev<span class="hl opt">,</span>
                        <span class="hl kwb">const char</span> <span class="hl opt">*</span>address<span class="hl opt">,</span> <span class="hl kwb">struct</span> sbus_interface <span class="hl opt">*</span>intf<span class="hl opt">,</span>
                        <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">**</span>_conn<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">;</span>
    DBusConnection <span class="hl opt">*</span>dbus_conn<span class="hl opt">;</span>
    DBusError dbus_error<span class="hl opt">;</span>
    <span class="hl kwb">int</span> ret<span class="hl opt">;</span>

    <span class="hl kwd">dbus_error_init</span><span class="hl opt">(&amp;</span>dbus_error<span class="hl opt">);</span>

    <span class="hl com">/* Open a shared D-BUS connection to the address */</span>
    dbus_conn <span class="hl opt">=</span> <span class="hl kwd">dbus_connection_open</span><span class="hl opt">(</span>address<span class="hl opt">, &amp;</span>dbus_error<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>dbus_conn<span class="hl opt">) {</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">, (</span><span class="hl str">&quot;Failed to open connection: name=</span><span class="hl ipl">%s</span><span class="hl str">, message=</span><span class="hl ipl">%s</span><span class="hl str"></span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
                dbus_error<span class="hl opt">.</span>name<span class="hl opt">,</span> dbus_error<span class="hl opt">.</span>message<span class="hl opt">));</span>
        <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">dbus_error_is_set</span><span class="hl opt">(&amp;</span>dbus_error<span class="hl opt">))</span> <span class="hl kwd">dbus_error_free</span><span class="hl opt">(&amp;</span>dbus_error<span class="hl opt">);</span>
        <span class="hl kwa">return</span> EIO<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    ret <span class="hl opt">=</span> <span class="hl kwd">sbus_init_connection</span><span class="hl opt">(</span>ctx<span class="hl opt">,</span> ev<span class="hl opt">,</span> dbus_conn<span class="hl opt">,</span> intf<span class="hl opt">,</span>
                               SBUS_CONN_TYPE_SHARED<span class="hl opt">, &amp;</span>conn<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">!=</span> EOK<span class="hl opt">) {</span>
        <span class="hl com">/* FIXME: release resources */</span>
    <span class="hl opt">}</span>

    <span class="hl com">/* Store the address for later reconnection */</span>
    conn<span class="hl opt">-&gt;</span>address <span class="hl opt">=</span> <span class="hl kwd">talloc_strdup</span><span class="hl opt">(</span>conn<span class="hl opt">,</span> address<span class="hl opt">);</span>

    <span class="hl kwd">dbus_connection_set_exit_on_disconnect</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span> FALSE<span class="hl opt">);</span>

    <span class="hl opt">*</span>_conn <span class="hl opt">=</span> conn<span class="hl opt">;</span>
    <span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl com">/*</span>
<span class="hl com"> * sbus_conn_set_destructor</span>
<span class="hl com"> * Configures a callback to clean up this connection when it</span>
<span class="hl com"> * is finalized.</span>
<span class="hl com"> * &#64;param conn The sbus_connection created</span>
<span class="hl com"> * when this connection was established</span>
<span class="hl com"> * &#64;param destructor The destructor function that should be</span>
<span class="hl com"> * called when the connection is finalized. If passed NULL,</span>
<span class="hl com"> * this will reset the connection to the default destructor.</span>
<span class="hl com"> */</span>
<span class="hl kwb">void</span> <span class="hl kwd">sbus_conn_set_destructor</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">,</span>
                              sbus_conn_destructor_fn destructor<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>conn<span class="hl opt">)</span> <span class="hl kwa">return</span><span class="hl opt">;</span>

    conn<span class="hl opt">-&gt;</span>destructor <span class="hl opt">=</span> destructor<span class="hl opt">;</span>
    <span class="hl com">/* TODO: Should we try to handle the talloc_destructor too? */</span>
<span class="hl opt">}</span>

<span class="hl kwb">int</span> <span class="hl kwd">sbus_default_connection_destructor</span><span class="hl opt">(</span><span class="hl kwb">void</span> <span class="hl opt">*</span>ctx<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">;</span>
    conn <span class="hl opt">=</span> <span class="hl kwd">talloc_get_type</span><span class="hl opt">(</span>ctx<span class="hl opt">,</span> <span class="hl kwb">struct</span> sbus_connection<span class="hl opt">);</span>

    <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">5</span><span class="hl opt">, (</span><span class="hl str">&quot;Invoking default destructor on connection</span> <span class="hl ipl">%l</span><span class="hl str">X</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
              conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">));</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>connection_type <span class="hl opt">==</span> SBUS_CONN_TYPE_PRIVATE<span class="hl opt">) {</span>
        <span class="hl com">/* Private connections must be closed explicitly */</span>
        <span class="hl kwd">dbus_connection_close</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">);</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">else if</span> <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>connection_type <span class="hl opt">==</span> SBUS_CONN_TYPE_SHARED<span class="hl opt">) {</span>
        <span class="hl com">/* Shared connections are destroyed when their last reference is removed */</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">else</span> <span class="hl opt">{</span>
        <span class="hl com">/* Critical Error! */</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,(</span><span class="hl str">&quot;Critical Error, connection_type is neither shared nor private!</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl kwa">return</span> <span class="hl opt">-</span><span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl com">/* Remove object path */</span>
    <span class="hl com">/* TODO: Remove object paths */</span>

    <span class="hl kwd">dbus_connection_unref</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">);</span>
    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl com">/*</span>
<span class="hl com"> * sbus_get_connection</span>
<span class="hl com"> * Utility function to retreive the DBusConnection object</span>
<span class="hl com"> * from a sbus_connection</span>
<span class="hl com"> */</span>
DBusConnection <span class="hl opt">*</span><span class="hl kwd">sbus_get_connection</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwa">return</span> conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">void</span> <span class="hl kwd">sbus_disconnect</span> <span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>conn <span class="hl opt">==</span> NULL<span class="hl opt">) {</span>
        <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">5</span><span class="hl opt">,(</span><span class="hl str">&quot;Disconnecting</span> <span class="hl ipl">%l</span><span class="hl str">X</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">));</span>

    <span class="hl com">/*******************************</span>
<span class="hl com">     *  Referencing conn-&gt;dbus.conn */</span>
    <span class="hl kwd">dbus_connection_ref</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">);</span>

    conn<span class="hl opt">-&gt;</span>disconnect <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>

    <span class="hl com">/* Invoke the custom destructor, if it exists */</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>destructor<span class="hl opt">) {</span>
        conn<span class="hl opt">-&gt;</span><span class="hl kwd">destructor</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>
    <span class="hl opt">}</span>

    <span class="hl com">/* Unregister object paths */</span>
    <span class="hl kwd">sbus_unreg_object_paths</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>

    <span class="hl com">/* Disable watch functions */</span>
    <span class="hl kwd">dbus_connection_set_watch_functions</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                        NULL<span class="hl opt">,</span> NULL<span class="hl opt">,</span> NULL<span class="hl opt">,</span>
                                        NULL<span class="hl opt">,</span> NULL<span class="hl opt">);</span>
    <span class="hl com">/* Disable timeout functions */</span>
    <span class="hl kwd">dbus_connection_set_timeout_functions</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                          NULL<span class="hl opt">,</span> NULL<span class="hl opt">,</span> NULL<span class="hl opt">,</span>
                                          NULL<span class="hl opt">,</span> NULL<span class="hl opt">);</span>

    <span class="hl com">/* Disable dispatch status function */</span>
    <span class="hl kwd">dbus_connection_set_dispatch_status_function</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                                 NULL<span class="hl opt">,</span> NULL<span class="hl opt">,</span> NULL<span class="hl opt">);</span>

    <span class="hl com">/* Disable wakeup main function */</span>
    <span class="hl kwd">dbus_connection_set_wakeup_main_function</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                             NULL<span class="hl opt">,</span> NULL<span class="hl opt">,</span> NULL<span class="hl opt">);</span>

    <span class="hl com">/* Finalize the connection */</span>
    <span class="hl kwd">sbus_default_connection_destructor</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>

    <span class="hl kwd">dbus_connection_unref</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">);</span>
    <span class="hl com">/* Unreferenced conn-&gt;dbus_conn *</span>
<span class="hl com">     ******************************/</span>

    <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">5</span><span class="hl opt">,(</span><span class="hl str">&quot;Disconnected</span> <span class="hl ipl">%l</span><span class="hl str">X</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">));</span>
<span class="hl opt">}</span>

<span class="hl kwb">static int</span> <span class="hl kwd">sbus_reply_internal_error</span><span class="hl opt">(</span>DBusMessage <span class="hl opt">*</span>message<span class="hl opt">,</span>
                                     <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">) {</span>
    DBusMessage <span class="hl opt">*</span>reply <span class="hl opt">=</span> <span class="hl kwd">dbus_message_new_error</span><span class="hl opt">(</span>message<span class="hl opt">,</span> DBUS_ERROR_IO_ERROR<span class="hl opt">,</span>
                                                <span class="hl str">&quot;Internal Error&quot;</span><span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>reply<span class="hl opt">) {</span>
        <span class="hl kwd">sbus_conn_send_reply</span><span class="hl opt">(</span>conn<span class="hl opt">,</span> reply<span class="hl opt">);</span>
        <span class="hl kwd">dbus_message_unref</span><span class="hl opt">(</span>reply<span class="hl opt">);</span>
        <span class="hl kwa">return</span> DBUS_HANDLER_RESULT_HANDLED<span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">return</span> DBUS_HANDLER_RESULT_NOT_YET_HANDLED<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl com">/* messsage_handler</span>
<span class="hl com"> * Receive messages and process them</span>
<span class="hl com"> */</span>
DBusHandlerResult <span class="hl kwd">sbus_message_handler</span><span class="hl opt">(</span>DBusConnection <span class="hl opt">*</span>dbus_conn<span class="hl opt">,</span>
                                         DBusMessage <span class="hl opt">*</span>message<span class="hl opt">,</span>
                                         <span class="hl kwb">void</span> <span class="hl opt">*</span>user_data<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_interface_p <span class="hl opt">*</span>intf_p<span class="hl opt">;</span>
    <span class="hl kwb">const char</span> <span class="hl opt">*</span>method<span class="hl opt">;</span>
    <span class="hl kwb">const char</span> <span class="hl opt">*</span>path<span class="hl opt">;</span>
    <span class="hl kwb">const char</span> <span class="hl opt">*</span>msg_interface<span class="hl opt">;</span>
    DBusMessage <span class="hl opt">*</span>reply <span class="hl opt">=</span> NULL<span class="hl opt">;</span>
    <span class="hl kwb">int</span> i<span class="hl opt">,</span> ret<span class="hl opt">;</span>
    <span class="hl kwb">int</span> found<span class="hl opt">;</span>

    <span class="hl kwa">if</span> <span class="hl opt">(!</span>user_data<span class="hl opt">) {</span>
        <span class="hl kwa">return</span> DBUS_HANDLER_RESULT_NOT_YET_HANDLED<span class="hl opt">;</span>
    <span class="hl opt">}</span>
    intf_p <span class="hl opt">=</span> <span class="hl kwd">talloc_get_type</span><span class="hl opt">(</span>user_data<span class="hl opt">,</span> <span class="hl kwb">struct</span> sbus_interface_p<span class="hl opt">);</span>

    method <span class="hl opt">=</span> <span class="hl kwd">dbus_message_get_member</span><span class="hl opt">(</span>message<span class="hl opt">);</span>
    <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">9</span><span class="hl opt">, (</span><span class="hl str">&quot;Received SBUS method [</span><span class="hl ipl">%s</span><span class="hl str">]</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> method<span class="hl opt">));</span>
    path <span class="hl opt">=</span> <span class="hl kwd">dbus_message_get_path</span><span class="hl opt">(</span>message<span class="hl opt">);</span>
    msg_interface <span class="hl opt">=</span> <span class="hl kwd">dbus_message_get_interface</span><span class="hl opt">(</span>message<span class="hl opt">);</span>

    <span class="hl kwa">if</span> <span class="hl opt">(!</span>method <span class="hl opt">|| !</span>path <span class="hl opt">|| !</span>msg_interface<span class="hl opt">)</span>
        <span class="hl kwa">return</span> DBUS_HANDLER_RESULT_NOT_YET_HANDLED<span class="hl opt">;</span>

    <span class="hl com">/* Validate the D-BUS path */</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">strcmp</span><span class="hl opt">(</span>path<span class="hl opt">,</span> intf_p<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>path<span class="hl opt">) !=</span> <span class="hl num">0</span><span class="hl opt">)</span>
        <span class="hl kwa">return</span> DBUS_HANDLER_RESULT_NOT_YET_HANDLED<span class="hl opt">;</span>

    <span class="hl com">/* Validate the method interface */</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">strcmp</span><span class="hl opt">(</span>msg_interface<span class="hl opt">,</span> intf_p<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>interface<span class="hl opt">) ==</span> <span class="hl num">0</span><span class="hl opt">) {</span>
        found <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
        <span class="hl kwa">for</span> <span class="hl opt">(</span>i <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> intf_p<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>methods<span class="hl opt">[</span>i<span class="hl opt">].</span>method <span class="hl opt">!=</span> NULL<span class="hl opt">;</span> i<span class="hl opt">++) {</span>
            <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">strcmp</span><span class="hl opt">(</span>method<span class="hl opt">,</span> intf_p<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>methods<span class="hl opt">[</span>i<span class="hl opt">].</span>method<span class="hl opt">) ==</span> <span class="hl num">0</span><span class="hl opt">) {</span>
                found <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
                ret <span class="hl opt">=</span> intf_p<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>methods<span class="hl opt">[</span>i<span class="hl opt">].</span><span class="hl kwd">fn</span><span class="hl opt">(</span>message<span class="hl opt">,</span> intf_p<span class="hl opt">-&gt;</span>conn<span class="hl opt">);</span>
                <span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">!=</span> EOK<span class="hl opt">) {</span>
                    <span class="hl kwa">return</span> <span class="hl kwd">sbus_reply_internal_error</span><span class="hl opt">(</span>message<span class="hl opt">,</span> intf_p<span class="hl opt">-&gt;</span>conn<span class="hl opt">);</span>
                <span class="hl opt">}</span>
                <span class="hl kwa">break</span><span class="hl opt">;</span>
            <span class="hl opt">}</span>
        <span class="hl opt">}</span>

        <span class="hl kwa">if</span> <span class="hl opt">(!</span>found<span class="hl opt">) {</span>
            <span class="hl com">/* Reply DBUS_ERROR_UNKNOWN_METHOD */</span>
            <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">, (</span><span class="hl str">&quot;No matching method found for</span> <span class="hl ipl">%s</span><span class="hl str">.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> method<span class="hl opt">));</span>
            reply <span class="hl opt">=</span> <span class="hl kwd">dbus_message_new_error</span><span class="hl opt">(</span>message<span class="hl opt">,</span> DBUS_ERROR_UNKNOWN_METHOD<span class="hl opt">,</span> NULL<span class="hl opt">);</span>
            <span class="hl kwd">sbus_conn_send_reply</span><span class="hl opt">(</span>intf_p<span class="hl opt">-&gt;</span>conn<span class="hl opt">,</span> reply<span class="hl opt">);</span>
            <span class="hl kwd">dbus_message_unref</span><span class="hl opt">(</span>reply<span class="hl opt">);</span>
        <span class="hl opt">}</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">else</span> <span class="hl opt">{</span>
        <span class="hl com">/* Special case: check for Introspection request</span>
<span class="hl com">         * This is usually only useful for system bus connections</span>
<span class="hl com">         */</span>
        <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">strcmp</span><span class="hl opt">(</span>msg_interface<span class="hl opt">,</span> DBUS_INTROSPECT_INTERFACE<span class="hl opt">) ==</span> <span class="hl num">0</span> <span class="hl opt">&amp;&amp;</span>
            <span class="hl kwd">strcmp</span><span class="hl opt">(</span>method<span class="hl opt">,</span> DBUS_INTROSPECT_METHOD<span class="hl opt">) ==</span> <span class="hl num">0</span><span class="hl opt">)</span>
        <span class="hl opt">{</span>
            <span class="hl kwa">if</span> <span class="hl opt">(</span>intf_p<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>introspect_fn<span class="hl opt">) {</span>
                <span class="hl com">/* If we have been asked for introspection data and we have</span>
<span class="hl com">                 * an introspection function registered, user that.</span>
<span class="hl com">                 */</span>
                ret <span class="hl opt">=</span> intf_p<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span><span class="hl kwd">introspect_fn</span><span class="hl opt">(</span>message<span class="hl opt">,</span> intf_p<span class="hl opt">-&gt;</span>conn<span class="hl opt">);</span>
                <span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">!=</span> EOK<span class="hl opt">) {</span>
                    <span class="hl kwa">return</span> <span class="hl kwd">sbus_reply_internal_error</span><span class="hl opt">(</span>message<span class="hl opt">,</span> intf_p<span class="hl opt">-&gt;</span>conn<span class="hl opt">);</span>
                <span class="hl opt">}</span>
            <span class="hl opt">}</span>
        <span class="hl opt">}</span>
        <span class="hl kwa">else</span>
            <span class="hl kwa">return</span> DBUS_HANDLER_RESULT_NOT_YET_HANDLED<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return</span> DBUS_HANDLER_RESULT_HANDLED<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl com">/* Adds a new D-BUS path message handler to the connection</span>
<span class="hl com"> * Note: this must be a unique path.</span>
<span class="hl com"> */</span>
<span class="hl kwb">int</span> <span class="hl kwd">sbus_conn_add_interface</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">,</span>
                             <span class="hl kwb">struct</span> sbus_interface <span class="hl opt">*</span>intf<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_interface_p <span class="hl opt">*</span>intf_p<span class="hl opt">;</span>
    dbus_bool_t dbret<span class="hl opt">;</span>
    <span class="hl kwb">const char</span> <span class="hl opt">*</span>path<span class="hl opt">;</span>

    <span class="hl kwa">if</span> <span class="hl opt">(!</span>conn <span class="hl opt">|| !</span>intf <span class="hl opt">|| !</span>intf<span class="hl opt">-&gt;</span>vtable<span class="hl opt">.</span>message_function<span class="hl opt">) {</span>
        <span class="hl kwa">return</span> EINVAL<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    path <span class="hl opt">=</span> intf<span class="hl opt">-&gt;</span>path<span class="hl opt">;</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">path_in_interface_list</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>intf_list<span class="hl opt">,</span> path<span class="hl opt">)) {</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">, (</span><span class="hl str">&quot;Cannot add method context with identical path.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl kwa">return</span> EINVAL<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    intf_p <span class="hl opt">=</span> <span class="hl kwd">talloc_zero</span><span class="hl opt">(</span>conn<span class="hl opt">,</span> <span class="hl kwb">struct</span> sbus_interface_p<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>intf_p<span class="hl opt">) {</span>
        <span class="hl kwa">return</span> ENOMEM<span class="hl opt">;</span>
    <span class="hl opt">}</span>
    intf_p<span class="hl opt">-&gt;</span>conn <span class="hl opt">=</span> conn<span class="hl opt">;</span>
    intf_p<span class="hl opt">-&gt;</span>intf <span class="hl opt">=</span> intf<span class="hl opt">;</span>

    <span class="hl kwd">DLIST_ADD</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>intf_list<span class="hl opt">,</span> intf_p<span class="hl opt">);</span>

    dbret <span class="hl opt">=</span> <span class="hl kwd">dbus_connection_register_object_path</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                                 path<span class="hl opt">, &amp;</span>intf<span class="hl opt">-&gt;</span>vtable<span class="hl opt">,</span> intf_p<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>dbret<span class="hl opt">) {</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">, (</span><span class="hl str">&quot;Could not register object path to the connection.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl kwa">return</span> ENOMEM<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return</span> EOK<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static bool</span> <span class="hl kwd">path_in_interface_list</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_interface_p <span class="hl opt">*</span>list<span class="hl opt">,</span>
                                   <span class="hl kwb">const char</span> <span class="hl opt">*</span>path<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_interface_p <span class="hl opt">*</span>iter<span class="hl opt">;</span>

    <span class="hl kwa">if</span> <span class="hl opt">(!</span>list <span class="hl opt">|| !</span>path<span class="hl opt">) {</span>
        <span class="hl kwa">return false</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    iter <span class="hl opt">=</span> list<span class="hl opt">;</span>
    <span class="hl kwa">while</span> <span class="hl opt">(</span>iter <span class="hl opt">!=</span> NULL<span class="hl opt">) {</span>
        <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">strcmp</span><span class="hl opt">(</span>iter<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>path<span class="hl opt">,</span> path<span class="hl opt">) ==</span> <span class="hl num">0</span><span class="hl opt">) {</span>
            <span class="hl kwa">return true</span><span class="hl opt">;</span>
        <span class="hl opt">}</span>
        iter <span class="hl opt">=</span> iter<span class="hl opt">-&gt;</span>next<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return false</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static void</span> <span class="hl kwd">sbus_unreg_object_paths</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_interface_p <span class="hl opt">*</span>iter <span class="hl opt">=</span> conn<span class="hl opt">-&gt;</span>intf_list<span class="hl opt">;</span>

    <span class="hl kwa">while</span> <span class="hl opt">(</span>iter <span class="hl opt">!=</span> NULL<span class="hl opt">) {</span>
        <span class="hl kwd">dbus_connection_unregister_object_path</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                               iter<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>path<span class="hl opt">);</span>
        iter <span class="hl opt">=</span> iter<span class="hl opt">-&gt;</span>next<span class="hl opt">;</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwb">void</span> <span class="hl kwd">sbus_conn_set_private_data</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>pvt_data<span class="hl opt">)</span>
<span class="hl opt">{</span>
    conn<span class="hl opt">-&gt;</span>pvt_data <span class="hl opt">=</span> pvt_data<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">void</span> <span class="hl opt">*</span><span class="hl kwd">sbus_conn_get_private_data</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwa">return</span> conn<span class="hl opt">-&gt;</span>pvt_data<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static void</span> <span class="hl kwd">sbus_reconnect</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tevent_context <span class="hl opt">*</span>ev<span class="hl opt">,</span>
                           <span class="hl kwb">struct</span> tevent_timer <span class="hl opt">*</span>te<span class="hl opt">,</span>
                           <span class="hl kwb">struct</span> timeval tv<span class="hl opt">,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">;</span>
    <span class="hl kwb">struct</span> sbus_interface_p <span class="hl opt">*</span>iter<span class="hl opt">;</span>
    DBusError dbus_error<span class="hl opt">;</span>
    dbus_bool_t dbret<span class="hl opt">;</span>
    <span class="hl kwb">int</span> ret<span class="hl opt">;</span>

    conn <span class="hl opt">=</span> <span class="hl kwd">talloc_get_type</span><span class="hl opt">(</span>data<span class="hl opt">,</span> <span class="hl kwb">struct</span> sbus_connection<span class="hl opt">);</span>
    <span class="hl kwd">dbus_error_init</span><span class="hl opt">(&amp;</span>dbus_error<span class="hl opt">);</span>

    <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">3</span><span class="hl opt">, (</span><span class="hl str">&quot;Making reconnection attempt</span> <span class="hl ipl">%d</span> <span class="hl str">to [</span><span class="hl ipl">%s</span><span class="hl str">]</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
              conn<span class="hl opt">-&gt;</span>retries<span class="hl opt">,</span> conn<span class="hl opt">-&gt;</span>address<span class="hl opt">));</span>
    conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn <span class="hl opt">=</span> <span class="hl kwd">dbus_connection_open</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>address<span class="hl opt">, &amp;</span>dbus_error<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">) {</span>
        <span class="hl com">/* We successfully reconnected. Set up mainloop integration. */</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">3</span><span class="hl opt">, (</span><span class="hl str">&quot;Reconnected to [</span><span class="hl ipl">%s</span><span class="hl str">]</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> conn<span class="hl opt">-&gt;</span>address<span class="hl opt">));</span>
        ret <span class="hl opt">=</span> <span class="hl kwd">sbus_conn_set_fns</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>
        <span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">!=</span> EOK<span class="hl opt">) {</span>
            <span class="hl kwd">dbus_connection_unref</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">);</span>
            <span class="hl kwa">goto</span> failed<span class="hl opt">;</span>
        <span class="hl opt">}</span>

        <span class="hl com">/* Re-register object paths */</span>
        iter <span class="hl opt">=</span> conn<span class="hl opt">-&gt;</span>intf_list<span class="hl opt">;</span>
        <span class="hl kwa">while</span> <span class="hl opt">(</span>iter<span class="hl opt">) {</span>
            dbret <span class="hl opt">=</span> <span class="hl kwd">dbus_connection_register_object_path</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span>
                                                         iter<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>path<span class="hl opt">,</span>
                                                         <span class="hl opt">&amp;</span>iter<span class="hl opt">-&gt;</span>intf<span class="hl opt">-&gt;</span>vtable<span class="hl opt">,</span>
                                                         iter<span class="hl opt">);</span>
            <span class="hl kwa">if</span> <span class="hl opt">(!</span>dbret<span class="hl opt">) {</span>
                <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">, (</span><span class="hl str">&quot;Could not register object path.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
                <span class="hl kwd">dbus_connection_unref</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">);</span>
                <span class="hl kwa">goto</span> failed<span class="hl opt">;</span>
            <span class="hl opt">}</span>
            iter <span class="hl opt">=</span> iter<span class="hl opt">-&gt;</span>next<span class="hl opt">;</span>
        <span class="hl opt">}</span>

        <span class="hl com">/* Reset retries to 0 to resume dispatch processing */</span>
        conn<span class="hl opt">-&gt;</span>retries <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>

        <span class="hl com">/* Notify the owner of this connection that the</span>
<span class="hl com">         * reconnection was successful</span>
<span class="hl com">         */</span>
        conn<span class="hl opt">-&gt;</span><span class="hl kwd">reconnect_callback</span><span class="hl opt">(</span>conn<span class="hl opt">,</span>
                                 SBUS_RECONNECT_SUCCESS<span class="hl opt">,</span>
                                 conn<span class="hl opt">-&gt;</span>reconnect_pvt<span class="hl opt">);</span>
        <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

failed<span class="hl opt">:</span>
    <span class="hl com">/* Reconnection failed, try again in a few seconds */</span>
    <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">, (</span><span class="hl str">&quot;Failed to open connection: name=</span><span class="hl ipl">%s</span><span class="hl str">, message=</span><span class="hl ipl">%s</span><span class="hl str"></span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
                dbus_error<span class="hl opt">.</span>name<span class="hl opt">,</span> dbus_error<span class="hl opt">.</span>message<span class="hl opt">));</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">dbus_error_is_set</span><span class="hl opt">(&amp;</span>dbus_error<span class="hl opt">))</span> <span class="hl kwd">dbus_error_free</span><span class="hl opt">(&amp;</span>dbus_error<span class="hl opt">);</span>

    conn<span class="hl opt">-&gt;</span>retries<span class="hl opt">++;</span>

    <span class="hl com">/* Check if we&#39;ve passed our last chance or if we&#39;ve lost track of</span>
<span class="hl com">     * our retry count somehow</span>
<span class="hl com">     */</span>
    <span class="hl kwa">if</span> <span class="hl opt">((</span>conn<span class="hl opt">-&gt;</span>retries <span class="hl opt">&gt;</span> conn<span class="hl opt">-&gt;</span>max_retries<span class="hl opt">) || (</span>conn<span class="hl opt">-&gt;</span>retries <span class="hl opt">&lt;=</span> <span class="hl num">0</span><span class="hl opt">)) {</span>
        conn<span class="hl opt">-&gt;</span><span class="hl kwd">reconnect_callback</span><span class="hl opt">(</span>conn<span class="hl opt">,</span>
                                 SBUS_RECONNECT_EXCEEDED_RETRIES<span class="hl opt">,</span>
                                 conn<span class="hl opt">-&gt;</span>reconnect_pvt<span class="hl opt">);</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>retries <span class="hl opt">==</span> <span class="hl num">2</span><span class="hl opt">) {</span>
        <span class="hl com">/* Wait 3 seconds before the second reconnect attempt */</span>
        tv<span class="hl opt">.</span>tv_sec <span class="hl opt">+=</span> <span class="hl num">3</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">else if</span> <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>retries <span class="hl opt">==</span> <span class="hl num">3</span><span class="hl opt">) {</span>
        <span class="hl com">/* Wait 10 seconds before the third reconnect attempt */</span>
        tv<span class="hl opt">.</span>tv_sec <span class="hl opt">+=</span> <span class="hl num">10</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">else</span> <span class="hl opt">{</span>
        <span class="hl com">/* Wait 30 seconds before all subsequent reconnect attempts */</span>
        tv<span class="hl opt">.</span>tv_sec <span class="hl opt">+=</span> <span class="hl num">30</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    te <span class="hl opt">=</span> <span class="hl kwd">tevent_add_timer</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>ev<span class="hl opt">,</span> conn<span class="hl opt">,</span> tv<span class="hl opt">,</span> sbus_reconnect<span class="hl opt">,</span> conn<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>te<span class="hl opt">) {</span>
        conn<span class="hl opt">-&gt;</span><span class="hl kwd">reconnect_callback</span><span class="hl opt">(</span>conn<span class="hl opt">,</span>
                                 SBUS_RECONNECT_ERROR<span class="hl opt">,</span>
                                 conn<span class="hl opt">-&gt;</span>reconnect_pvt<span class="hl opt">);</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl com">/* This function will free and recreate the sbus_connection,</span>
<span class="hl com"> * calling functions need to be aware of this (and whether</span>
<span class="hl com"> * they have attached a talloc destructor to the</span>
<span class="hl com"> * sbus_connection.</span>
<span class="hl com"> */</span>
<span class="hl kwb">static int</span> <span class="hl kwd">sbus_auto_reconnect</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwb">struct</span> tevent_timer <span class="hl opt">*</span>te <span class="hl opt">=</span> NULL<span class="hl opt">;</span>
    <span class="hl kwb">struct</span> timeval tv<span class="hl opt">;</span>

    conn<span class="hl opt">-&gt;</span>retries<span class="hl opt">++;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>retries <span class="hl opt">&gt;=</span> conn<span class="hl opt">-&gt;</span>max_retries<span class="hl opt">) {</span>
        <span class="hl com">/* Return EIO (to tell the calling process it</span>
<span class="hl com">         * needs to create a new connection from scratch</span>
<span class="hl com">         */</span>
        <span class="hl kwa">return</span> EIO<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwd">gettimeofday</span><span class="hl opt">(&amp;</span>tv<span class="hl opt">,</span> NULL<span class="hl opt">);</span>
    tv<span class="hl opt">.</span>tv_sec <span class="hl opt">+=</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl com">/* Wait 1 second before the first reconnect attempt */</span>
    te <span class="hl opt">=</span> <span class="hl kwd">tevent_add_timer</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>ev<span class="hl opt">,</span> conn<span class="hl opt">,</span> tv<span class="hl opt">,</span> sbus_reconnect<span class="hl opt">,</span> conn<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>te<span class="hl opt">) {</span>
        <span class="hl kwa">return</span> EIO<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return</span> EOK<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl com">/* Max retries */</span>
<span class="hl kwb">void</span> <span class="hl kwd">sbus_reconnect_init</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">,</span>
                         <span class="hl kwb">int</span> max_retries<span class="hl opt">,</span>
                         sbus_conn_reconn_callback_fn callback<span class="hl opt">,</span>
                         <span class="hl kwb">void</span> <span class="hl opt">*</span>pvt<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>max_retries <span class="hl opt">&lt;</span> <span class="hl num">0</span> <span class="hl opt">||</span> callback <span class="hl opt">==</span> NULL<span class="hl opt">)</span> <span class="hl kwa">return</span><span class="hl opt">;</span>

    conn<span class="hl opt">-&gt;</span>retries <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    conn<span class="hl opt">-&gt;</span>max_retries <span class="hl opt">=</span> max_retries<span class="hl opt">;</span>
    conn<span class="hl opt">-&gt;</span>reconnect_callback <span class="hl opt">=</span> callback<span class="hl opt">;</span>
    conn<span class="hl opt">-&gt;</span>reconnect_pvt <span class="hl opt">=</span> pvt<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">bool</span> <span class="hl kwd">sbus_conn_disconnecting</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>disconnect <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">)</span> <span class="hl kwa">return true</span><span class="hl opt">;</span>
    <span class="hl kwa">return false</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl com">/*</span>
<span class="hl com"> * Send a message across the SBUS</span>
<span class="hl com"> * If requested, the DBusPendingCall object will</span>
<span class="hl com"> * be returned to the caller.</span>
<span class="hl com"> *</span>
<span class="hl com"> * This function will return EAGAIN in the event</span>
<span class="hl com"> * that the connection is not open for</span>
<span class="hl com"> * communication.</span>
<span class="hl com"> */</span>
<span class="hl kwb">int</span> <span class="hl kwd">sbus_conn_send</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">,</span>
                   DBusMessage <span class="hl opt">*</span>msg<span class="hl opt">,</span>
                   <span class="hl kwb">int</span> timeout_ms<span class="hl opt">,</span>
                   DBusPendingCallNotifyFunction reply_handler<span class="hl opt">,</span>
                   <span class="hl kwb">void</span> <span class="hl opt">*</span>pvt<span class="hl opt">,</span>
                   DBusPendingCall <span class="hl opt">**</span>pending<span class="hl opt">)</span>
<span class="hl opt">{</span>
    DBusPendingCall <span class="hl opt">*</span>pending_reply<span class="hl opt">;</span>
    DBusConnection <span class="hl opt">*</span>dbus_conn<span class="hl opt">;</span>
    dbus_bool_t dbret<span class="hl opt">;</span>

    dbus_conn <span class="hl opt">=</span> <span class="hl kwd">sbus_get_connection</span><span class="hl opt">(</span>conn<span class="hl opt">);</span>

    dbret <span class="hl opt">=</span> <span class="hl kwd">dbus_connection_send_with_reply</span><span class="hl opt">(</span>dbus_conn<span class="hl opt">,</span> msg<span class="hl opt">,</span>
                                            <span class="hl opt">&amp;</span>pending_reply<span class="hl opt">,</span>
                                            timeout_ms<span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>dbret<span class="hl opt">) {</span>
        <span class="hl com">/*</span>
<span class="hl com">         * Critical Failure</span>
<span class="hl com">         * Insufficient memory to send message</span>
<span class="hl com">         */</span>
        <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">, (</span><span class="hl str">&quot;D-BUS send failed.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
        <span class="hl kwa">return</span> ENOMEM<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span>pending_reply<span class="hl opt">) {</span>
        <span class="hl com">/* Set up the reply handler */</span>
        dbret <span class="hl opt">=</span> <span class="hl kwd">dbus_pending_call_set_notify</span><span class="hl opt">(</span>pending_reply<span class="hl opt">,</span> reply_handler<span class="hl opt">,</span>
                                             pvt<span class="hl opt">,</span> NULL<span class="hl opt">);</span>
        <span class="hl kwa">if</span> <span class="hl opt">(!</span>dbret<span class="hl opt">) {</span>
            <span class="hl com">/*</span>
<span class="hl com">             * Critical Failure</span>
<span class="hl com">             * Insufficient memory to create pending call notify</span>
<span class="hl com">             */</span>
            <span class="hl kwd">DEBUG</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">, (</span><span class="hl str">&quot;D-BUS send failed.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
            <span class="hl kwd">dbus_pending_call_cancel</span><span class="hl opt">(</span>pending_reply<span class="hl opt">);</span>
            <span class="hl kwd">dbus_pending_call_unref</span><span class="hl opt">(</span>pending_reply<span class="hl opt">);</span>
            <span class="hl kwa">return</span> ENOMEM<span class="hl opt">;</span>
        <span class="hl opt">}</span>

        <span class="hl kwa">if</span><span class="hl opt">(</span>pending<span class="hl opt">) {</span>
            <span class="hl opt">*</span>pending <span class="hl opt">=</span> pending_reply<span class="hl opt">;</span>
        <span class="hl opt">}</span>
        <span class="hl kwa">return</span> EOK<span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl com">/* If pending_reply is NULL, the connection was not</span>
<span class="hl com">     * open for sending.</span>
<span class="hl com">     */</span>

    <span class="hl com">/* TODO: Create a callback into the reconnection logic so this</span>
<span class="hl com">     * request is invoked when the connection is re-established</span>
<span class="hl com">     */</span>
    <span class="hl kwa">return</span> EAGAIN<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">void</span> <span class="hl kwd">sbus_conn_send_reply</span><span class="hl opt">(</span><span class="hl kwb">struct</span> sbus_connection <span class="hl opt">*</span>conn<span class="hl opt">,</span> DBusMessage <span class="hl opt">*</span>reply<span class="hl opt">)</span>
<span class="hl opt">{</span>
    <span class="hl kwd">dbus_connection_send</span><span class="hl opt">(</span>conn<span class="hl opt">-&gt;</span>dbus<span class="hl opt">.</span>conn<span class="hl opt">,</span> reply<span class="hl opt">,</span> NULL<span class="hl opt">);</span>
<span class="hl opt">}</span>

</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit </a> (<a href='https://git-scm.com/'>git 2.34.1</a>) at 2026-04-20 13:54:23 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
