-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathfmtuid.c
90 lines (81 loc) · 2.39 KB
/
fmtuid.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1985-2011 AT&T Intellectual Property *
* Copyright (c) 2020-2023 Contributors to ksh 93u+m *
* and is licensed under the *
* Eclipse Public License, Version 2.0 *
* *
* A copy of the License is available at *
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html *
* (with md5 checksum 84283fa8859daf213bdda5a9f8d1be1d) *
* *
* Glenn Fowler <[email protected]> *
* David Korn <[email protected]> *
* Phong Vo <[email protected]> *
* Martijn Dekker <[email protected]> *
* Johnothan King <[email protected]> *
* *
***********************************************************************/
/*
* Glenn Fowler
* AT&T Bell Laboratories
*
* UID number -> user name
*/
#define getpwuid ______getpwuid
#include <ast.h>
#include <cdt.h>
#include <pwd.h>
#undef getpwuid
extern struct passwd* getpwuid(uid_t);
typedef struct Id_s
{
Dtlink_t link;
int id;
char name[1];
} Id_t;
/*
* return user name for given UID number
*/
char*
fmtuid(int uid)
{
Id_t* ip;
char* name;
struct passwd* pw;
int z;
static Dt_t* dict;
static Dtdisc_t disc;
if (!dict)
{
disc.key = offsetof(Id_t, id);
disc.size = sizeof(int);
dict = dtopen(&disc, Dtset);
}
else if (ip = (Id_t*)dtmatch(dict, &uid))
return ip->name;
if (pw = getpwuid(uid))
{
name = pw->pw_name;
#if _WINIX
if (streq(name, "Administrator"))
name = "root";
#endif
}
else if (uid == 0)
name = "root";
else
{
name = fmtbuf(z = sizeof(uid) * 3 + 1);
sfsprintf(name, z, "%I*d", sizeof(uid), uid);
}
if (dict && (ip = newof(0, Id_t, 1, strlen(name))))
{
ip->id = uid;
strcpy(ip->name, name);
dtinsert(dict, ip);
return ip->name;
}
return name;
}