NTSTATUS SrvSocketGetAddrInfoW( PCWSTR pwszClientname, struct addrinfo** ppAddrInfo ) { NTSTATUS ntStatus = STATUS_SUCCESS; struct addrinfo* pAddrInfo = NULL; PSTR pszClientname = NULL; ntStatus = SrvWc16sToMbs(pwszClientname, &pszClientname); BAIL_ON_NT_STATUS(ntStatus); ntStatus = SrvSocketGetAddrInfoA(pszClientname, &pAddrInfo); BAIL_ON_NT_STATUS(ntStatus); *ppAddrInfo = pAddrInfo; cleanup: SRV_SAFE_FREE_MEMORY(pszClientname); return ntStatus; error: *ppAddrInfo = NULL; if (pAddrInfo) { freeaddrinfo(pAddrInfo); } goto cleanup; }
static VOID SrvLogDeleteState_SMB_V1( PSRV_LOG_CONTEXT pLogContext, LWIO_LOG_LEVEL logLevel, PCSTR pszFunction, PCSTR pszFile, ULONG ulLine, ... ) { NTSTATUS ntStatus = STATUS_SUCCESS; PSRV_DELETE_STATE_SMB_V1 pDeleteState = NULL; PSTR pszSearchPattern = NULL; va_list msgList; va_start(msgList, ulLine); pDeleteState = va_arg(msgList, PSRV_DELETE_STATE_SMB_V1); if (pDeleteState) { if (pDeleteState->pwszSearchPattern) { ntStatus = SrvWc16sToMbs(pDeleteState->pwszSearchPattern, &pszSearchPattern); BAIL_ON_NT_STATUS(ntStatus); } LW_RTL_LOG_RAW( logLevel, "srv", pszFunction, pszFile, ulLine, "Delete directory state: SearchAttrs(0x%x),UseLongFilenames(%s),SearchPattern(%s)", pDeleteState->pRequestHeader->usSearchAttributes, pDeleteState->bUseLongFilenames ? "TRUE" : "FALSE", LWIO_SAFE_LOG_STRING(pszSearchPattern)); } error: va_end(msgList); SRV_SAFE_FREE_MEMORY(pszSearchPattern); return; }
static VOID SrvLogCheckDirState_SMB_V1( PSRV_LOG_CONTEXT pLogContext, LWIO_LOG_LEVEL logLevel, PCSTR pszFunction, PCSTR pszFile, ULONG ulLine, ... ) { NTSTATUS ntStatus = STATUS_SUCCESS; PSRV_CHECKDIR_STATE_SMB_V1 pCheckdirState = NULL; PSTR pszPath = NULL; va_list msgList; va_start(msgList, ulLine); pCheckdirState = va_arg(msgList, PSRV_CHECKDIR_STATE_SMB_V1); if (pCheckdirState) { if (pCheckdirState->pwszPathFragment) { ntStatus = SrvWc16sToMbs(pCheckdirState->pwszPathFragment, &pszPath); BAIL_ON_NT_STATUS(ntStatus); } LW_RTL_LOG_RAW( logLevel, "lwio", pszFunction, pszFile, ulLine, "Check directory state: Path(%s)", LWIO_SAFE_LOG_STRING(pszPath)); } error: va_end(msgList); SRV_SAFE_FREE_MEMORY(pszPath); return; }
NTSTATUS SrvShareDbDelete( IN HANDLE hRepository, IN PWSTR pwszShareName ) { NTSTATUS ntStatus = 0; PSRV_SHARE_DB_CONTEXT pDbContext = (PSRV_SHARE_DB_CONTEXT)hRepository; PSTR pszShareName = NULL; BOOLEAN bInLock = FALSE; if (IsNullOrEmptyString(pwszShareName)) { ntStatus = STATUS_INVALID_PARAMETER_3; BAIL_ON_NT_STATUS(ntStatus); } ntStatus = SrvWc16sToMbs(pwszShareName, &pszShareName); BAIL_ON_NT_STATUS(ntStatus); LWIO_LOCK_RWMUTEX_EXCLUSIVE(bInLock, &gShareRepository_lwshare.dbMutex); if (!pDbContext->pDeleteStmt) { PCSTR pszQueryTemplate = "DELETE FROM " LWIO_SRV_SHARES_DB_TABLE_NAME \ " WHERE UPPER(" LWIO_SRV_SHARES_DB_COL_NAME ") = UPPER(?1)"; ntStatus = sqlite3_prepare_v2( pDbContext->pDbHandle, pszQueryTemplate, -1, &pDbContext->pDeleteStmt, NULL); BAIL_ON_LWIO_SRV_SQLITE_ERROR_DB(ntStatus, pDbContext->pDbHandle); } ntStatus = sqlite3_bind_text( pDbContext->pDeleteStmt, 1, pszShareName, -1, SQLITE_TRANSIENT); BAIL_ON_LWIO_SRV_SQLITE_ERROR_STMT(ntStatus, pDbContext->pDeleteStmt); if ((ntStatus = sqlite3_step(pDbContext->pDeleteStmt)) == SQLITE_DONE) { ntStatus = STATUS_SUCCESS; } BAIL_ON_LWIO_SRV_SQLITE_ERROR_STMT(ntStatus, pDbContext->pDeleteStmt); cleanup: if (pDbContext) { if (pDbContext->pDeleteStmt) { sqlite3_reset(pDbContext->pDeleteStmt); } } LWIO_UNLOCK_RWMUTEX(bInLock, &gShareRepository_lwshare.dbMutex); SRV_SAFE_FREE_MEMORY(pszShareName); return ntStatus; error: goto cleanup; }
NTSTATUS SrvShareDbAdd( IN HANDLE hRepository, IN PWSTR pwszShareName, IN PWSTR pwszPath, IN PWSTR pwszComment, IN PBYTE pSecDesc, IN ULONG ulSecDescLen, IN PWSTR pwszService, IN ULONG ulFlags ) { NTSTATUS ntStatus = 0; PSRV_SHARE_DB_CONTEXT pDbContext = NULL; PSTR pszShareName = NULL; PSTR pszPath = NULL; PSTR pszComment = NULL; PSTR pszService = NULL; BOOLEAN bInLock = FALSE; if (pwszShareName) { ntStatus = SrvWc16sToMbs(pwszShareName, &pszShareName); BAIL_ON_NT_STATUS(ntStatus); } if (pwszPath) { ntStatus = SrvWc16sToMbs(pwszPath, &pszPath); BAIL_ON_NT_STATUS(ntStatus); } if (pwszComment) { ntStatus = SrvWc16sToMbs(pwszComment, &pszComment); BAIL_ON_NT_STATUS(ntStatus); } if (pwszService) { ntStatus = SrvWc16sToMbs(pwszService, &pszService); BAIL_ON_NT_STATUS(ntStatus); } LWIO_LOCK_RWMUTEX_EXCLUSIVE(bInLock, &gShareRepository_lwshare.dbMutex); pDbContext = (PSRV_SHARE_DB_CONTEXT)hRepository; ntStatus = SrvShareDbAdd_inlock( pDbContext, pszShareName, pszPath, pszComment, pSecDesc, ulSecDescLen, pszService, ulFlags); BAIL_ON_NT_STATUS(ntStatus); cleanup: LWIO_UNLOCK_RWMUTEX(bInLock, &gShareRepository_lwshare.dbMutex); SRV_SAFE_FREE_MEMORY(pszShareName); SRV_SAFE_FREE_MEMORY(pszPath); SRV_SAFE_FREE_MEMORY(pszComment); SRV_SAFE_FREE_MEMORY(pszService); return ntStatus; error: goto cleanup; }
NTSTATUS SrvShareDbFindByName( HANDLE hRepository, PWSTR pwszShareName, PSRV_SHARE_INFO* ppShareInfo ) { NTSTATUS ntStatus = 0; PSRV_SHARE_INFO* ppShareInfoList = NULL; PSTR pszShareName = NULL; BOOLEAN bInLock = FALSE; ULONG ulNumSharesFound = 0; PSRV_SHARE_DB_CONTEXT pDbContext = NULL; if (IsNullOrEmptyString(pwszShareName)) { ntStatus = STATUS_INVALID_PARAMETER_2; } BAIL_ON_NT_STATUS(ntStatus); pDbContext = (PSRV_SHARE_DB_CONTEXT)hRepository; ntStatus = SrvWc16sToMbs(pwszShareName, &pszShareName); BAIL_ON_NT_STATUS(ntStatus); if (!pDbContext->pFindStmt) { PCSTR pszQueryTemplate = "SELECT " LWIO_SRV_SHARES_DB_COL_NAME "," \ LWIO_SRV_SHARES_DB_COL_PATH "," \ LWIO_SRV_SHARES_DB_COL_COMMENT "," \ LWIO_SRV_SHARES_DB_COL_SECDESC "," \ LWIO_SRV_SHARES_DB_COL_SERVICE \ " FROM " LWIO_SRV_SHARES_DB_TABLE_NAME \ " WHERE UPPER(" LWIO_SRV_SHARES_DB_COL_NAME ") = UPPER(?1)"; ntStatus = sqlite3_prepare_v2( pDbContext->pDbHandle, pszQueryTemplate, -1, &pDbContext->pFindStmt, NULL); BAIL_ON_LWIO_SRV_SQLITE_ERROR_DB(ntStatus, pDbContext->pDbHandle); } ntStatus = sqlite3_bind_text( pDbContext->pFindStmt, 1, pszShareName, -1, SQLITE_TRANSIENT); BAIL_ON_LWIO_SRV_SQLITE_ERROR_STMT(ntStatus, pDbContext->pFindStmt); LWIO_LOCK_RWMUTEX_SHARED(bInLock, &gShareRepository_lwshare.dbMutex); ntStatus = SrvShareDbWriteToShareInfo( pDbContext->pFindStmt, &ppShareInfoList, &ulNumSharesFound); BAIL_ON_NT_STATUS(ntStatus); *ppShareInfo = *ppShareInfoList; cleanup: if (pDbContext) { if (pDbContext->pFindStmt) { sqlite3_reset(pDbContext->pFindStmt); } } LWIO_UNLOCK_RWMUTEX(bInLock, &gShareRepository_lwshare.dbMutex); if (ppShareInfoList) { SrvShareFreeInfoList(ppShareInfoList, ulNumSharesFound); } SRV_SAFE_FREE_MEMORY(pszShareName); return ntStatus; error: *ppShareInfo = NULL; goto cleanup; }
NTSTATUS SrvGetShareName( IN PCSTR pszHostname, IN PCSTR pszDomain, IN PWSTR pwszPath, OUT PWSTR* ppwszSharename ) { NTSTATUS ntStatus = 0; PWSTR pwszSharename = NULL; PSTR pszPath = NULL; PSTR pszShareName = NULL; PSTR pszCursor = NULL; ntStatus = SrvWc16sToMbs(pwszPath, &pszPath); BAIL_ON_NT_STATUS(ntStatus); pszCursor = pszPath; /* Skip a leading pair of backslashes */ if ((strlen(pszCursor) > 2) && (*pszCursor == '\\') && (*(pszCursor+1) == '\\')) { pszCursor += 2; } pszShareName = strchr(pszCursor, '\\'); if (pszShareName == NULL) { pszShareName = pszCursor; } else { pszShareName++; } if (*pszShareName == '\0') { ntStatus = STATUS_BAD_NETWORK_PATH; BAIL_ON_NT_STATUS(ntStatus); } ntStatus = SrvMbsToWc16s(pszShareName, &pwszSharename); BAIL_ON_NT_STATUS(ntStatus); *ppwszSharename = pwszSharename; cleanup: if (pszPath) { SrvFreeMemory(pszPath); } return ntStatus; error: *ppwszSharename = NULL; goto cleanup; }