The R Project SVN R

Rev

Rev 85648 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 85648 Rev 86967
Line 1... Line 1...
1
/*
1
/*
2
 *  R : A Computer Language for Statistical Data Analysis
2
 *  R : A Computer Language for Statistical Data Analysis
3
 *  file extra.c
3
 *  file extra.c
4
 *  Copyright (C) 1998--2003  Guido Masarotto and Brian Ripley
4
 *  Copyright (C) 1998--2003  Guido Masarotto and Brian Ripley
5
 *  Copyright (C) 2004	      The R Foundation
5
 *  Copyright (C) 2004	      The R Foundation
6
 *  Copyright (C) 2005--2023  The R Core Team
6
 *  Copyright (C) 2005--2024  The R Core Team
7
 *
7
 *
8
 *  This program is free software; you can redistribute it and/or modify
8
 *  This program is free software; you can redistribute it and/or modify
9
 *  it under the terms of the GNU General Public License as published by
9
 *  it under the terms of the GNU General Public License as published by
10
 *  the Free Software Foundation; either version 2 of the License, or
10
 *  the Free Software Foundation; either version 2 of the License, or
11
 *  (at your option) any later version.
11
 *  (at your option) any later version.
Line 166... Line 166...
166
    if (strlen(gui.warning)) warning("%s", gui.warning);
166
    if (strlen(gui.warning)) warning("%s", gui.warning);
167
    vmaxset(vmax);
167
    vmaxset(vmax);
168
    return R_NilValue;
168
    return R_NilValue;
169
}
169
}
170
 
170
 
-
 
171
/* returns R_alloc'd results */
-
 
172
static int getCurrentUserAndDomain(char **user, char **domain)
-
 
173
{
-
 
174
    int ok = 0;
-
 
175
    HANDLE h = INVALID_HANDLE_VALUE;
-
 
176
    DWORD err;
-
 
177
    DWORD tilen = 0;
-
 
178
    PTOKEN_USER t = NULL;
-
 
179
    char *ubuf = NULL;
-
 
180
    DWORD ulen = 0;
-
 
181
    char *dbuf = NULL;
-
 
182
    DWORD dlen = 0;
-
 
183
    SID_NAME_USE suse = SidTypeUnknown;
-
 
184
 
-
 
185
    ok = OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &h);
-
 
186
    if (!ok) {
-
 
187
	err = GetLastError();
-
 
188
	if (err == ERROR_NO_TOKEN || err == ERROR_NO_IMPERSONATION_TOKEN)
-
 
189
	    ok = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &h);
-
 
190
    }
-
 
191
 
-
 
192
    ok = ok && !GetTokenInformation(h, TokenUser, NULL, 0, &tilen)
-
 
193
	 && GetLastError() == ERROR_INSUFFICIENT_BUFFER;
-
 
194
 
-
 
195
    if (ok) {
-
 
196
	t = (PTOKEN_USER) R_alloc(tilen, 1);
-
 
197
	ok = GetTokenInformation(h, TokenUser, t, tilen, &tilen);
-
 
198
    }
-
 
199
 
-
 
200
    if (ok) {
-
 
201
	ok = !LookupAccountSid(NULL, t->User.Sid, ubuf, &ulen, dbuf, &dlen,
-
 
202
	                       &suse)
-
 
203
	     && GetLastError() == ERROR_INSUFFICIENT_BUFFER;
-
 
204
 
-
 
205
	if (ok) {
-
 
206
	    ubuf = R_alloc(ulen, 1);
-
 
207
	    dbuf = R_alloc(dlen, 1);
-
 
208
	    ok = LookupAccountSid(NULL, t->User.Sid, ubuf, &ulen, dbuf, &dlen,
-
 
209
	                          &suse);
-
 
210
	}
-
 
211
    }
-
 
212
 
-
 
213
    if (!ok)
-
 
214
	err = GetLastError();
-
 
215
 
-
 
216
    if (h != INVALID_HANDLE_VALUE)
-
 
217
	CloseHandle(h);
-
 
218
 
-
 
219
    if (ok) {
-
 
220
	if (user)
-
 
221
	    *user = ubuf;
-
 
222
	if (domain)
-
 
223
	    *domain = dbuf;
-
 
224
	return 1;
-
 
225
    } else {
-
 
226
	if (user)
-
 
227
	    *user = NULL;
-
 
228
	if (domain)
-
 
229
	    *domain = NULL;
-
 
230
	SetLastError(err);
-
 
231
	return 0;
-
 
232
    }
-
 
233
}
-
 
234
 
-
 
235
 
171
#include <lmcons.h>
236
#include <lmcons.h>
172
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
237
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
173
 
238
 
-
 
239
const char *formatError(DWORD res);
-
 
240
 
174
/* base::Sys.info */
241
/* base::Sys.info */
175
// keep in step with src/library/utils/src/windows/util.c
242
// keep in step with src/library/utils/src/windows/util.c
176
SEXP do_sysinfo(SEXP call, SEXP op, SEXP args, SEXP rho)
243
SEXP do_sysinfo(SEXP call, SEXP op, SEXP args, SEXP rho)
177
{
244
{
178
    SEXP ans, ansnames;
245
    SEXP ans, ansnames;
179
    OSVERSIONINFOEX osvi;
246
    OSVERSIONINFOEX osvi;
180
    char ver[256], buf[1000];
247
    char ver[256], buf[1000];
181
    wchar_t name[MAX_COMPUTERNAME_LENGTH + 1], user[UNLEN+1];
248
    wchar_t name[MAX_COMPUTERNAME_LENGTH + 1];
182
    DWORD namelen = MAX_COMPUTERNAME_LENGTH + 1, userlen = UNLEN+1;
249
    DWORD namelen = MAX_COMPUTERNAME_LENGTH + 1;
-
 
250
    const void *vmax = vmaxget();
-
 
251
    char *uname;
-
 
252
    char *udomain;
183
 
253
 
184
    checkArity(op, args);
254
    checkArity(op, args);
185
    PROTECT(ans = allocVector(STRSXP, 8));
255
    PROTECT(ans = allocVector(STRSXP, 9));
186
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
256
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
187
    if(!GetVersionEx((OSVERSIONINFO *)&osvi))
257
    if(!GetVersionEx((OSVERSIONINFO *)&osvi))
188
	error(_("unsupported version of Windows"));
258
	error(_("unsupported version of Windows"));
189
 
259
 
190
    SET_STRING_ELT(ans, 0, mkChar("Windows"));
260
    SET_STRING_ELT(ans, 0, mkChar("Windows"));
Line 256... Line 326...
256
#elif defined(_WIN64)
326
#elif defined(_WIN64)
257
    SET_STRING_ELT(ans, 4, mkChar("x86-64"));
327
    SET_STRING_ELT(ans, 4, mkChar("x86-64"));
258
#else
328
#else
259
    SET_STRING_ELT(ans, 4, mkChar("x86"));
329
    SET_STRING_ELT(ans, 4, mkChar("x86"));
260
#endif
330
#endif
261
    GetUserNameW(user, &userlen);
331
    if (!getCurrentUserAndDomain(&uname, &udomain)) {
-
 
332
	SET_STRING_ELT(ans, 5, mkChar("unknown"));
-
 
333
	SET_STRING_ELT(ans, 8, mkChar("unknown"));
-
 
334
	warning(_("cannot resolve current user or domain: '%s'"),
262
    wcstoutf8(buf, user, sizeof(buf));
335
	       formatError(GetLastError()));
-
 
336
    } else {
263
    SET_STRING_ELT(ans, 5, mkCharCE(buf, CE_UTF8));
337
	SET_STRING_ELT(ans, 5, mkChar(uname));
-
 
338
	SET_STRING_ELT(ans, 8, mkChar(udomain));
-
 
339
    }
264
    SET_STRING_ELT(ans, 6, STRING_ELT(ans, 5));
340
    SET_STRING_ELT(ans, 6, STRING_ELT(ans, 5));
265
    SET_STRING_ELT(ans, 7, STRING_ELT(ans, 5));
341
    SET_STRING_ELT(ans, 7, STRING_ELT(ans, 5));
266
    PROTECT(ansnames = allocVector(STRSXP, 8));
342
    PROTECT(ansnames = allocVector(STRSXP, 9));
267
    SET_STRING_ELT(ansnames, 0, mkChar("sysname"));
343
    SET_STRING_ELT(ansnames, 0, mkChar("sysname"));
268
    SET_STRING_ELT(ansnames, 1, mkChar("release"));
344
    SET_STRING_ELT(ansnames, 1, mkChar("release"));
269
    SET_STRING_ELT(ansnames, 2, mkChar("version"));
345
    SET_STRING_ELT(ansnames, 2, mkChar("version"));
270
    SET_STRING_ELT(ansnames, 3, mkChar("nodename"));
346
    SET_STRING_ELT(ansnames, 3, mkChar("nodename"));
271
    SET_STRING_ELT(ansnames, 4, mkChar("machine"));
347
    SET_STRING_ELT(ansnames, 4, mkChar("machine"));
272
    SET_STRING_ELT(ansnames, 5, mkChar("login"));
348
    SET_STRING_ELT(ansnames, 5, mkChar("login"));
273
    SET_STRING_ELT(ansnames, 6, mkChar("user"));
349
    SET_STRING_ELT(ansnames, 6, mkChar("user"));
274
    SET_STRING_ELT(ansnames, 7, mkChar("effective_user"));
350
    SET_STRING_ELT(ansnames, 7, mkChar("effective_user"));
-
 
351
    SET_STRING_ELT(ansnames, 8, mkChar("udomain"));
275
    setAttrib(ans, R_NamesSymbol, ansnames);
352
    setAttrib(ans, R_NamesSymbol, ansnames);
-
 
353
    vmaxset(vmax);
276
    UNPROTECT(2);
354
    UNPROTECT(2);
277
    return ans;
355
    return ans;
278
}
356
}
279
 
357
 
280
void Rsleep(double timeint)
358
void Rsleep(double timeint)