]> sourceware.org Git - newlib-cygwin.git/blob - winsup/cygserver/pwdgrp.cc
cygserver: Only print basename of source in debug output to raise readability
[newlib-cygwin.git] / winsup / cygserver / pwdgrp.cc
1 /* pwdgrp.cc: Request account information
2
3 This file is part of Cygwin.
4
5 This software is a copyrighted work licensed under the terms of the
6 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
7 details. */
8
9 #ifdef __OUTSIDE_CYGWIN__
10 #include "woutsup.h"
11
12 #include <stdio.h>
13 #include <errno.h>
14 #include <pwd.h>
15 #include <grp.h>
16 #include <sys/cygwin.h>
17
18 #include "cygserver.h"
19 #include "process.h"
20 #include "transport.h"
21
22 #include "cygserver_pwdgrp.h"
23
24 #include <sddl.h>
25
26 client_request_pwdgrp::client_request_pwdgrp ()
27 : client_request (CYGSERVER_REQUEST_PWDGRP,
28 &_parameters, sizeof (_parameters))
29 {
30 }
31
32 void
33 client_request_pwdgrp::pwd_serve ()
34 {
35 struct passwd *pwd = NULL;
36
37 switch (_parameters.in.type)
38 {
39 case SID_arg:
40 pwd = (struct passwd *) cygwin_internal (CW_GETPWSID, 0,
41 &_parameters.in.arg.sid);
42 break;
43 case NAME_arg:
44 pwd = getpwnam (_parameters.in.arg.name);
45 break;
46 case ID_arg:
47 pwd = getpwuid (_parameters.in.arg.id);
48 break;
49 default:
50 break;
51 }
52 if (pwd)
53 msglen (snprintf (_parameters.out.line, sizeof _parameters.out.line,
54 "%s:%s:%u:%u:%s:%s:%s",
55 pwd->pw_name ?: "",
56 pwd->pw_passwd ?: "",
57 (uint32_t) pwd->pw_uid,
58 (uint32_t) pwd->pw_gid,
59 pwd->pw_gecos ?: "",
60 pwd->pw_dir ?: "",
61 pwd->pw_shell ?: "") + 1);
62 else
63 {
64 switch (_parameters.in.type)
65 {
66 case SID_arg:
67 {
68 char *str;
69 if (ConvertSidToStringSid (&_parameters.in.arg.sid, &str))
70 {
71 debug_printf ("User <%s> failed", str);
72 LocalFree (str);
73 }
74 }
75 break;
76 case NAME_arg:
77 debug_printf ("User <%s> failed", _parameters.in.arg.name);
78 break;
79 case ID_arg:
80 debug_printf ("User <%u> failed", _parameters.in.arg.id);
81 break;
82 default:
83 break;
84 }
85 _parameters.out.line[0] = '\0';
86 msglen (0);
87 error_code (ENOENT);
88 }
89 }
90
91 void
92 client_request_pwdgrp::grp_serve ()
93 {
94 struct group *grp = NULL;
95
96 switch (_parameters.in.type)
97 {
98 case SID_arg:
99 grp = (struct group *) cygwin_internal (CW_GETGRSID, 0,
100 &_parameters.in.arg.sid);
101 break;
102 case NAME_arg:
103 grp = getgrnam (_parameters.in.arg.name);
104 break;
105 case ID_arg:
106 grp = getgrgid (_parameters.in.arg.id);
107 break;
108 default:
109 break;
110 }
111 if (grp)
112 msglen (snprintf (_parameters.out.line, sizeof _parameters.out.line,
113 "%s:%s:%u:",
114 grp->gr_name ?: "",
115 grp->gr_passwd ?: "",
116 (uint32_t) grp->gr_gid) + 1);
117 else
118 {
119 switch (_parameters.in.type)
120 {
121 case SID_arg:
122 {
123 char *str;
124 if (ConvertSidToStringSid (&_parameters.in.arg.sid, &str))
125 {
126 debug_printf ("Group <%s> failed", str);
127 LocalFree (str);
128 }
129 }
130 break;
131 case NAME_arg:
132 debug_printf ("Group <%s> failed", _parameters.in.arg.name);
133 break;
134 case ID_arg:
135 debug_printf ("Group <%u> failed", _parameters.in.arg.id);
136 break;
137 default:
138 break;
139 }
140 _parameters.out.line[0] = '\0';
141 msglen (0);
142 error_code (ENOENT);
143 }
144 }
145
146 void
147 client_request_pwdgrp::serve (transport_layer_base *const conn,
148 process_cache *const cache)
149 {
150 debug_printf ("Request account information");
151 if (msglen () < __builtin_offsetof (struct _pwdgrp_param_t::_pwdgrp_in_t, arg)
152 + sizeof (uint32_t)
153 || msglen () > sizeof (_parameters.in))
154 {
155 syscall_printf ("bad request body length: got %lu", msglen ());
156 error_code (EINVAL);
157 msglen (0);
158 return;
159 }
160 error_code (0);
161 if (_parameters.in.group)
162 grp_serve ();
163 else
164 pwd_serve ();
165 debug_printf ("Request account information returns <%s> error %d", _parameters.out.line, error_code ());
166 }
167 #endif /* __OUTSIDE_CYGWIN__ */
This page took 0.04131 seconds and 5 git commands to generate.