]> sourceware.org Git - newlib-cygwin.git/blame - winsup/cygserver/pwdgrp.cc
Cygwin: set NTDDI_VERSION to enable more recent windows definitions
[newlib-cygwin.git] / winsup / cygserver / pwdgrp.cc
CommitLineData
600afd99
CV
1/* pwdgrp.cc: Request account information
2
600afd99
CV
3This file is part of Cygwin.
4
5This software is a copyrighted work licensed under the terms of the
6Cygwin license. Please consult the file "CYGWIN_LICENSE" for
7details. */
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
26client_request_pwdgrp::client_request_pwdgrp ()
27 : client_request (CYGSERVER_REQUEST_PWDGRP,
28 &_parameters, sizeof (_parameters))
29{
30}
31
32void
33client_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;
c9baa8a6
CV
49 default:
50 break;
600afd99
CV
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 ?: "",
d98d7f39 61 pwd->pw_shell ?: "") + 1);
600afd99
CV
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;
c9baa8a6
CV
82 default:
83 break;
600afd99
CV
84 }
85 _parameters.out.line[0] = '\0';
86 msglen (0);
87 error_code (ENOENT);
88 }
89}
90
91void
92client_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;
c9baa8a6
CV
108 default:
109 break;
600afd99
CV
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 ?: "",
d98d7f39 116 (uint32_t) grp->gr_gid) + 1);
600afd99
CV
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;
c9baa8a6
CV
137 default:
138 break;
600afd99
CV
139 }
140 _parameters.out.line[0] = '\0';
141 msglen (0);
142 error_code (ENOENT);
143 }
144}
145
146void
147client_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.093912 seconds and 5 git commands to generate.