<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>https://wiki.cadt.com/index.php?action=history&amp;feed=atom&amp;title=Sapomanager</id>
	<title>Sapomanager - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cadt.com/index.php?action=history&amp;feed=atom&amp;title=Sapomanager"/>
	<link rel="alternate" type="text/html" href="https://wiki.cadt.com/index.php?title=Sapomanager&amp;action=history"/>
	<updated>2026-04-13T12:34:54Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://wiki.cadt.com/index.php?title=Sapomanager&amp;diff=2509&amp;oldid=prev</id>
		<title>Joan a 12:29, 7 gen 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.cadt.com/index.php?title=Sapomanager&amp;diff=2509&amp;oldid=prev"/>
		<updated>2015-01-07T12:29:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ca&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Versió més antiga&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisió del 12:29, 7 gen 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Línia 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línia 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:SAPO]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Devel]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Introducció ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Introducció ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joan</name></author>
	</entry>
	<entry>
		<id>https://wiki.cadt.com/index.php?title=Sapomanager&amp;diff=104&amp;oldid=prev</id>
		<title>Cadtsd: Protegit «Sapomanager» ([edit=autoconfirmed] (indefinit) [move=autoconfirmed] (indefinit))</title>
		<link rel="alternate" type="text/html" href="https://wiki.cadt.com/index.php?title=Sapomanager&amp;diff=104&amp;oldid=prev"/>
		<updated>2010-11-13T21:35:42Z</updated>

		<summary type="html">&lt;p&gt;Protegit «&lt;a href=&quot;/index.php/Sapomanager&quot; title=&quot;Sapomanager&quot;&gt;Sapomanager&lt;/a&gt;» ([edit=autoconfirmed] (indefinit) [move=autoconfirmed] (indefinit))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Introducció ==&lt;br /&gt;
&lt;br /&gt;
[[Sapomanager]] es un dimoni de sistema que ens serveix per fer tasques de intercomunicació entre els diversos processos del Carta. A diferencia de versions inicials, no cal que el programa que s&amp;#039;hi vol comunicar l&amp;#039;executi, ni fer servir complicats ( i delicats) sistemes de tipus &amp;#039;&amp;#039;proxy&amp;#039;&amp;#039;. El daemon arrenca al iniciar l&amp;#039;ordinador i es manté funcionant fins que l&amp;#039;apaguem.&lt;br /&gt;
&lt;br /&gt;
== Estructura ==&lt;br /&gt;
&lt;br /&gt;
Sapomanager reconeix dos tipus de clients: Les aplicacions i els serveis. Les aplicacions es connecten (registren) al Sapomanager i poden treballar amb ell, llistant les aplicacions en execució, enviant-hi missatges a d&amp;#039;altres aplicacions a través de [[Sapomanager]], o obrint connexió amb serveis.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:sapomanager.png]]&lt;br /&gt;
&lt;br /&gt;
Tota la comunicació entre [[Sapomanager]] i els clients (aplicacions i serveis) es realitza a través de la llibreria &amp;#039;&amp;#039;libsapomngr&amp;#039;&amp;#039;. D&amp;#039;aquesta manera no cal preocupar-se de les comunicacions ni de &amp;#039;&amp;#039;sockets&amp;#039;&amp;#039;. La aplicació que fa servir [[sapomanager]] només realitza crides de funcions a la llibreria &amp;#039;&amp;#039;libsapomngr&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
&lt;br /&gt;
=== Registre d&amp;#039;una aplicació ===&lt;br /&gt;
&lt;br /&gt;
Quan una aplicació vol fer servir el [[Sapomanager]] primer s&amp;#039;hi ha de registrar.&lt;br /&gt;
 SMNGR_client_st client;&lt;br /&gt;
 SMNGR_register (&amp;amp;client, (const char*) appName, (const char*) userName);&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;userName&amp;#039;&amp;#039; es opcional. En cas de que sigui NULL, la llibreria intentarà trobar el nom mitjançant les variables d&amp;#039;entorn USER i LOGNAME.&lt;br /&gt;
En cas d&amp;#039;error retorna 0 ([[Sapomanager]] no està executant-se).&lt;br /&gt;
&lt;br /&gt;
No cal des-registrar l&amp;#039;aplicació. Quan mor, [[Sapomanager]] ho detecta i l&amp;#039;elimina automàticament.&lt;br /&gt;
&lt;br /&gt;
=== Llistat d&amp;#039;aplicacions en execució ===&lt;br /&gt;
&lt;br /&gt;
Per llistar les aplicacions actualment registrades en [[Sapomanager]] cal fer:&lt;br /&gt;
 unsigned int  numApps;&lt;br /&gt;
 SMNGR_app_st *list = SMNGR_list_apps(&amp;amp;client, &amp;amp;numApps);&lt;br /&gt;
&lt;br /&gt;
Retorna una llista de &amp;#039;&amp;#039;numApps&amp;#039;&amp;#039; estructures &amp;#039;&amp;#039;SMNGR_app_st&amp;#039;&amp;#039;. Aquesta llista inclou l&amp;#039;aplicació que crida, per tant mai pot ser buida. En cas d&amp;#039;error retorna NULL. La memoria retornada cal alliberar-la amb &amp;#039;&amp;#039;free()&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Comunicacions entre aplicacions ===&lt;br /&gt;
&lt;br /&gt;
Es possible enviar missatges a una altra aplicació registrada. Per això farem servir&lt;br /&gt;
 SMNGR_send_message  (&amp;amp;client, (SMNGR_app_st*) &amp;amp;list[i], &amp;quot;HOLA&amp;quot;); &lt;br /&gt;
 /* o bé */&lt;br /&gt;
 SMNGR_send_messagef (&amp;amp;client, (SMNGR_app_st*) &amp;amp;list[i], &amp;quot;HOLA %s&amp;quot;, &amp;quot;MON&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Aquesta funció retorna 0 si falla (aplicació de destí no existeix, o un altre error).&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;enviament de missatges es asíncron. No s&amp;#039;espera una resposta ni es garanteix que l&amp;#039;aplicació que rep el missatge l&amp;#039;estigui esperant ni en faci res concret amb ell. Per rebre missatges, cal configurar una funció de recepció i cridar una de les funcions d&amp;#039;espera de missatges:&lt;br /&gt;
&lt;br /&gt;
 SMNGR_set_message_handler (&amp;amp;client, (SMNGR_msg_handler_t) missatge_rebut);&lt;br /&gt;
 &lt;br /&gt;
 SMNGR_dispatch_message (&amp;amp;client); /* crida el &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; només si hi ha un missatge esperant per ser processat. */&lt;br /&gt;
 /* o bé */&lt;br /&gt;
 SMNGR_dispatch_message_loop (&amp;amp;client,(unsigned long int) 5000); /* s&amp;#039;espera fins a 5000 ms. a veure si rep un missatge */&lt;br /&gt;
&lt;br /&gt;
Les funcions de dispatch retornen 0 si no s&amp;#039;ha rebut cap missatge (no s&amp;#039;ha cridat al &amp;#039;&amp;#039;handler&amp;#039;&amp;#039;) o diferent de 0 si han rebut un missatge. Es pot rebre com a màxim un missatge per crida. La funció &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; ha de tenir la forma:&lt;br /&gt;
&lt;br /&gt;
 void missatge_rebut (SMNGR_client_st  *client,&lt;br /&gt;
                      SMNGR_app_st     *emissor,&lt;br /&gt;
                      SMNGR_message_st *msg)&lt;br /&gt;
 {&lt;br /&gt;
  /* codi d&amp;#039;exemple */&lt;br /&gt;
  if (libsm_msg_num_arguments(msg)&amp;gt;=1 &amp;amp;&amp;amp; !strcmp(libsm_msg_get_argument(msg,0),&amp;quot;HOLA&amp;quot;))&lt;br /&gt;
    SMNGR_send_messagef (client, emissor, &amp;quot;HOLA %d&amp;quot;, emissor-&amp;gt;pid);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On &amp;#039;&amp;#039;client&amp;#039;&amp;#039; es la nostra estructura de registre, &amp;#039;&amp;#039;emissor&amp;#039;&amp;#039; es el identificador de la aplicació que ens envia el missatge (o un servei) i &amp;#039;&amp;#039;msg&amp;#039;&amp;#039; es el contingut del missatge.&lt;br /&gt;
&lt;br /&gt;
Si necessitem passar mes dades al &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; sempre podem fer:&lt;br /&gt;
 SMNGR_set_private_data (&amp;amp;client, (void*) &amp;amp;dades);&lt;br /&gt;
&lt;br /&gt;
i dintre del &amp;#039;&amp;#039;handler&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 void *dades = SMNGR_get_private_data (&amp;amp;client);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serveis ===&lt;br /&gt;
&lt;br /&gt;
Els serveis funcionen de forma similar a les aplicacions normals, a diferència de que no es poden registrar per ells mateixos. Quan una aplicació vol contactar amb un servei (p.e. &amp;#039;&amp;#039;sapocon&amp;#039;&amp;#039; o &amp;#039;&amp;#039;saposnapshot&amp;#039;&amp;#039;), ha de cridar a la funció:&lt;br /&gt;
&lt;br /&gt;
 SMNGR_open_service (client, &amp;quot;sapocon&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Si en aquest moment el servei &amp;#039;&amp;#039;sapocon&amp;#039;&amp;#039; ja es trobava corrent, l&amp;#039;únic efecte d&amp;#039;aquesta crida es que la aplicació queda configurada per parlar amb aquest servei (les aplicacions només poden parlar amb un servei al mateix temps, ho veurem més endavant).&lt;br /&gt;
&lt;br /&gt;
Si no es trobava corrent, s&amp;#039;inicia el procés de càrrega d&amp;#039;un servei:&lt;br /&gt;
#; [[Sapomanager]] busca un binari amb el nom &amp;quot;&amp;#039;&amp;#039;&amp;lt;servei&amp;gt;&amp;#039;&amp;#039;.d&amp;quot; dintre de &amp;#039;&amp;#039;/opt/sapo/lbin/&amp;#039;&amp;#039;&lt;br /&gt;
#: si no el troba la funció &amp;#039;&amp;#039;SMNGR_open_service()&amp;#039;&amp;#039; tornarà error (zero).&lt;br /&gt;
#; [[Sapomanager]] executa el binari del servei. &lt;br /&gt;
#: No cal que aquest binari tingui el bit &amp;#039;&amp;#039;setuid&amp;#039;&amp;#039;, doncs [[Sapomanager]] s&amp;#039;executa com a de superusuari.&lt;br /&gt;
#; El servei crida a la funció &amp;#039;&amp;#039;SMNGR_register_service(&amp;amp;client,&amp;quot;sapocon&amp;quot;);&amp;#039;&amp;#039;&lt;br /&gt;
#: Te 3 segons per executar-se i fer la crida. Ha de fer servir el mateix identificador. Si no es compleix alguna de les dues restriccions, [[Sapomanager]] denegarà el registre. Això es lo que succeirà sempre que executem un servei a mà.&lt;br /&gt;
#: No cal que el servei faci massa configuracions del seu entorn, ni fork() ni res semblant. Es un fill de [[Sapomanager]].&lt;br /&gt;
#; Un cop registrat el servei, la funció &amp;#039;&amp;#039;SMNGR_open_service()&amp;#039;&amp;#039; retornarà diferent de zero.&lt;br /&gt;
&lt;br /&gt;
A partir d&amp;#039;aquest punt, l&amp;#039;aplicació ja pot comunicar-se amb el servei seleccionat amb les funcions:&lt;br /&gt;
 SMNGR_service_message (&amp;amp;client, &amp;quot;HOLA&amp;quot;);&lt;br /&gt;
 SMNGR_service_messagef(&amp;amp;client, &amp;quot;HOLA %s&amp;quot;, &amp;quot;MON&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
La recepció de missatges es idèntica a l&amp;#039;exposat anteriorment. Des de la funció &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; de missatges podem saber si l&amp;#039;emissor d&amp;#039;un missatge es un servei mitjançant l&amp;#039;estructura &amp;#039;&amp;#039;SMNGR_app_st&amp;#039;&amp;#039;: &amp;#039;&amp;#039;emissor-&amp;gt;name&amp;#039;&amp;#039; començarà per &amp;#039;@&amp;#039; (&amp;#039;@sapocon&amp;#039; en el nostre exemple) i &amp;#039;&amp;#039;emissor-&amp;gt;user&amp;#039;&amp;#039;&lt;br /&gt;
serà &amp;quot;@&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Internament un servei es molt senzill. Es registra a [[Sapomanager]], configura una funció &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; de missatges i espera en un bucle a rebre missatges. Pot fer servir altres &amp;#039;&amp;#039;threads&amp;#039;&amp;#039; o executar altres processos o fer &amp;#039;&amp;#039;fork()&amp;#039;&amp;#039;, però la comunicació amb [[Sapomanager]] l&amp;#039;ha de fer sempre des de el procés (i thread) que crida a &amp;#039;&amp;#039;register_service&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Funcions d&amp;#039;utilitat ===&lt;br /&gt;
&lt;br /&gt;
Per facilitar el tractament dels missatges rebuts, es treballa amb una estructura de tipus &amp;#039;&amp;#039;SMNGR_message_st&amp;#039;&amp;#039;. [[Sapomanager]] està dissenyat per fer servir missatges amb arguments separats en espais. La llibreria &amp;#039;&amp;#039;libsapomngr&amp;#039;&amp;#039; fa servir aquest tipus de missatges internament (p.e. &amp;quot;REGISTER carta 3214 adria&amp;quot; o &amp;quot;OPENSRV sapocon&amp;quot;). Els serveis i aplicacions haurien de treballar de forma similar en les seves comunicacions.&lt;br /&gt;
&lt;br /&gt;
Així tenim les funcions de missatges:&lt;br /&gt;
 SMNGR_message_st *msg; /* tenim un missatge &amp;quot;SET Reason I have a problem with my printer&amp;quot; */&lt;br /&gt;
 ...&lt;br /&gt;
 libsm_msg_num_arguments(msg) /* retorna 9 */&lt;br /&gt;
 libsm_msg_get_argument(msg,0) /* retorna &amp;quot;SET&amp;quot; */&lt;br /&gt;
 libsm_msg_get_argument(msg,1) /* retorna &amp;quot;Reason&amp;quot; */&lt;br /&gt;
 libsm_msg_get_rest    (msg,2) /* retorna &amp;quot;I have a problem with my printer&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
Aquestes funcions modifican el missatge original per anar separant els arguments amb &amp;#039;\0&amp;#039; a mesura que els anem demanant. Per això no podem demanar un argument i després demanar la resta des d&amp;#039;aquell mateix argument:&lt;br /&gt;
&lt;br /&gt;
 libsm_msg_get_argument(msg,2) /* retorna &amp;quot;I&amp;quot; */&lt;br /&gt;
 libsm_msg_get_rest    (msg,2) /* retorna &amp;quot;I&amp;quot; */&lt;br /&gt;
 libsm_msg_get_rest    (msg,3) /* retorna &amp;quot;have a problem with my printer&amp;quot; */&lt;br /&gt;
 &lt;br /&gt;
== Comunicacions ==&lt;br /&gt;
&lt;br /&gt;
=== Missatges ===&lt;br /&gt;
&lt;br /&gt;
Els missatges tenen un limit de tamany, &amp;#039;&amp;#039;MAX_MSG_LEN&amp;#039;&amp;#039; (a &amp;#039;&amp;#039;smngr.h&amp;#039;&amp;#039;). Superior a 1024. Els missatges &amp;#039;&amp;#039;&amp;#039;no&amp;#039;&amp;#039;&amp;#039; han de contenir el caràcter &amp;#039;\n&amp;#039; al final, ni a qualsevol altre posició. En la implementació actual, aquest caràcter viatjarà com a part del missatge. Tampoc poden contenir el caràcter &amp;#039;\0&amp;#039; doncs es fa servir per marcar el final del missatge.&lt;br /&gt;
 &lt;br /&gt;
=== Operacions ===&lt;br /&gt;
&lt;br /&gt;
Internament &amp;#039;&amp;#039;libsapomngr&amp;#039;&amp;#039; i el dimoni &amp;#039;&amp;#039;sapomanager&amp;#039;&amp;#039; es comuniquen amb codis d&amp;#039;operació. Aquesta llista es pot ampliar en un futur&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot;&lt;br /&gt;
|+Missatges des d&amp;#039;una aplicació o servei al dimoni&lt;br /&gt;
|APPREG &amp;#039;&amp;#039;&amp;lt;pid&amp;gt;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;lt;nomapp&amp;gt;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;lt;usuari&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
|Registra l&amp;#039;aplicació que l&amp;#039;envia&lt;br /&gt;
|-&lt;br /&gt;
|APPLIST&lt;br /&gt;
|Demana una llista de les aplicacions en curs&lt;br /&gt;
|-&lt;br /&gt;
|ECHO &amp;#039;&amp;#039;[text...]&amp;#039;&amp;#039;&lt;br /&gt;
|El dimoni respon amb el text que segueix&lt;br /&gt;
|-&lt;br /&gt;
|MSG &amp;#039;&amp;#039;&amp;lt;pid&amp;gt;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;lt;text...&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
|Envia el text a la aplicació registrada amb el pid donat&lt;br /&gt;
|SRVOPEN &amp;#039;&amp;#039;&amp;lt;nomservei&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
|Obre el servei demanat&lt;br /&gt;
|-&lt;br /&gt;
|SRVINFO &amp;#039;&amp;#039;&amp;lt;nomservei&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
|Retorna informació sobre el servei demanat&lt;br /&gt;
|-&lt;br /&gt;
|SRVREG &amp;#039;&amp;#039;&amp;lt;pid&amp;gt;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;lt;nomservei&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
|Registra el servei que l&amp;#039;envia&lt;br /&gt;
|-&lt;br /&gt;
|SRVMSG &amp;#039;&amp;#039;&amp;lt;text...&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
|Envia el text al servei al que estiguem associats&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sockets ===&lt;br /&gt;
&lt;br /&gt;
Per la comunicació, &amp;#039;&amp;#039;libsapomngr&amp;#039;&amp;#039; fa servir &amp;#039;&amp;#039;packet&amp;#039;&amp;#039; sockets de la familia &amp;#039;&amp;#039;AF_LOCAL&amp;#039;&amp;#039; (també coneguda com &amp;#039;&amp;#039;AF_UNIX&amp;#039;&amp;#039;). Aquest tipus de sockets es comporten de forma similar als &amp;#039;&amp;#039;UDP&amp;#039;&amp;#039;, de manera que la comunicació es realitza en forma de missatges i no d&amp;#039;stream com a TCP o com els &amp;#039;&amp;#039;pipes&amp;#039;&amp;#039;. Això facilita molt el treball per que no cal delimitar els missatges ni mantenir cap tipus de buffer per cada client. A diferencia d&amp;#039;UDP, aquests sockets garanteixen l&amp;#039;enviament i l&amp;#039;ordenació dels missatges.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A la familia AF_UNIX, els sockets s&amp;#039;identifiquem amb un fitxer a disk, d&amp;#039;un tipus especial (socket). Això no ens dona més que problemes: Fitxers que no s&amp;#039;esborren, que no podem sobreescriure per problema de permisos, dos aplicacions que obren el mateix fitxer a l&amp;#039;hora, etc. Des de Linux 2.2 existeix suport per sockets &amp;#039;&amp;#039;abstractes&amp;#039;&amp;#039;. En comptes d&amp;#039;identificar-los per un fitxer a disk, es pot fer servir un nom unic en el sistema. &lt;br /&gt;
&lt;br /&gt;
Per treballar d&amp;#039;aquesta manera només cal crear el socket (&amp;#039;&amp;#039;bind()&amp;#039;&amp;#039;) indicant el &amp;#039;&amp;#039;sun_path&amp;#039;&amp;#039; de la estructura sockaddr_un que comenci amb &amp;#039;\0&amp;#039;, seguir de l&amp;#039;identificador del socket. Per mostrar al log l&amp;#039;identificador dels sockets, substituim el &amp;#039;\0&amp;#039; incial per un &amp;#039;#&amp;#039;. Així, a [[Sapomanager]] es fan servir els identificadors:&lt;br /&gt;
&lt;br /&gt;
 #CADT.SAPOMANAGER.DAEMON -- per el dimoni&lt;br /&gt;
 #CADT.SAPOMANAGER.CLIENT-pid-nnnn -- per la resta de clients, on &amp;#039;&amp;#039;pid&amp;#039;&amp;#039; es el pid del client i &amp;#039;&amp;#039;nnnn&amp;#039;&amp;#039; es un número aleatori.&lt;br /&gt;
&lt;br /&gt;
D&amp;#039;aquesta manera el [[Sapomanager]] pot saber quan un client mor, si el pid ja no existeix (kill (pid,0)==-1) i el seu identificador de socket es pot fer servir (&amp;#039;&amp;#039;bind()&amp;#039;&amp;#039; a &amp;quot;\0CADT.SAPOMANAGER.CLIENT-pid-nnnn&amp;quot;). Amb fitxers de socket tradicionals no hi ha manera d&amp;#039;estar segurs. &lt;br /&gt;
&lt;br /&gt;
Si es vol compilar els programes per a un sistema no-Linux o anterior a Linux 2.2, cal eliminar el &lt;br /&gt;
 #define USE_ABSTRACT_FILE&lt;br /&gt;
a &amp;#039;&amp;#039;smngr.h&amp;#039;&amp;#039; i relinkar tots els programes que facin servir la llibreria.&lt;br /&gt;
&lt;br /&gt;
== Debug ==&lt;br /&gt;
&lt;br /&gt;
Per veure les comunicacions amb el dimoni [[Sapomanager]], es pot executar amb les opcions -f -x 99. Amb -f no anirà al &amp;#039;&amp;#039;background&amp;#039;&amp;#039;. Primer, es clar, cal matar el dimoni [[Sapomanager]] que ja hi deu haver corrent. Amb un simple kill $(pidof sapomanager) morirà, junt amb els serveis que hi fossin corrent, en un interval de uns 5 segons.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
Les capacitats d&amp;#039;ampliació son molt grans.&lt;/div&gt;</summary>
		<author><name>Cadtsd</name></author>
	</entry>
</feed>