Klassenbibliothek
Die Überlegung ist, das die Authoriesierung schnell gehen soll, während die Verwaltung länger Zeit hat.
Die Struktur Cacherecord ist die Speicherstruktur in der Datenbasis
struct CRDienst
{
UINT4 dienst; // Dienste /Userservice
// ( User-service << 16 | Framed-Protokol)
time_t czeit; // Zeit des Cachings
u_int16_t offset; // offset der Nutzdaten vom beginn des Satzes
u_int16_t lang; // Länge der Nutzdaten
};
const UINT4 HDIENSTMASK=0xffff;
inline UINT4 hauptdienst(UINT4 d) { return d & HDIENSTMASK; }
inline UINT4 dienstattr(UINT4 d) { return d >> 16; }
Layout:
---------------------------------------------------------- | zeit | ng | CRDienst |daten | CRDienst | Daten | ..... ----------------------------------------------------------Die eigentliche Speicherstruktur ...
struct Cacherecord
{
u_int32_t ng; // Zahl der Gruppen (größe wegen alignment)
CRDienst data; // Erster Dienst
char rest[1]; // ....
};
Die Verwaltungsstruktur ....
class Cacherecverw
{
Cacherecord *ur;
CRDienst *aktd; // Aktueller Dienst
int aktdnr; // Dienstnummer für Iteration
u_char *ptr; // Aktuelles Attribut in Attributiterator
u_char *eptr; // Zeiger hinter das letzte Attribut
public:
// Initialisierungen
Userrecverw();
Userrecverw(char *buffer);
void init(char *buffer);
void setbuffer(char *buffer);
void clear();
// Abfragen
int totallen();
const Cacherecord *data() { return ur; }
//----- Iteratoren --------
// Dienstiteratoren
CRDienst *ersterdienst();
CRDienst *weitererdienst();
CRDienst *findedienst(UINT4 dn);
int lenreply() { return (aktd ? aktd->lang : 0); }
auth_attr *erstes(CRDienst *d) { return (auth_attr *)((u_char *)ur+d->offset); }
u_char *ende(CRDienst *d) { return (u_char *)ur+d->offset+d->lang; }
// Attributiterator
auth_attr *first(CRDienst *d);
auth_attr *next();
auth_attr *finde(u_char attribut);
//--------- Aufbauiteratoren ------------
void neuerdienst(UINT4 dn);
int add(Attreintrag *attr,char *value);
int add(u_char attribut,char *wert,int len);
int add(u_char attribut,UINT4 w);
int add(auth_attr *a);
//--------- Operationen-----------------
int update(Cacherecverw &upd,Cacherecverw &alt);
//--------- Ausgabe --------------------
void print(ostream &ostr); // bis auf Dienst 0
void print(char *username,ostream &ostr); // invers zu parser
};
Remark:
On some Processorarchitectures like a Sparc-Processor the Alignment of shorts and longs mut be aligned.
Caution when porting: The length of a Servicedescription must be
paded.