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