VirtualBox

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

Last change on this file since 93115 was 93115, checked in by vboxsync, 2 years ago

scm --update-copyright-year

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

© 2023 Oracle
ContactPrivacy policyTerms of Use