Files
Arquivotheca.Solaris-2.5/lib/fn/initial/Table.cc
seta75D 7c4988eac0 Init
2021-10-11 19:38:01 -03:00

171 lines
3.6 KiB
C++
Executable File

/*
* Copyright (c) 1992 - 1994 by Sun Microsystems, Inc.
*/
#pragma ident "@(#)Table.cc 1.4 94/10/03 SMI"
#include "FNSP_InitialContext.hh"
// This file contains the code that implements the FNSP_InitialContext::Table
// class and its IterationPosition subclass.
FNSP_InitialContext::IterationPosition::IterationPosition()
{
position = (void *)new int;
*(int *)position = 0;
}
FNSP_InitialContext::IterationPosition::
IterationPosition(const IterationPosition &src)
{
position = (void *)new int;
*(int *)position = *(int *)src.position;
}
FNSP_InitialContext::IterationPosition&
FNSP_InitialContext::IterationPosition::operator=(const IterationPosition &src)
{
*(int *)position = *(int *)src.position;
return (*this);
}
FNSP_InitialContext::IterationPosition::~IterationPosition()
{
delete position;
}
// return pointer to first entry containing given name
// return 0 if not found
FNSP_InitialContext::Entry*
FNSP_InitialContext::Table::find(const FN_string &name)
{
int i;
// find first entry with given name
for (i = 0; i < size; i++)
if (entry[i]->find_name(name))
return (entry[i]);
return (0);
}
// Return a pointer to the first entry and set iteration pointer.
FNSP_InitialContext::Entry*
FNSP_InitialContext::Table::first(IterationPosition &iter_pos)
{
*(int *)iter_pos.position = 0;
return (entry[0]);
}
// Advance the iteration pointer and return a pointer to the entry
// If the iteration position is out of bounds, return 0.
FNSP_InitialContext::Entry*
FNSP_InitialContext::Table::next(IterationPosition &iter_pos)
{
int &p = *(int *)iter_pos.position;
if ((0 <= p) && (p < (size - 1))) {
p++;
return (entry[p]);
} else {
return (0);
}
}
// Constructor for Table
#include "FNSP_entries.hh"
FNSP_InitialContext::Table::Table()
{
}
FNSP_InitialContext::CustomTable::CustomTable() : Table()
{
// %%% not supported yet
size = 0;
}
FNSP_InitialContext::GlobalTable::GlobalTable() : Table()
{
#ifdef DEBUG
size = 3;
#else
size = 1;
#endif /* DEBUG */
entry = new Entry* [size];
entry[0] = new FNSP_InitialContext_GlobalEntry;
#ifdef DEBUG
entry[1] = new FNSP_InitialContext_GlobalDNSEntry;
entry[2] = new FNSP_InitialContext_GlobalX500Entry;
#endif /* DEBUG */
}
FNSP_InitialContext::HostTable::HostTable() : Table()
{
size = 8;
entry = new Entry* [size];
entry[0] = new FNSP_InitialContext_ThisHostEntry;
entry[1] = new FNSP_InitialContext_HostOrgUnitEntry;
entry[2] = new FNSP_InitialContext_HostOrgEntry;
entry[3] = new FNSP_InitialContext_HostENSEntry;
entry[4] = new FNSP_InitialContext_HostUserEntry;
entry[5] = new FNSP_InitialContext_HostHostEntry;
entry[6] = new FNSP_InitialContext_HostSiteEntry;
entry[7] = new FNSP_InitialContext_HostSiteRootEntry;
}
FNSP_InitialContext::UserTable::UserTable(uid_t uid, UserTable* nxt)
: Table()
{
my_uid = uid;
#ifdef FN_IC_EXTENSIONS
size = 8;
#else
size = 4;
#endif /* FN_IC_EXTENSIONS */
entry = new Entry* [size];
next_table = nxt;
entry[0] = new FNSP_InitialContext_ThisUserEntry(uid);
entry[1] = new FNSP_InitialContext_UserOrgUnitEntry(uid);
entry[2] = new FNSP_InitialContext_UserSiteEntry;
entry[3] = new FNSP_InitialContext_UserENSEntry;
#ifdef FN_IC_EXTENSIONS
entry[4] = new FNSP_InitialContext_UserOrgEntry();
entry[5] = new FNSP_InitialContext_UserUserEntry;
entry[6] = new FNSP_InitialContext_UserHostEntry;
entry[7] = new FNSP_InitialContext_UserSiteRootEntry;
#endif /* FN_IC_EXTENSIONS */
}
const FNSP_InitialContext::UserTable*
FNSP_InitialContext::UserTable::find_user_table(uid_t uid) const
{
if (my_uid == uid)
return (this);
// try next table
if (next_table)
return (next_table->find_user_table(uid));
// no more to try
return (0);
}