2 * Copyright (c) 2009 Secure Endpoints Inc.
4 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 #include <afsconfig.h>
27 #include <afs/param.h>
36 #include "ms-srvsvc.h"
40 #include <WINNT/afsreg.h>
41 #define AFS_VERSION_STRINGS
42 #include "AFS_component_version_number.h"
44 #pragma warning( disable: 4027 ) /* func w/o formal parameter list */
46 /* Do not pull in lmserver.h */
48 // The platform ID indicates the levels to use for platform-specific
51 #define SV_PLATFORM_ID_DOS 300
52 #define SV_PLATFORM_ID_OS2 400
53 #define SV_PLATFORM_ID_NT 500
54 #define SV_PLATFORM_ID_OSF 600
55 #define SV_PLATFORM_ID_VMS 700
56 #define SV_PLATFORM_ID_AFS 800
58 // Bit-mapped values for svX_type fields. X = 1, 2 or 3.
60 #define SV_TYPE_WORKSTATION 0x00000001
61 #define SV_TYPE_SERVER 0x00000002
62 #define SV_TYPE_SQLSERVER 0x00000004
63 #define SV_TYPE_DOMAIN_CTRL 0x00000008
64 #define SV_TYPE_DOMAIN_BAKCTRL 0x00000010
65 #define SV_TYPE_TIME_SOURCE 0x00000020
66 #define SV_TYPE_AFP 0x00000040
67 #define SV_TYPE_NOVELL 0x00000080
68 #define SV_TYPE_DOMAIN_MEMBER 0x00000100
69 #define SV_TYPE_PRINTQ_SERVER 0x00000200
70 #define SV_TYPE_DIALIN_SERVER 0x00000400
71 #define SV_TYPE_XENIX_SERVER 0x00000800
72 #define SV_TYPE_SERVER_UNIX SV_TYPE_XENIX_SERVER
73 #define SV_TYPE_NT 0x00001000
74 #define SV_TYPE_WFW 0x00002000
75 #define SV_TYPE_SERVER_MFPN 0x00004000
76 #define SV_TYPE_SERVER_NT 0x00008000
77 #define SV_TYPE_POTENTIAL_BROWSER 0x00010000
78 #define SV_TYPE_BACKUP_BROWSER 0x00020000
79 #define SV_TYPE_MASTER_BROWSER 0x00040000
80 #define SV_TYPE_DOMAIN_MASTER 0x00080000
81 #define SV_TYPE_SERVER_OSF 0x00100000
82 #define SV_TYPE_SERVER_VMS 0x00200000
83 #define SV_TYPE_WINDOWS 0x00400000 /* Windows95 and above */
84 #define SV_TYPE_DFS 0x00800000 /* Root of a DFS tree */
85 #define SV_TYPE_CLUSTER_NT 0x01000000 /* NT Cluster */
86 #define SV_TYPE_TERMINALSERVER 0x02000000 /* Terminal Server(Hydra) */
87 #define SV_TYPE_CLUSTER_VS_NT 0x04000000 /* NT Cluster Virtual Server Name */
88 #define SV_TYPE_DCE 0x10000000 /* IBM DSS (Directory and Security Services) or equivalent */
89 #define SV_TYPE_ALTERNATE_XPORT 0x20000000 /* return list for alternate transport */
90 #define SV_TYPE_LOCAL_LIST_ONLY 0x40000000 /* Return local list only */
91 #define SV_TYPE_DOMAIN_ENUM 0x80000000
92 #define SV_TYPE_ALL 0xFFFFFFFF /* handy for NetServerEnum2 */
94 // Values of svX_hidden field. X = 2 or 3.
99 NET_API_STATUS NetrConnectionEnum(
100 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
101 /* [unique][string][in] */ WCHAR *Qualifier,
102 /* [out][in] */ LPCONNECT_ENUM_STRUCT InfoStruct,
103 /* [in] */ DWORD PreferedMaximumLength,
104 /* [out] */ DWORD *TotalEntries,
105 /* [unique][out][in] */ DWORD *ResumeHandle)
107 osi_Log0(afsd_logp, "NetrConnectionEnum not supported");
108 return ERROR_NOT_SUPPORTED;
111 NET_API_STATUS NetrFileEnum(
112 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
113 /* [unique][string][in] */ WCHAR *BasePath,
114 /* [unique][string][in] */ WCHAR *UserName,
115 /* [out][in] */ PFILE_ENUM_STRUCT InfoStruct,
116 /* [in] */ DWORD PreferedMaximumLength,
117 /* [out] */ DWORD *TotalEntries,
118 /* [unique][out][in] */ DWORD *ResumeHandle)
120 osi_Log0(afsd_logp, "NetrFileEnum not supported");
121 return ERROR_NOT_SUPPORTED;
124 NET_API_STATUS NetrFileGetInfo(
125 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
126 /* [in] */ DWORD FileId,
127 /* [in] */ DWORD Level,
128 /* [switch_is][out] */ LPFILE_INFO InfoStruct)
130 osi_Log0(afsd_logp, "NetrFileGetInfo not supported");
131 return ERROR_NOT_SUPPORTED;
134 NET_API_STATUS NetrFileClose(
135 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
136 /* [in] */ DWORD FileId)
138 osi_Log0(afsd_logp, "NetrFileClose not supported");
139 return ERROR_NOT_SUPPORTED;
142 NET_API_STATUS NetrSessionEnum(
143 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
144 /* [unique][string][in] */ WCHAR *ClientName,
145 /* [unique][string][in] */ WCHAR *UserName,
146 /* [out][in] */ PSESSION_ENUM_STRUCT InfoStruct,
147 /* [in] */ DWORD PreferedMaximumLength,
148 /* [out] */ DWORD *TotalEntries,
149 /* [unique][out][in] */ DWORD *ResumeHandle)
151 osi_Log0(afsd_logp, "NetrSessionEnum not supported");
152 return ERROR_NOT_SUPPORTED;
155 NET_API_STATUS NetrSessionDel(
156 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
157 /* [unique][string][in] */ WCHAR *ClientName,
158 /* [unique][string][in] */ WCHAR *UserName)
160 osi_Log0(afsd_logp, "NetrSessionDel not supported");
161 return ERROR_NOT_SUPPORTED;
164 NET_API_STATUS NetrShareAdd(
165 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
166 /* [in] */ DWORD Level,
167 /* [switch_is][in] */ LPSHARE_INFO InfoStruct,
168 /* [unique][out][in] */ DWORD *ParmErr)
170 osi_Log0(afsd_logp, "NetrShareAdd not supported");
171 return ERROR_NOT_SUPPORTED;
175 NetrIntGenerateShareRemark(cm_scache_t *scp, cm_fid_t *fidp)
177 wchar_t remark[1536], *s, *wcellname, *wmp;
182 cellp = cm_FindCellByID(fidp->cell, CM_FLAG_NOPROBE);
185 wcellname = cm_FsStringToClientStringAlloc(cellp->name, -1, NULL);
190 switch (scp->fileType) {
192 hr = StringCchPrintfW( remark,
193 sizeof(remark)/sizeof(remark[0]),
194 L"AFS File (%s:%u.%u.%u)",
197 scp->fid.vnode, scp->fid.unique);
201 s = wcsdup(L"AFS File");
204 hr = StringCchPrintfW( remark,
205 sizeof(remark)/sizeof(remark[0]),
206 L"AFS Directory (%s:%u.%u.%u)",
209 scp->fid.vnode, scp->fid.unique);
213 s = wcsdup(L"AFS Directory");
216 wmp = cm_FsStringToClientStringAlloc(scp->mountPointStringp, -1, NULL);
217 hr = StringCchPrintfW( remark,
218 sizeof(remark)/sizeof(remark[0]),
219 L"AFS Symlink to %s",
224 s = wcsdup(L"AFS Symlink");
229 b = (strchr(scp->mountPointStringp, ':') != NULL);
230 wmp = cm_FsStringToClientStringAlloc(scp->mountPointStringp, -1, NULL);
231 hr = StringCchPrintfW( remark,
232 sizeof(remark)/sizeof(remark[0]),
233 L"AFS MountPoint to %s%s%s%s",
241 s = wcsdup(L"AFS MountPoint");
246 wmp = cm_FsStringToClientStringAlloc(scp->mountPointStringp, -1, NULL);
247 hr = StringCchPrintfW( remark,
248 sizeof(remark)/sizeof(remark[0]),
249 L"AFS Dfslink to %s",
254 s = wcsdup(L"AFS DfsLink");
259 hr = StringCchPrintfW( remark,
260 sizeof(remark)/sizeof(remark[0]),
261 L"AFS Object (%s:%u.%u.%u)",
264 scp->fid.vnode, scp->fid.unique);
268 s = wcsdup(L"AFS Object");
271 if (fidp->vnode & 1) {
272 hr = StringCchPrintfW( remark,
273 sizeof(remark)/sizeof(remark[0]),
274 L"AFS Directory (%s:%u.%u.%u)",
277 fidp->vnode, fidp->unique);
281 s = wcsdup(L"AFS Directory");
283 hr = StringCchPrintfW( remark,
284 sizeof(remark)/sizeof(remark[0]),
285 L"AFS Object (%s:%u.%u.%u)",
288 fidp->vnode, fidp->unique);
292 s = wcsdup(L"AFS Object");
295 if (cellp && wcellname)
301 NetrIntGenerateSharePath(wchar_t *ServerName, cm_fid_t *fidp)
303 wchar_t remark[1536], *s, *wcellname;
307 cellp = cm_FindCellByID(fidp->cell, CM_FLAG_NOPROBE);
310 wcellname = cm_FsStringToClientStringAlloc(cellp->name, -1, NULL);
314 for ( s=ServerName; *s == '\\' || *s == '/'; s++);
315 hr = StringCchPrintfW( remark,
316 sizeof(remark)/sizeof(remark[0]),
317 L"\\\\%s\\%s\\%u.%u.%u",
320 fidp->vnode, fidp->unique);
326 if (cellp && wcellname)
331 typedef struct netr_share_enum {
335 cm_direnum_t *direnump;
338 static osi_queue_t * shareEnumQ = NULL;
339 static osi_mutex_t shareEnum_mx;
340 static DWORD shareEnum_next_handle=1;
343 RPC_SRVSVC_Init(void)
347 OSVERSIONINFO osInfo;
349 osInfo.dwOSVersionInfoSize = sizeof(osInfo);
350 if (GetVersionEx(&osInfo)) {
351 if ((osInfo.dwMajorVersion > 5) ||
352 (osInfo.dwMajorVersion == 5) && (osInfo.dwMinorVersion >= 1))
359 lock_InitializeMutex(&shareEnum_mx, "NetrShareEnum", 0);
363 rand_s(&shareEnum_next_handle);
367 srand((unsigned) time( NULL ));
368 shareEnum_next_handle = rand();
373 RPC_SRVSVC_Shutdown(void)
375 netr_share_enum_t *enump;
377 lock_ObtainMutex(&shareEnum_mx);
379 enump = (netr_share_enum_t *)shareEnumQ;
380 cm_BPlusDirFreeEnumeration(enump->direnump);
381 osi_QRemove(&shareEnumQ, (osi_queue_t *)enump);
384 lock_FinalizeMutex(&shareEnum_mx);
388 RPC_SRVSVC_ShareEnumAgeCheck(void) {
389 netr_share_enum_t *enump, *enumnp;
392 lock_ObtainMutex(&shareEnum_mx);
394 for (enump = (netr_share_enum_t *)shareEnumQ;
395 enump; enump = enumnp) {
396 enumnp = (netr_share_enum_t *) osi_QNext(&(enump->q));
397 if (now > enump->cleanup_time)
398 osi_QRemove(&shareEnumQ, (osi_queue_t *)enump);
400 lock_ReleaseMutex(&shareEnum_mx);
403 static cm_direnum_t *
404 RPC_SRVSVC_ShareEnumFind(DWORD ResumeHandle) {
405 netr_share_enum_t *enump;
407 lock_ObtainMutex(&shareEnum_mx);
408 for (enump = (netr_share_enum_t *)shareEnumQ;
410 enump = (netr_share_enum_t *) osi_QNext(&enump->q)) {
411 if (ResumeHandle == enump->handle)
414 lock_ReleaseMutex(&shareEnum_mx);
416 return enump ? enump->direnump : NULL;
420 RPC_SRVSVC_ShareEnumSave(cm_direnum_t *direnump) {
421 netr_share_enum_t *enump = (netr_share_enum_t *)malloc(sizeof(netr_share_enum_t));
426 lock_ObtainMutex(&shareEnum_mx);
427 enump->cleanup_time = time(NULL) + 300;
428 enump->handle = shareEnum_next_handle++;
429 if (shareEnum_next_handle == 0xFFFFFFFF)
430 shareEnum_next_handle = 1;
431 enump->direnump = direnump;
432 osi_QAdd(&shareEnumQ, (osi_queue_t *)enump);
433 lock_ReleaseMutex(&shareEnum_mx);
435 return enump->handle;
439 RPC_SRVSVC_ShareEnumRemove(cm_direnum_t *direnump) {
440 netr_share_enum_t *enump;
442 lock_ObtainMutex(&shareEnum_mx);
443 for (enump = (netr_share_enum_t *)shareEnumQ;
445 enump = (netr_share_enum_t *) osi_QNext(&enump->q)) {
446 if (direnump == enump->direnump) {
447 osi_QRemove(&shareEnumQ, (osi_queue_t *)enump);
451 lock_ReleaseMutex(&shareEnum_mx);
454 NET_API_STATUS NetrShareEnum(
455 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
456 /* [out][in] */ LPSHARE_ENUM_STRUCT InfoStruct,
457 /* [in] */ DWORD PreferedMaximumLength,
458 /* [out] */ DWORD *TotalEntries,
459 /* [unique][out][in] */ DWORD *ResumeHandle)
461 cm_direnum_t *enump = NULL;
462 cm_direnum_entry_t * entryp = NULL;
464 cm_user_t *userp = MSRPC_GetCmUser();
467 afs_uint32 count = 0;
469 afs_uint32 old_enum = 0;
470 size_t space_limited = 0;
471 size_t space_available = 0;
472 afs_uint32 first_entry = 1;
474 osi_Log1(afsd_logp, "NetrShareEnum level %u", InfoStruct->Level);
478 dscp = cm_RootSCachep(userp, &req);
480 RPC_SRVSVC_ShareEnumAgeCheck();
482 /* We only support one server name so ignore 'ServerName'. */
484 /* Test for unsupported level early */
485 switch (InfoStruct->Level) {
491 return ERROR_INVALID_LEVEL;
494 if (ResumeHandle && *ResumeHandle == 0xFFFFFFFF) {
495 /* No More Entries */
496 InfoStruct->ShareInfo.Level0->EntriesRead = 0;
497 return ERROR_NO_MORE_FILES;
500 /* get the directory size */
502 lock_ObtainWrite(&dscp->rw);
503 code = cm_SyncOp(dscp, NULL, userp, &req, PRSFS_LOOKUP,
504 CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
506 lock_ReleaseWrite(&dscp->rw);
507 cm_ReleaseSCache(dscp);
508 osi_Log1(afsd_logp, "NetShareEnum cm_SyncOp failure code=0x%x", code);
512 cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
513 lock_ReleaseWrite(&dscp->rw);
515 if (dscp->fileType != CM_SCACHETYPE_DIRECTORY) {
516 cm_ReleaseSCache(dscp);
517 osi_Log1(afsd_logp, "NetShareEnum Not a Directory dscp=0x%p", dscp);
518 return ERROR_DIRECTORY;
522 * If there is no enumeration handle, then this is a new query
523 * and we must perform an enumeration for the specified object
525 if (ResumeHandle == NULL || *ResumeHandle == 0) {
528 code = cm_BeginDirOp(dscp, userp, &req, CM_DIRLOCK_READ,
529 CM_DIROP_FLAG_NONE, &dirop);
531 code = cm_BPlusDirEnumerate(dscp, userp, &req, TRUE, NULL, TRUE, &enump);
533 osi_Log1(afsd_logp, "NetShareEnum cm_BPlusDirEnumerate failure code=0x%x",
538 osi_Log1(afsd_logp, "NetShareEnum cm_BeginDirOp failure code=0x%x",
543 enump = RPC_SRVSVC_ShareEnumFind(*ResumeHandle);
548 cm_ReleaseSCache(dscp);
549 osi_Log0(afsd_logp, "NetShareEnum No Enumeration Present");
551 return (code ? ERROR_BUSY : ERROR_SUCCESS);
555 * Do not exceed PreferredMaximumLength in any response.
556 * 0xFFFFFFFF means no limit.
558 * *TotalEntries is a hint of the total entries in the
559 * enumeration. It does not have to be exact. It is
560 * the same for each response in an enum.
562 * If *ResumeHandle == 0, this is an initial call
564 * The algorithm will be to enumerate the list of share
565 * names based upon the contents of the root.afs root
566 * directory. We will ignore SMB submount names.
567 * The enumeration will be valid for five minutes. If
568 * the enumeration is not destroyed within that time period
569 * it will be automatically garbage collected.
573 * How much space do we need and do we have that much room?
575 * If a preferred maximum length is specified, then we must
576 * manage the number of bytes we return in order to restrict
577 * it to a value smaller than then the preferred. This includes
578 * not only the InfoStruct but also the allocated SHARE_INFO
579 * buffer and the various C strings. We are not permitted to
580 * send incomplete values so we will send a value that is close.
582 if (PreferedMaximumLength != 0xFFFFFFFF) {
584 space_available = PreferedMaximumLength;
587 switch (InfoStruct->Level) {
590 space_available -= sizeof(InfoStruct->ShareInfo.Level2);
591 InfoStruct->ShareInfo.Level2->Buffer = MIDL_user_allocate((enump->count - enump->next) * sizeof(SHARE_INFO_2));
595 space_available -= sizeof(InfoStruct->ShareInfo.Level1);
596 InfoStruct->ShareInfo.Level1->Buffer = MIDL_user_allocate((enump->count - enump->next) * sizeof(SHARE_INFO_1));
600 space_available -= sizeof(InfoStruct->ShareInfo.Level0);
601 InfoStruct->ShareInfo.Level0->Buffer = MIDL_user_allocate((enump->count - enump->next) * sizeof(SHARE_INFO_0));
605 if (InfoStruct->ShareInfo.Level0->Buffer == NULL) {
606 cm_ReleaseSCache(dscp);
607 cm_BPlusDirFreeEnumeration(enump);
608 osi_Log0(afsd_logp, "NetShareEnum No Enumeration Present");
609 return ERROR_NOT_ENOUGH_MEMORY;
616 code = cm_BPlusDirPeekNextEnumEntry(enump, &entryp);
618 code = cm_BPlusDirNextEnumEntry(enump, &entryp);
619 if (code != 0 && code != CM_ERROR_STOPNOW || entryp == NULL)
622 stopnow = (code == CM_ERROR_STOPNOW);
624 if ( !wcscmp(L".", entryp->name) || !wcscmp(L"..", entryp->name) ) {
625 osi_Log0(afsd_logp, "NetShareEnum skipping . or ..");
627 cm_BPlusDirNextEnumEntry(enump, &entryp);
631 cm_GetSCache(&entryp->fid, NULL, &scp, userp, &req);
633 switch (InfoStruct->Level) {
635 /* for share level security */
636 InfoStruct->ShareInfo.Level2->Buffer[count].shi2_permissions = 0;
637 InfoStruct->ShareInfo.Level2->Buffer[count].shi2_max_uses = -1;
638 InfoStruct->ShareInfo.Level2->Buffer[count].shi2_current_uses = 0;
639 InfoStruct->ShareInfo.Level2->Buffer[count].shi2_path =
640 NetrIntGenerateSharePath(ServerName, &entryp->fid);
641 /* must be the empty string */
642 InfoStruct->ShareInfo.Level2->Buffer[count].shi2_passwd = wcsdup(L"");
644 InfoStruct->ShareInfo.Level2->Buffer[count].shi2_type = STYPE_DISKTREE;
645 InfoStruct->ShareInfo.Level2->Buffer[count].shi2_remark =
646 NetrIntGenerateShareRemark(scp, &entryp->fid);
647 InfoStruct->ShareInfo.Level2->Buffer[count].shi2_netname = wcsdup(entryp->name);
650 InfoStruct->ShareInfo.Level1->Buffer[count].shi1_type = STYPE_DISKTREE;
651 InfoStruct->ShareInfo.Level1->Buffer[count].shi1_remark =
652 NetrIntGenerateShareRemark(scp, &entryp->fid);
653 InfoStruct->ShareInfo.Level1->Buffer[count].shi1_netname = wcsdup(entryp->name);
656 InfoStruct->ShareInfo.Level0->Buffer[count].shi0_netname = wcsdup(entryp->name);
660 cm_ReleaseSCache(scp);
665 * If space is limited, we need to determine if there is room
666 * for the next entry but always send at least one.
668 switch (InfoStruct->Level) {
670 space_used = sizeof(InfoStruct->ShareInfo.Level2->Buffer[count]) +
671 (wcslen(InfoStruct->ShareInfo.Level2->Buffer[count].shi2_path) + 1) * sizeof(wchar_t) +
672 sizeof(wchar_t) + /* passwd */
673 (wcslen(InfoStruct->ShareInfo.Level2->Buffer[count].shi2_remark) + 1) * sizeof(wchar_t) +
674 (wcslen(InfoStruct->ShareInfo.Level2->Buffer[count].shi2_netname) + 1) * sizeof(wchar_t);
677 space_used = sizeof(InfoStruct->ShareInfo.Level1->Buffer[count]) +
678 (wcslen(InfoStruct->ShareInfo.Level1->Buffer[count].shi1_remark) + 1) * sizeof(wchar_t) +
679 (wcslen(InfoStruct->ShareInfo.Level1->Buffer[count].shi1_netname) + 1) * sizeof(wchar_t);
682 space_used = sizeof(InfoStruct->ShareInfo.Level0->Buffer[count]) +
683 (wcslen(InfoStruct->ShareInfo.Level0->Buffer[count].shi0_netname) + 1) * sizeof(wchar_t);
687 if (!first_entry && space_used > space_available)
690 /* Now consume the entry */
691 cm_BPlusDirNextEnumEntry(enump, &entryp);
692 space_available -= space_used;
697 InfoStruct->ShareInfo.Level0->EntriesRead = count;
698 *TotalEntries = enump->count;
700 cm_ReleaseSCache(dscp);
702 if (code || enump->next == enump->count || ResumeHandle == NULL) {
704 RPC_SRVSVC_ShareEnumRemove(enump);
705 cm_BPlusDirFreeEnumeration(enump);
707 *ResumeHandle = 0xFFFFFFFF;
708 return (code || enump->next == enump->count) ? 0 : ERROR_MORE_DATA;
710 *ResumeHandle = RPC_SRVSVC_ShareEnumSave(enump);
711 return ERROR_MORE_DATA;
715 NET_API_STATUS NetrShareGetInfo(
716 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
717 /* [string][in] */ WCHAR *NetName,
718 /* [in] */ DWORD Level,
719 /* [switch_is][out] */ LPSHARE_INFO InfoStruct)
722 cm_scache_t * scp = NULL;
723 cm_user_t *userp = MSRPC_GetCmUser();
726 NET_API_STATUS status = 0;
728 /* make room for '/@vol:' + mountchar + NULL terminator*/
729 clientchar_t pathstr[CELL_MAXNAMELEN + VL_MAXNAMELEN + 1 + CM_PREFIX_VOL_CCH];
732 osi_Log1(afsd_logp, "NetrShareGetInfo level %u", Level);
736 dscp = cm_RootSCachep(userp, &req);
738 InfoStruct->ShareInfo0 = NULL;
742 * 1.a an entry in the root.afs volume root directory
743 * 1.b an entry in the Freelance volume root directory
744 * 2. A volume reference: <cell><type><volume>
745 * 3. an SMB Submount name
746 * 4. a cell name that we do not yet have an entry
747 * for in the Freelance volume root directory
751 * To obtain the needed information for the response we
752 * need to obtain the cm_scache_t entry. First check to
753 * see if the NetName is a volume reference, then check
754 * if the NetName is an entry in the root volume root
755 * directory, finally we can check the SMB Submounts.
756 * Volume references and SMB submounts are not advertised
757 * as part of the Share enumerations but we should provide
758 * Share info for them nevertheless. Same for the secret
762 /* Check for volume references
764 * They look like <cell>{%,#}<volume>
766 if (cm_ClientStrChr(NetName, '%') != NULL ||
767 cm_ClientStrChr(NetName, '#') != NULL)
769 osi_Log1(afsd_logp, "NetrShareGetInfo found volume reference [%S]",
770 osi_LogSaveClientString(afsd_logp, NetName));
772 cm_ClientStrPrintfN(pathstr, lengthof(pathstr),
773 _C(CM_PREFIX_VOL) _C("%s"), NetName);
774 code = cm_Lookup(dscp, pathstr, 0, userp, &req, &scp);
775 } else if (cm_ClientStrCmpI(NetName, L"ALL") == 0) {
776 DWORD allSubmount = 1;
778 /* if allSubmounts == 0, only return the //mountRoot/all share
779 * if in fact it has been been created in the subMounts table.
780 * This is to allow sites that want to restrict access to the
783 code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
784 0, KEY_QUERY_VALUE, &parmKey);
785 if (code == ERROR_SUCCESS) {
786 cblen = sizeof(allSubmount);
787 code = RegQueryValueEx(parmKey, "AllSubmount", NULL, NULL,
788 (BYTE *) &allSubmount, &cblen);
789 if (code != ERROR_SUCCESS) {
792 RegCloseKey (parmKey);
800 code = CM_ERROR_NOSUCHPATH;
804 * Could be a Submount, a directory entry, or a cell name we
805 * have yet to create an entry for.
808 /* Try a directory entry first */
809 code = cm_Lookup(dscp, NetName, CM_FLAG_NOMOUNTCHASE,
811 if (code && code != CM_ERROR_NOACCESS)
812 code = cm_Lookup(dscp, NetName, CM_FLAG_CASEFOLD | CM_FLAG_NOMOUNTCHASE,
815 if (scp == NULL && code != CM_ERROR_NOACCESS) { /* Try a submount */
816 code = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\OpenAFS\\Client\\Submounts",
817 0, KEY_QUERY_VALUE, &parmKey);
818 if (code == ERROR_SUCCESS) {
819 cblen = sizeof(pathstr);
820 code = RegQueryValueExW(parmKey, NetName, NULL, NULL,
821 (BYTE *) pathstr, &cblen);
822 if (code != ERROR_SUCCESS)
824 RegCloseKey (parmKey);
830 code = cm_NameI(dscp, pathstr, CM_FLAG_FOLLOW, userp, NULL, &req, &scp);
831 if (code == CM_ERROR_NOSUCHFILE ||
832 code == CM_ERROR_NOSUCHPATH ||
833 code == CM_ERROR_BPLUS_NOMATCH)
834 code = cm_NameI(dscp, pathstr, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
835 userp, NULL, &req, &scp);
837 code = CM_ERROR_NOSUCHPATH;
843 /* Allocate the memory for the response */
846 InfoStruct->ShareInfo2 = MIDL_user_allocate(sizeof(SHARE_INFO_2));
849 InfoStruct->ShareInfo1 = MIDL_user_allocate(sizeof(SHARE_INFO_1));
852 InfoStruct->ShareInfo0 = MIDL_user_allocate(sizeof(SHARE_INFO_0));
861 cm_ReleaseSCache(scp);
862 return HRESULT_FROM_WIN32(ERROR_INVALID_LEVEL);
865 if (InfoStruct->ShareInfo0 == NULL) {
866 cm_ReleaseSCache(scp);
867 return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
872 /* for share level security */
873 InfoStruct->ShareInfo2->shi2_permissions = 0;
874 InfoStruct->ShareInfo2->shi2_max_uses = -1;
875 InfoStruct->ShareInfo2->shi2_current_uses = 0;
876 InfoStruct->ShareInfo2->shi2_path =
877 NetrIntGenerateSharePath(ServerName, &scp->fid);
878 /* must be the empty string */
879 InfoStruct->ShareInfo2->shi2_passwd = wcsdup(L"");
882 InfoStruct->ShareInfo1->shi1_type = STYPE_DISKTREE;
883 InfoStruct->ShareInfo1->shi1_remark =
884 NetrIntGenerateShareRemark(scp, &scp->fid);
887 /* Canonicalized version of NetName parameter */
888 InfoStruct->ShareInfo0->shi0_netname = wcsdup(NetName);
897 status = ERROR_INVALID_LEVEL;
899 cm_ReleaseSCache(scp);
902 * The requested object does not exist.
903 * Return the correct NERR or Win32 Error.
905 smb_MapWin32Error(code, &status);
907 case ERROR_FILE_NOT_FOUND:
908 case ERROR_PATH_NOT_FOUND:
909 case ERROR_INVALID_NAME:
910 case ERROR_BAD_NETPATH:
911 status = NERR_NetNameNotFound;
918 NET_API_STATUS NetrShareSetInfo(
919 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
920 /* [string][in] */ WCHAR *NetName,
921 /* [in] */ DWORD Level,
922 /* [switch_is][in] */ LPSHARE_INFO ShareInfo,
923 /* [unique][out][in] */ DWORD *ParmErr)
925 osi_Log0(afsd_logp, "NetrShareSetInfo not supported");
926 return ERROR_NOT_SUPPORTED;
929 NET_API_STATUS NetrShareDel(
930 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
931 /* [string][in] */ WCHAR *NetName,
932 /* [in] */ DWORD Reserved)
934 osi_Log0(afsd_logp, "NetrShareDel not supported");
935 return ERROR_NOT_SUPPORTED;
938 NET_API_STATUS NetrShareDelSticky(
939 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
940 /* [string][in] */ WCHAR *NetName,
941 /* [in] */ DWORD Reserved)
943 osi_Log0(afsd_logp, "NetrShareDelSticky not supported");
944 return ERROR_NOT_SUPPORTED;
947 NET_API_STATUS NetrShareCheck(
948 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
949 /* [string][in] */ WCHAR *Device,
950 /* [out] */ DWORD *Type)
952 osi_Log0(afsd_logp, "NetrShareCheck not supported");
953 return ERROR_NOT_SUPPORTED;
956 NET_API_STATUS NetrServerGetInfo(
957 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
958 /* [in] */ DWORD Level,
959 /* [switch_is][out] */ LPSERVER_INFO InfoStruct)
963 osi_Log1(afsd_logp, "NetrServerGetInfo level %u", Level);
965 * How much space do we need and do we have that much room?
966 * For now, just assume we can return everything in one shot
967 * because the reality is that in this function call we do
968 * not know the max size of the RPC response.
972 InfoStruct->ServerInfo103 = MIDL_user_allocate(sizeof(SERVER_INFO_103));
975 InfoStruct->ServerInfo102 = MIDL_user_allocate(sizeof(SERVER_INFO_102));
978 InfoStruct->ServerInfo101 = MIDL_user_allocate(sizeof(SERVER_INFO_101));
981 InfoStruct->ServerInfo100 = MIDL_user_allocate(sizeof(SERVER_INFO_100));
985 if (InfoStruct->ServerInfo100 == NULL) {
986 return ERROR_NOT_ENOUGH_MEMORY;
990 * Remove any leading slashes since they are not part of the
993 for ( s=ServerName; *s == '\\' || *s == '/'; s++);
997 InfoStruct->ServerInfo103->sv103_capabilities = 0;
1000 InfoStruct->ServerInfo102->sv102_users = 0xFFFFFFFF;
1001 InfoStruct->ServerInfo102->sv102_disc = SV_NODISC;
1002 InfoStruct->ServerInfo102->sv102_hidden = SV_HIDDEN;
1003 InfoStruct->ServerInfo102->sv102_announce = 65535;
1004 InfoStruct->ServerInfo102->sv102_anndelta = 0;
1005 InfoStruct->ServerInfo102->sv102_licenses = 0;
1006 InfoStruct->ServerInfo102->sv102_userpath = wcsdup(L"C:\\");
1009 InfoStruct->ServerInfo101->sv101_version_major = AFSPRODUCT_VERSION_MAJOR;
1010 InfoStruct->ServerInfo101->sv101_version_minor = AFSPRODUCT_VERSION_MINOR;
1011 InfoStruct->ServerInfo101->sv101_type = SV_TYPE_WORKSTATION | SV_TYPE_SERVER | SV_TYPE_SERVER_UNIX;
1012 InfoStruct->ServerInfo101->sv101_comment = wcsdup(wAFSVersion);
1015 InfoStruct->ServerInfo100->sv100_platform_id = SV_PLATFORM_ID_AFS;
1016 /* The Netbios Name */
1017 InfoStruct->ServerInfo100->sv100_name = _wcsupr(wcsdup(s));
1067 return ERROR_INVALID_LEVEL;
1072 NET_API_STATUS NetrServerSetInfo(
1073 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1074 /* [in] */ DWORD Level,
1075 /* [switch_is][in] */ LPSERVER_INFO ServerInfo,
1076 /* [unique][out][in] */ DWORD *ParmErr)
1078 osi_Log0(afsd_logp, "NetrServerSetInfo not supported");
1079 return ERROR_NOT_SUPPORTED;
1082 NET_API_STATUS NetrServerDiskEnum(
1083 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1084 /* [in] */ DWORD Level,
1085 /* [out][in] */ DISK_ENUM_CONTAINER *DiskInfoStruct,
1086 /* [in] */ DWORD PreferedMaximumLength,
1087 /* [out] */ DWORD *TotalEntries,
1088 /* [unique][out][in] */ DWORD *ResumeHandle)
1090 osi_Log0(afsd_logp, "NetrServerDiskEnum not supported");
1091 return ERROR_NOT_SUPPORTED;
1094 NET_API_STATUS NetrServerStatisticsGet(
1095 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1096 /* [unique][string][in] */ WCHAR *Service,
1097 /* [in] */ DWORD Level,
1098 /* [in] */ DWORD Options,
1099 /* [out] */ LPSTAT_SERVER_0 *InfoStruct)
1101 osi_Log0(afsd_logp, "NetrServerStatisticsGet not supported");
1102 return ERROR_NOT_SUPPORTED;
1105 NET_API_STATUS NetrServerTransportAdd(
1106 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1107 /* [in] */ DWORD Level,
1108 /* [in] */ LPSERVER_TRANSPORT_INFO_0 Buffer)
1110 osi_Log0(afsd_logp, "NetrServerTransportAdd not supported");
1111 return ERROR_NOT_SUPPORTED;
1114 NET_API_STATUS NetrServerTransportEnum(
1115 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1116 /* [out][in] */ LPSERVER_XPORT_ENUM_STRUCT InfoStruct,
1117 /* [in] */ DWORD PreferedMaximumLength,
1118 /* [out] */ DWORD *TotalEntries,
1119 /* [unique][out][in] */ DWORD *ResumeHandle)
1121 osi_Log0(afsd_logp, "NetrServerTransportEnum not supported");
1122 return ERROR_NOT_SUPPORTED;
1125 NET_API_STATUS NetrServerTransportDel(
1126 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1127 /* [in] */ DWORD Level,
1128 /* [in] */ LPSERVER_TRANSPORT_INFO_0 Buffer)
1130 osi_Log0(afsd_logp, "NetrServerTransportDel not supported");
1131 return ERROR_NOT_SUPPORTED;
1134 NET_API_STATUS NetrRemoteTOD(
1135 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1136 /* [out] */ LPTIME_OF_DAY_INFO *BufferPtr)
1138 osi_Log0(afsd_logp, "NetrRemoteTOD not supported");
1139 return ERROR_NOT_SUPPORTED;
1142 NET_API_STATUS NetprPathType(
1143 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1144 /* [string][in] */ WCHAR *PathName,
1145 /* [out] */ DWORD *PathType,
1146 /* [in] */ DWORD Flags)
1148 osi_Log0(afsd_logp, "NetprPathType not supported");
1149 return ERROR_NOT_SUPPORTED;
1152 NET_API_STATUS NetprPathCanonicalize(
1153 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1154 /* [string][in] */ WCHAR *PathName,
1155 /* [size_is][out] */ unsigned char *Outbuf,
1156 /* [range][in] */ DWORD OutbufLen,
1157 /* [string][in] */ WCHAR *Prefix,
1158 /* [out][in] */ DWORD *PathType,
1159 /* [in] */ DWORD Flags)
1161 osi_Log0(afsd_logp, "NetprPathCanonicalize not supported");
1162 return ERROR_NOT_SUPPORTED;
1165 long NetprPathCompare(
1166 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1167 /* [string][in] */ WCHAR *PathName1,
1168 /* [string][in] */ WCHAR *PathName2,
1169 /* [in] */ DWORD PathType,
1170 /* [in] */ DWORD Flags)
1172 osi_Log0(afsd_logp, "NetprPathCompare not supported");
1173 return ERROR_NOT_SUPPORTED;
1176 NET_API_STATUS NetprNameValidate(
1177 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1178 /* [string][in] */ WCHAR *Name,
1179 /* [in] */ DWORD NameType,
1180 /* [in] */ DWORD Flags)
1182 osi_Log0(afsd_logp, "NetprNameValidate not supported");
1183 return ERROR_NOT_SUPPORTED;
1186 NET_API_STATUS NetprNameCanonicalize(
1187 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1188 /* [string][in] */ WCHAR *Name,
1189 /* [size_is][out] */ WCHAR *Outbuf,
1190 /* [range][in] */ DWORD OutbufLen,
1191 /* [in] */ DWORD NameType,
1192 /* [in] */ DWORD Flags)
1194 osi_Log0(afsd_logp, "NetprNameCanonicalize not supported");
1195 return ERROR_NOT_SUPPORTED;
1198 long NetprNameCompare(
1199 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1200 /* [string][in] */ WCHAR *Name1,
1201 /* [string][in] */ WCHAR *Name2,
1202 /* [in] */ DWORD NameType,
1203 /* [in] */ DWORD Flags)
1205 osi_Log0(afsd_logp, "NetprNameCompare not supported");
1206 return ERROR_NOT_SUPPORTED;
1209 NET_API_STATUS NetrShareEnumSticky(
1210 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1211 /* [out][in] */ LPSHARE_ENUM_STRUCT InfoStruct,
1212 /* [in] */ DWORD PreferedMaximumLength,
1213 /* [out] */ DWORD *TotalEntries,
1214 /* [unique][out][in] */ DWORD *ResumeHandle)
1216 osi_Log0(afsd_logp, "NetrShareEnumSticky not supported");
1217 return ERROR_NOT_SUPPORTED;
1220 NET_API_STATUS NetrShareDelStart(
1221 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1222 /* [string][in] */ WCHAR *NetName,
1223 /* [in] */ DWORD Reserved,
1224 /* [out] */ PSHARE_DEL_HANDLE ContextHandle)
1226 osi_Log0(afsd_logp, "NetrShareDelStart not supported");
1227 return ERROR_NOT_SUPPORTED;
1230 NET_API_STATUS NetrShareDelCommit(
1231 /* [out][in] */ PSHARE_DEL_HANDLE ContextHandle)
1233 osi_Log0(afsd_logp, "NetrShareDelCommit not supported");
1234 return ERROR_NOT_SUPPORTED;
1237 DWORD NetrpGetFileSecurity(
1238 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1239 /* [unique][string][in] */ WCHAR *ShareName,
1240 /* [string][in] */ WCHAR *lpFileName,
1241 /* [in] */ SECURITY_INFORMATION RequestedInformation,
1242 /* [out] */ PADT_SECURITY_DESCRIPTOR *SecurityDescriptor)
1244 osi_Log0(afsd_logp, "NetprGetFileSecurity not supported");
1245 return ERROR_NOT_SUPPORTED;
1248 DWORD NetrpSetFileSecurity(
1249 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1250 /* [unique][string][in] */ WCHAR *ShareName,
1251 /* [string][in] */ WCHAR *lpFileName,
1252 /* [in] */ SECURITY_INFORMATION SecurityInformation,
1253 /* [in] */ PADT_SECURITY_DESCRIPTOR SecurityDescriptor)
1255 osi_Log0(afsd_logp, "NetprSetFileSecurity not supported");
1256 return ERROR_NOT_SUPPORTED;
1259 NET_API_STATUS NetrServerTransportAddEx(
1260 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1261 /* [in] */ DWORD Level,
1262 /* [switch_is][in] */ LPTRANSPORT_INFO Buffer)
1264 osi_Log0(afsd_logp, "NetrServerTransportAddEx not supported");
1265 return ERROR_NOT_SUPPORTED;
1268 NET_API_STATUS NetrDfsGetVersion(
1269 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1270 /* [out] */ DWORD *Version)
1272 osi_Log0(afsd_logp, "NetrDfsGetVersion not supported");
1273 return ERROR_NOT_SUPPORTED;
1276 NET_API_STATUS NetrDfsCreateLocalPartition(
1277 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1278 /* [string][in] */ WCHAR *ShareName,
1279 /* [in] */ GUID *EntryUid,
1280 /* [string][in] */ WCHAR *EntryPrefix,
1281 /* [string][in] */ WCHAR *ShortName,
1282 /* [in] */ LPNET_DFS_ENTRY_ID_CONTAINER RelationInfo,
1283 /* [in] */ int Force)
1285 osi_Log0(afsd_logp, "NetrDfsCreateLocalPartition not supported");
1286 return ERROR_NOT_SUPPORTED;
1289 NET_API_STATUS NetrDfsDeleteLocalPartition(
1290 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1291 /* [in] */ GUID *Uid,
1292 /* [string][in] */ WCHAR *Prefix)
1294 osi_Log0(afsd_logp, "NetrDfsDeleteLocalPartition not supported");
1295 return ERROR_NOT_SUPPORTED;
1298 NET_API_STATUS NetrDfsSetLocalVolumeState(
1299 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1300 /* [in] */ GUID *Uid,
1301 /* [string][in] */ WCHAR *Prefix,
1302 /* [in] */ unsigned long State)
1304 osi_Log0(afsd_logp, "NetrDfsSetLocalVolumeState not supported");
1305 return ERROR_NOT_SUPPORTED;
1308 NET_API_STATUS NetrDfsCreateExitPoint(
1309 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1310 /* [in] */ GUID *Uid,
1311 /* [string][in] */ WCHAR *Prefix,
1312 /* [in] */ unsigned long Type,
1313 /* [range][in] */ DWORD ShortPrefixLen,
1314 /* [size_is][string][out] */ WCHAR *ShortPrefix)
1316 osi_Log0(afsd_logp, "NetrDfsCreateExitPoint not supported");
1317 return ERROR_NOT_SUPPORTED;
1320 NET_API_STATUS NetrDfsDeleteExitPoint(
1321 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1322 /* [in] */ GUID *Uid,
1323 /* [string][in] */ WCHAR *Prefix,
1324 /* [in] */ unsigned long Type)
1326 osi_Log0(afsd_logp, "NetrDfsDeleteExitPoint not supported");
1327 return ERROR_NOT_SUPPORTED;
1330 NET_API_STATUS NetrDfsModifyPrefix(
1331 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1332 /* [in] */ GUID *Uid,
1333 /* [string][in] */ WCHAR *Prefix)
1335 osi_Log0(afsd_logp, "NetrDfsModifyPrefix not supported");
1336 return ERROR_NOT_SUPPORTED;
1339 NET_API_STATUS NetrDfsFixLocalVolume(
1340 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1341 /* [string][in] */ WCHAR *VolumeName,
1342 /* [in] */ unsigned long EntryType,
1343 /* [in] */ unsigned long ServiceType,
1344 /* [string][in] */ WCHAR *StgId,
1345 /* [in] */ GUID *EntryUid,
1346 /* [string][in] */ WCHAR *EntryPrefix,
1347 /* [in] */ LPNET_DFS_ENTRY_ID_CONTAINER RelationInfo,
1348 /* [in] */ unsigned long CreateDisposition)
1350 osi_Log0(afsd_logp, "NetrDfsFixLocalVolume not supported");
1351 return ERROR_NOT_SUPPORTED;
1354 NET_API_STATUS NetrDfsManagerReportSiteInfo(
1355 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1356 /* [unique][out][in] */ LPDFS_SITELIST_INFO *ppSiteInfo)
1358 osi_Log0(afsd_logp, "NetrDfsManagerReportSiteInfo not supported");
1359 return ERROR_NOT_SUPPORTED;
1362 NET_API_STATUS NetrServerTransportDelEx(
1363 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1364 /* [in] */ DWORD Level,
1365 /* [switch_is][in] */ LPTRANSPORT_INFO Buffer)
1367 osi_Log0(afsd_logp, "NetrServerTransportDelEx not supported");
1368 return ERROR_NOT_SUPPORTED;
1371 NET_API_STATUS NetrServerAliasAdd(
1372 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1373 /* [in] */ DWORD Level,
1374 /* [switch_is][in] */ LPSERVER_ALIAS_INFO InfoStruct)
1376 osi_Log0(afsd_logp, "NetrServerAliasAdd not supported");
1377 return ERROR_NOT_SUPPORTED;
1380 NET_API_STATUS NetrServerAliasEnum(
1381 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1382 /* [out][in] */ LPSERVER_ALIAS_ENUM_STRUCT InfoStruct,
1383 /* [in] */ DWORD PreferedMaximumLength,
1384 /* [out] */ LPDWORD TotalEntries,
1385 /* [unique][out][in] */ LPDWORD ResumeHandle)
1387 osi_Log0(afsd_logp, "NetrServerAliasEnum not supported");
1388 return ERROR_NOT_SUPPORTED;
1391 NET_API_STATUS NetrServerAliasDel(
1392 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1393 /* [in] */ DWORD Level,
1394 /* [switch_is][in] */ LPSERVER_ALIAS_INFO InfoStruct)
1396 osi_Log0(afsd_logp, "NetrServerAliasDel not supported");
1397 return ERROR_NOT_SUPPORTED;
1400 NET_API_STATUS NetrShareDelEx(
1401 /* [unique][string][in] */ SRVSVC_HANDLE ServerName,
1402 /* [in] */ DWORD Level,
1403 /* [switch_is][in] */ LPSHARE_INFO ShareInfo)
1405 osi_Log0(afsd_logp, "NetrShareDelEx not supported");
1406 return ERROR_NOT_SUPPORTED;
1410 void __RPC_USER SHARE_DEL_HANDLE_rundown( SHARE_DEL_HANDLE h)
1414 /* [nocode] */ void Opnum0NotUsedOnWire(
1415 /* [in] */ handle_t IDL_handle)
1419 /* [nocode] */ void Opnum1NotUsedOnWire(
1420 /* [in] */ handle_t IDL_handle)
1424 /* [nocode] */ void Opnum2NotUsedOnWire(
1425 /* [in] */ handle_t IDL_handle)
1429 /* [nocode] */ void Opnum5NotUsedOnWire(
1430 /* [in] */ handle_t IDL_handle)
1434 /* [nocode] */ void Opnum6NotUsedOnWire(
1435 /* [in] */ handle_t IDL_handle)
1439 /* [nocode] */ void Opnum7NotUsedOnWire(
1440 /* [in] */ handle_t IDL_handle)
1444 /* [nocode] */ void Opnum29NotUsedOnWire(
1445 /* [in] */ handle_t IDL_handle)
1449 /* [nocode] */ void Opnum42NotUsedOnWire(
1450 /* [in] */ handle_t IDL_handle)
1454 /* [nocode] */ void Opnum47NotUsedOnWire(
1455 /* [in] */ handle_t IDL_handle)