VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvPoller.cpp

Last change on this file was 98103, checked in by vboxsync, 16 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.7 KB
Line 
1/* $Id: VBoxCredProvPoller.cpp 98103 2023-01-17 14:15:46Z vboxsync $ */
2/** @file
3 * VBoxCredPoller - Thread for querying / retrieving user credentials.
4 */
5
6/*
7 * Copyright (C) 2012-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28
29/*********************************************************************************************************************************
30* Header Files *
31*********************************************************************************************************************************/
32#include <iprt/win/windows.h>
33
34#include <VBox/VBoxGuestLib.h>
35#include <iprt/string.h>
36
37#include "VBoxCredProvProvider.h"
38
39#include "VBoxCredProvCredential.h"
40#include "VBoxCredProvPoller.h"
41#include "VBoxCredProvUtils.h"
42
43
44VBoxCredProvPoller::VBoxCredProvPoller(void)
45 : m_hThreadPoller(NIL_RTTHREAD)
46 , m_pProv(NULL)
47{
48}
49
50
51VBoxCredProvPoller::~VBoxCredProvPoller(void)
52{
53 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Destroying ...\n");
54
55 Shutdown();
56}
57
58
59int
60VBoxCredProvPoller::Initialize(VBoxCredProvProvider *pProvider)
61{
62 AssertPtrReturn(pProvider, VERR_INVALID_POINTER);
63
64 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Initializing\n");
65
66 /* Don't create more than one of them. */
67 if (m_hThreadPoller != NIL_RTTHREAD)
68 {
69 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Thread already running, returning\n");
70 return VINF_SUCCESS;
71 }
72
73 if (m_pProv != NULL)
74 m_pProv->Release();
75
76 m_pProv = pProvider;
77 /*
78 * We must not add a reference via AddRef() here, otherwise
79 * the credential provider does not get destructed properly.
80 * In order to get this thread terminated normally the credential
81 * provider has to call Shutdown().
82 */
83
84 /* Create the poller thread. */
85 int rc = RTThreadCreate(&m_hThreadPoller, VBoxCredProvPoller::threadPoller, this, 0, RTTHREADTYPE_INFREQUENT_POLLER,
86 RTTHREADFLAGS_WAITABLE, "credpoll");
87 if (RT_FAILURE(rc))
88 VBoxCredProvVerbose(0, "VBoxCredProvPoller::Initialize: Failed to create thread, rc=%Rrc\n", rc);
89
90 return rc;
91}
92
93
94int
95VBoxCredProvPoller::Shutdown(void)
96{
97 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Shutdown\n");
98
99 if (m_hThreadPoller == NIL_RTTHREAD)
100 return VINF_SUCCESS;
101
102 /* Post termination event semaphore. */
103 int rc = RTThreadUserSignal(m_hThreadPoller);
104 if (RT_SUCCESS(rc))
105 {
106 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Waiting for thread to terminate\n");
107 /* Wait until the thread has terminated. */
108 rc = RTThreadWait(m_hThreadPoller, RT_INDEFINITE_WAIT, NULL);
109 if (RT_FAILURE(rc))
110 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Wait returned error rc=%Rrc\n", rc);
111 }
112 else
113 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Error waiting for thread shutdown, rc=%Rrc\n", rc);
114
115 m_pProv = NULL;
116 m_hThreadPoller = NIL_RTTHREAD;
117
118 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Shutdown returned with rc=%Rrc\n", rc);
119 return rc;
120}
121
122
123/*static*/ DECLCALLBACK(int)
124VBoxCredProvPoller::threadPoller(RTTHREAD hThreadSelf, void *pvUser)
125{
126 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Starting, pvUser=0x%p\n", pvUser);
127
128 VBoxCredProvPoller *pThis = (VBoxCredProvPoller*)pvUser;
129 AssertPtr(pThis);
130
131 for (;;)
132 {
133 int rc;
134 rc = VbglR3CredentialsQueryAvailability();
135 if (RT_FAILURE(rc))
136 {
137 if (rc != VERR_NOT_FOUND)
138 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Could not retrieve credentials! rc=%Rc\n", rc);
139 }
140 else
141 {
142 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Credentials available, notifying provider\n");
143
144 if (pThis->m_pProv)
145 pThis->m_pProv->OnCredentialsProvided();
146 }
147
148 /* Wait a bit. */
149 if (RTThreadUserWait(hThreadSelf, 500) == VINF_SUCCESS)
150 {
151 VBoxCredProvVerbose(0, "VBoxCredProvPoller: Terminating\n");
152 break;
153 }
154 }
155
156 return VINF_SUCCESS;
157}
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use