[LiSA-Devel] CLI questions

Radu Rendec radu.rendec at ines.ro
Mon Jun 15 16:44:57 EEST 2009


Salut,

Ideea structurilor context este legata de layer-ele cli-ului (detalii la
http://lisa.ines.ro/wiki/doku.php?id=cli_arch - e cam "din topor" pagina
aia pentru ca am luat cu copy-paste un fisier txt mai vechi).

Ideea de layer-e presupune ca layer-ele de nivel mai mic sa nu "stie"
nimic de implementarile particulare ale celor de deasupra, in timp ce
cele de deasupra sa poata folosi toata functionalitatea din cele
inferioare.

Pri urmare layer-ul de baza (cli - care se vrea un cli generic, nelegat
de LiSA) defineste o structura de context simpla, doar cu ce are el
nevoie. Layer-ul urmator (readline shell sau rlshell pe scurt) are
nevoie de date specifice lui, prin urmare ar trebui sa "extinda" (in
sensul programarii pe obiecte) structura de baza (cli_context). Cum
suntem in C standard, echivalentul "extinderii" din OOP este nesting-ul
de structuri, adica definim o structura noua care contine ca membru
structura "parinte".

Daca membrul care contine structura "parinte" este primul, atunci avand
un pointer la structura "derivata" putem face cast la un pointer la
structura parinte, putand accesa datele (membrii) ca atare.

Ultimul layer (switch cli - dependent de LiSA) foloseste acelasi
mecanism pentru a adauga date noi in structura, rezultand swcli_context.
Trucul cu primul membru si cast de pointeri se foloseste atunci cand se
apeleaza functii ale layer-elor inferioare (care nu stiu decat de partea
lor din structura).

In realitate structura efectiv alocata este de tip swcli_context (care
le incapsuleaza pe toate celelalte) si este definita ca variabila locala
in main() in swcli.c.

Legat de partea de "open" care iti face tie probleme, asteptam un
raspuns si de la Ionut pentru ca el s-a ocupat mai mult de partea
respectiva.

Radu

On Mon, 2009-06-15 at 00:40 +0300, Faur Andrei wrote:
> Salut,
> 
> Am implementat acum un CLI entry pentru RSTP enable
> per-interfata. Am urmarit modul in care este realizat acest
> lucru in implementarea CDP. Problema pe care o aveam
> era ca mergea enable pe o interfata, insa cand dadeam
> enable pe alta, imi aparea :
> Command rejected: No such file or directory
> 
> Acest lucru se datora urmatoarei bucati de cod din functia
> cmd_rstp_if_set:
> if (!RSTP_SESSION_OPEN(ctx, rstp)) {
>         EX_STATUS_REASON(ctx, "%s", strerror(errno));
>         return CLI_EX_REJECTED;
> }
> 
> Problema e ca la crearea unei noi sesiuni in functia
> rstp_session_start (apelata de macroul .._OPEN) aceasta
> nu se salveaza nicaieri. Astfel, la un al doilea apel, se
> creeaza o noua sesiune ceea ce inseamna de fapt incercarea
> redeschiderii unui capat al cozii de mesaje. Aceasta da fail,
> dat fiind ca aceasta coada a mai fost deschisa deja din acest
> proces. Solutia e simpla, salvam contextul prin uc->rstp = rstp,
> unde uc este un SWCLI_CTX(ctx).
> 
> Toate acestea sunt mirror-images ale codului din cdp asa ca
> ma gandesc ca s-ar putea sa fie un bug in acea zona.
> (:%s/RSTP/CDP/g pentru a identifica functiile CDP echivalente)
> 
> Sau, nu am inteles bine modul in care trebuie lucrat cu
> cli_context si swcli_context, si cele de mai sus de fapt se datoreaza
> unei erori in logica mea.
> 
> Ati putea explica ideea din spatele celor doua structuri de mai sus?
> (*context)
> 
> Andrei
> _______________________________________________
> LiSA-Devel mailing list
> LiSA-Devel at lisa.ines.ro
> http://lisa.ines.ro/mailman/listinfo/lisa-devel



More information about the LiSA-Devel mailing list