#include <eim.h> int eimListUserAccess(EimHandle * eim, EimAccessUser * accessUser, unsigned int lengthOfListData, EimList * listData, EimRC * eimrc)Service Program Name: QSYS/QSYEIM
The eimListUserAccess() function lists the access groups of which this user is a member.
The list returned contains only the information that the user has authority to access.
EIM_ACCESS_LOCAL_USER | Indicates a local user name on the system that the API is run. The local user name will be converted to the appropriate access id for this system. |
EIM_ACCESS_KERBEROS | Indicates a kerberos principal. The kerberos principal will be converted to the appropriate access id. For example, petejones@therealm will be converted to ibm-kn=petejones@threalm. |
The EimAccessUser structure layout follows:
enum EimAccessUserType { EIM_ACCESS_DN, EIM_ACCESS_KERBEROS, EIM_ACCESS_LOCAL_USER }; typedef struct EimAccessUser { union { char * dn; char * kerberosPrincipal; char * localUser; } user; enum EimAccessUserType userType; } EimAccessUser;
The EimList structure contains information about the returned data. The API will return as much data as space has been provided. The data returned is a linked list of EimUserAccess structures. firstEntry is used to get to the first EimUserAccess structure in the linked list.
EimList structure:
typedef struct EimList { unsigned int bytesReturned; /* Number of bytes actually returned by the API. */ unsigned int bytesAvailable; /* Number of bytes of available data that could have been returned by the API. */ unsigned int entriesReturned; /* Number of entries actually returned by the API. */ unsigned int entriesAvailable; /* Number of entries available to be returned by the API. */ unsigned int firstEntry; /* Displacement to the first linked list entry. This byte offset is relative to the start of the EimList structure. */ } EimList;
EimUserAccess structure:
typedef struct EimUserAccess { unsigned int nextEntry; /* Displacement to next entry. This byte offset is relative to the start of this structure. */ enum EimAccessIndicator eimAdmin; enum EimAccessIndicator eimRegAdmin; enum EimAccessIndicator eimIdenAdmin; enum EimAccessIndicator eimMappingLookup; EimSubList registries; /* EimRegistryName sublist */ enum EimAccessIndicator eimCredentialData; } EimUserAccess;
The registries EimSubList gives addressability to a linked list of EimRegistryName structures.
EimRegistryName structure:
typedef struct EimRegistryName { unsigned int nextEntry; /* Displacement to next entry. This byte offset is relative to the start of this structure. */ EimListData name; /* Name */ } EimRegistryName;
EimSubList structure:
typedef struct EimSubList { unsigned int listNum; /* Number of entries in the list */ unsigned int disp; /* Displacement to sublist. This byte offset is relative to the start of the parent structure; that is, the structure containing this structure. */ } EimSubList;
EimListData structure:
typedef struct EimListData { unsigned int length; /* Length of data */ unsigned int disp; /* Displacement to data. This byte offset is relative to the start of the parent structure; that is, the structure containing this structure. */ } EimListData;
The return value from the API. Following each return value is the list of possible values for the messageCatalogMessageID field in the eimrc parameter for that value.
EIMERR_ACCESS (1) | Insufficient access to EIM data. |
EIMERR_NOLOCK (26) | Unable to allocate internal system object. |
EIMERR_DATA_CONVERSION (13) | Error occurred when converting data between code pages. |
EIMERR_ACCESS_USERTYPE_INVAL (3) | Access user type is not valid. |
EIMERR_EIMLIST_SIZE (16) | Length of EimList is not valid. EimList must be at least 20 bytes in length. |
EIMERR_HANDLE_INVAL (17) | EimHandle is not valid. |
EIMERR_PARM_REQ (34) | Missing required parameter. Please check API documentation. |
EIMERR_PTR_INVAL (35) | Pointer parameter is not valid. |
EIMERR_SPACE (41) | Unexpected error accessing parameter. |
EIMERR_NOMEM (27) | No memory available. Unable to allocate required space. |
EIMERR_NOT_CONN (31) | Not connected to LDAP. Use eimConnect() API and try the request again. |
EIMERR_LDAP_ERR (23) | Unexpected LDAP error. %s |
EIMERR_UNKNOWN (44) | Unknown error or unknown system state. |
See Code disclaimer information for information pertaining to code examples.
The following example lists all registries found.
#include <eim.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> void printListResults(EimList * list); void printSubListData(char * fieldName, void * entry, int offset); void printListData(char * fieldName, void * entry, int offset); int main(int argc, char *argv[]) { int rc; char eimerr[100]; EimRC * err; EimHandle * handle; EimAccessUser user; char listData[5000]; EimList * list = (EimList * ) listData; /* Get eim handle from input arg. */ /* This handle is already connected to EIM. */ handle = (EimHandle *)argv[1]; /* Set up error structure. */ memset(eimerr,0x00,100); err = (EimRC *)eimerr; err->memoryProvidedByCaller = 100; /* Set up access user information */ user.userType = EIM_ACCESS_DN; user.user.dn="cn=pete,o=ibm,c=us"; /* Get user accesses */ if (0 != (rc = eimListUserAccess(handle, &user, 5000, list, err))) { printf("List user access error = %d", rc); return -1; } /* Print the results */ printListResults(list); return 0; } void printListResults(EimList * list) { int i; EimUserAccess * entry; EimListData * listData; EimRegistryName * registry; printf("___________\n"); printf(" bytesReturned = %d\n", list->bytesReturned); printf(" bytesAvailable = %d\n", list->bytesAvailable); printf(" entriesReturned = %d\n", list->entriesReturned); printf(" entriesAvailable = %d\n", list->entriesAvailable); printf("\n"); if (list->entriesReturned > 1) printf("Unexpected number of entries returned.\n"); entry = (EimUserAccess *)((char *)list + list->firstEntry); if (EIM_ACCESS_YES == entry->eimAdmin) printf(" EIM Admin.\n"); if (EIM_ACCESS_YES == entry->eimRegAdmin) printf(" EIM Reg Admin.\n"); if (EIM_ACCESS_YES == entry->eimIdenAdmin) printf(" EIM Iden Admin.\n"); if (EIM_ACCESS_YES == entry->eimMappingLookup) printf(" EIM Mapping Lookup.\n"); if (EIM_ACCESS_YES == entry->eimCredentialData) printf(" EIM Credential Data.\n"); printf(" Registries:\n"); printSubListData("Registry names", entry, offsetof(EimUserAccess, registries)); printf("\n"); } void printSubListData(char * fieldName, void * entry, int offset) { int i; EimSubList * subList; EimRegistryName * subentry; /* Address the EimSubList object */ subList = (EimSubList *)((char *)entry + offset); if (subList->listNum > 0) { subentry = (EimRegistryName *)((char *)entry + subList->disp); for (i = 0; i < subList->listNum; i++) { /* Print out results */ printListData(fieldName, subentry, offsetof(EimRegistryName, name)); /* advance to next entry */ subentry = (EimRegistryName *)((char *)subentry + subentry->nextEntry); } } } void printListData(char * fieldName, void * entry, int offset) { EimListData * listData; char * data; int dataLength; printf(" %s = ",fieldName); /* Address the EimListData object */ listData = (EimListData *)((char *)entry + offset); /* Print out results */ data = (char *)entry + listData->disp; dataLength = listData->length; if (dataLength > 0) printf("%.*s\n",dataLength, data); else printf("Not found.\n"); }
Top | Security APIs | APIs by category |