356
355
#ifdef NDS_SUPPORT
357
/* copied from ndslib.c */
358
static void strcpy_cw(wchar_t *w, const char* s) {
359
while ((*w++ = *(const nuint8*)s++) != 0);
362
NWDSCCODE NWDSCreateContextHandleMnt(NWDSContextHandle* ctx, const NWDSChar * treeName){
356
NWDSCCODE NWDSSetContextHandleTree(NWDSContextHandle ctx, const NWDSChar * treeName)
364
358
#define MAXCONNS 64
366
NWCONN_HANDLE conns[MAXCONNS];
371
union __NWDSAuthInfo * ndai;
373
wchar_t wc_treeName[MAX_DN_CHARS+1];
376
return ERR_NULL_POINTER;
378
strcpy_cw (wc_treeName,treeName);
380
err=NWDSCreateContextHandle (ctx);
384
err= NWCXGetPermConnListByTreeName (conns,MAXCONNS,&curEntries,getuid(),treeName);
386
NWDSFreeContext(*ctx);
389
/* printf ("got %d connexion(s) to %s \n",curEntries,treeName);*/
390
dxh=(*ctx)->ds_connection;
391
if (! dxh){ /* should not be ???*/
392
NWDSFreeContext(*ctx);
395
for (i=0; i <curEntries;i++) {
396
NWCONN_HANDLE conn = conns[i];
397
err=NWDSAddConnection (*ctx,conn);
400
/* printf ("error adding connection \n");*/
404
if (!dxh->authinfo) {
405
/* printf ("trying to get authinfo \n");*/
406
err = ncp_get_private_key(conn, NULL, &authinfo_len);
408
continue; /* kernel without private key support */
410
continue; /* no private key on this connection */
411
ndai = (union __NWDSAuthInfo*)malloc(authinfo_len);
413
continue; /* not enough memory */
414
err = ncp_get_private_key(conn, ndai, &authinfo_len);
419
/* printf ("got authinfo \n");*/
420
mlock(ndai, authinfo_len);
421
dxh->authinfo = ndai;
422
if (dxh->dck.tree_name)
423
free(dxh->dck.tree_name);
424
dxh->dck.tree_name=wcsdup(wc_treeName);
360
NWCONN_HANDLE conns[MAXCONNS];
363
wchar_t treeNameW[MAX_DN_CHARS+1];
364
char treeNameUTF[MAX_DN_CHARS*4 + 1];
367
return ERR_NULL_POINTER;
369
err = NWDSXlateFromCtx(ctx, treeNameW, sizeof(treeNameW), treeName);
372
err = iconv_wchar_t_to_external(treeNameW, treeNameUTF, sizeof(treeNameUTF));
375
err = NWDSSetTreeNameW(ctx, treeNameW);
379
err = NWCXGetPermConnListByTreeName(conns, MAXCONNS, &curEntries, getuid(), treeNameUTF);
383
for (i = 0; i < curEntries; i++) {
384
NWCONN_HANDLE conn = conns[i];
385
err = NWDSAddConnection(ctx, conn);
394
NWDSCCODE NWDSCreateContextHandleMnt(NWDSContextHandle* pctx, const NWDSChar * treeName)
397
NWDSContextHandle ctx;
400
return ERR_NULL_POINTER;
402
err = NWDSCreateContextHandle(&ctx);
405
err = NWDSSetContextHandleTree(ctx, treeName);
407
NWDSFreeContext(ctx);
433
413
//#define NOENV 1 <-- testing reading of .nwinfos file
833
817
and return them as strings with comma separators
834
818
attributes with fields are emitted on a single line with "," as separator*/
836
static NWDSCCODE __docopy_string (NWDSContextHandle ctx, const void* val,
820
static NWDSCCODE __docopy_string (UNUSED(NWDSContextHandle ctx), const void* val,
837
821
const enum SYNTAX synt, size_t currentSize,
838
822
char* result, size_t maxSize){
840
char tmpBuf [MAX_DN_BYTES+1];
842
824
#ifdef DEBUG_PRINT
843
825
printf ("__docopy_string got :%s synt = %d cursize=%d maxsize= %d\n",(char *)val,synt,currentSize,maxSize );
846
if (currentSize >maxSize) return NWE_BUFFER_OVERFLOW;
828
if (currentSize > maxSize) return NWE_BUFFER_OVERFLOW;
847
829
if (!result) return ERR_NULL_POINTER;
849
831
case SYN_DIST_NAME:
851
err = NWDSAbbreviateName(ctx, val, tmpBuf);
854
//strcpy (result,tmpBuf);
855
*************************/
858
832
case SYN_CI_STRING:
859
833
case SYN_CE_STRING:
860
834
case SYN_PR_STRING:
861
835
case SYN_NU_STRING:
862
836
case SYN_TEL_NUMBER:
863
837
case SYN_CLASS_NAME:
838
l = snprintf(result, maxSize, "%s", (const char *)val);
867
841
const Path_T* p = (const Path_T*)val;
868
if (strlen(p->volumeName)+strlen(p->path)+2+2+1>=maxSize)
869
return NWE_BUFFER_OVERFLOW;
870
sprintf(result,"%u,%s,%s", p->nameSpaceType,p->volumeName, p->path);
843
l = snprintf(result, maxSize, "%u,%s,%s", p->nameSpaceType, p->volumeName, p->path);
873
846
case SYN_TYPED_NAME:{
874
847
const Typed_Name_T* tn = (const Typed_Name_T*)val;
875
if (strlen(tn->objectName)+8+8+2+1>=maxSize)
876
return NWE_BUFFER_OVERFLOW;
877
sprintf(result,"%u,%u,%s", tn->interval,tn->level,tn->objectName);
849
l = snprintf(result, maxSize, "%u,%u,%s", tn->interval, tn->level, tn->objectName);
880
852
case SYN_FAX_NUMBER:{
881
853
const Fax_Number_T* fn = (const Fax_Number_T*)val;
882
if (strlen(fn->telephoneNumber)+2+1+1>=maxSize)
883
return NWE_BUFFER_OVERFLOW;
884
sprintf(result,"%s,%u", fn->telephoneNumber,fn->parameters.numOfBits);
855
l = snprintf(result, maxSize, "%s,%u", fn->telephoneNumber, fn->parameters.numOfBits);
887
858
case SYN_EMAIL_ADDRESS:{
888
859
const EMail_Address_T* ea = (const EMail_Address_T*)val;
889
860
/*change the SMTP:aaa@bbbb to SMTP,aaa@bbbb */
890
861
char* p=strchr(ea->address,':');
891
if (strlen(ea->address)+2+1+1>=maxSize)
892
return NWE_BUFFER_OVERFLOW;
895
sprintf(result,"%u,%s", ea->type,ea->address);
864
l = snprintf(result, maxSize, "%u,%s", ea->type, ea->address);
898
867
case SYN_PO_ADDRESS:{
899
868
const NWDSChar* const* pa = (const NWDSChar* const*)val;
903
len +=strlen(pa[n]+1);
905
return NWE_BUFFER_OVERFLOW;
906
sprintf(result,"%s,%s,%s,%s,%s,%s",pa[0],pa[1],pa[2],pa[3],pa[4],pa[5]);
870
l = snprintf(result, maxSize, "%s,%s,%s,%s,%s,%s", pa[0], pa[1], pa[2], pa[3], pa[4], pa[5]);
910
874
const Hold_T* h = (const Hold_T*)val;
911
if (strlen(h->objectName)+8+1+1>=maxSize)
912
return NWE_BUFFER_OVERFLOW;
913
sprintf(result,"%u,%s", h->amount, h->objectName);
876
l = snprintf(result, maxSize, "%u,%s", h->amount, h->objectName);
916
879
case SYN_TIMESTAMP:{
917
880
const TimeStamp_T* stamp = (const TimeStamp_T*)val;
919
return NWE_BUFFER_OVERFLOW;
920
sprintf(result,"%u,%u,%u",stamp->wholeSeconds, stamp->replicaNum,stamp->eventID);
882
l = snprintf(result, maxSize, "%u,%u,%u", stamp->wholeSeconds, stamp->replicaNum, stamp->eventID);
923
885
case SYN_BACK_LINK:{
924
886
const Back_Link_T* bl = (const Back_Link_T*)val;
925
if (strlen(bl->objectName)+8+1+1 >=maxSize)
926
return NWE_BUFFER_OVERFLOW;
927
sprintf(result,"%08X,%s", bl->remoteID, bl->objectName);
888
l = snprintf(result, maxSize, "%08X,%s", bl->remoteID, bl->objectName);
930
891
case SYN_CI_LIST:{
954
915
case SYN_OCTET_LIST:{
955
916
const Octet_List_T* ol = (const Octet_List_T*)val;
958
if ((ol->length+1)*3+1 >=maxSize)
920
if (20 + (ol->length+1)*3+1 >=maxSize)
959
921
return NWE_BUFFER_OVERFLOW;
960
sprintf(result,"%u", ol->length);
922
sprintf(result, "%u", ol->length);
923
aux = result + strlen(result);
961
924
for (i = 0; i < ol->length; i++) {
962
sprintf(aux,",%02X", ol->data[i]);
925
sprintf(aux, ",%02X", ol->data[i]);
967
930
case SYN_OCTET_STRING:{
968
931
const Octet_String_T* os = (const Octet_String_T*)val;
971
934
#ifdef DEBUG_PRINT
972
935
printf ("len %d\n",os->length);
974
if ((os->length+1)*3+1 >=maxSize)
937
if (20 + (os->length+1)*3+1 >=maxSize)
975
938
return NWE_BUFFER_OVERFLOW;
976
sprintf(result,"%u", os->length);
939
sprintf(result, "%u", os->length);
940
aux = result + strlen(result);
977
941
for (i = 0; i < os->length; i++) {
978
sprintf(aux,",%02X", os->data[i]);
942
sprintf(aux, ",%02X", os->data[i]);
983
947
case SYN_NET_ADDRESS:{
984
948
const Net_Address_T* na = (const Net_Address_T*)val;
987
952
z=na->addressLength;
988
if (3*(z+2)+1 >=maxSize)
953
if (40 + 3*(z+2)+1 >=maxSize)
989
954
return NWE_BUFFER_OVERFLOW;
990
sprintf(result,"%u,%u", na->addressType,na->addressLength);
955
sprintf(result, "%u,%u", na->addressType, na->addressLength);
956
aux = result + strlen(result);
991
957
for (z = 0; z < na->addressLength; z++) {
992
sprintf(aux,",%02X", na->address[z]);
958
sprintf(aux, ",%02X", na->address[z]);
997
963
case SYN_OBJECT_ACL:{
998
964
const Object_ACL_T* oacl = (const Object_ACL_T*)val;
999
if (strlen(oacl->protectedAttrName)+strlen(oacl->subjectName)+8+2+1 >=maxSize)
1000
return NWE_BUFFER_OVERFLOW;
1001
sprintf(result,"%s,%s,%08X",oacl->protectedAttrName,oacl->subjectName,oacl->privileges);
966
l = snprintf(result, maxSize, "%s,%s,%08X", oacl->protectedAttrName, oacl->subjectName, oacl->privileges);
972
if (l < 0 || (size_t)l >= maxSize) {
973
return NWE_BUFFER_OVERFLOW;