]> sourceware.org Git - newlib-cygwin.git/blob - winsup/cygserver/pwdgrp.cc
cc12deadddc98f6bd04163ac8b987a8cb8f720e9
[newlib-cygwin.git] / winsup / cygserver / pwdgrp.cc
1 /* pwdgrp.cc: Request account information
2
3 Copyright 2014 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 }
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 }
83 _parameters.out.line[0] = '\0';
84 msglen (0);
85 error_code (ENOENT);
86 }
87 }
88
89 void
90 client_request_pwdgrp::grp_serve ()
91 {
92 struct group *grp = NULL;
93
94 switch (_parameters.in.type)
95 {
96 case SID_arg:
97 grp = (struct group *) cygwin_internal (CW_GETGRSID, 0,
98 &_parameters.in.arg.sid);
99 break;
100 case NAME_arg:
101 grp = getgrnam (_parameters.in.arg.name);
102 break;
103 case ID_arg:
104 grp = getgrgid (_parameters.in.arg.id);
105 break;
106 }
107 if (grp)
108 msglen (snprintf (_parameters.out.line, sizeof _parameters.out.line,
109 "%s:%s:%u:",
110 grp->gr_name ?: "",
111 grp->gr_passwd ?: "",
112 (uint32_t) grp->gr_gid) + 1);
113 else
114 {
115 switch (_parameters.in.type)
116 {
117 case SID_arg:
118 {
119 char *str;
120 if (ConvertSidToStringSid (&_parameters.in.arg.sid, &str))
121 {
122 debug_printf ("Group <%s> failed", str);
123 LocalFree (str);
124 }
125 }
126 break;
127 case NAME_arg:
128 debug_printf ("Group <%s> failed", _parameters.in.arg.name);
129 break;
130 case ID_arg:
131 debug_printf ("Group <%u> failed", _parameters.in.arg.id);
132 break;
133 }
134 _parameters.out.line[0] = '\0';
135 msglen (0);
136 error_code (ENOENT);
137 }
138 }
139
140 void
141 client_request_pwdgrp::serve (transport_layer_base *const conn,
142 process_cache *const cache)
143 {
144 debug_printf ("Request account information");
145 if (msglen () < __builtin_offsetof (struct _pwdgrp_param_t::_pwdgrp_in_t, arg)
146 + sizeof (uint32_t)
147 || msglen () > sizeof (_parameters.in))
148 {
149 syscall_printf ("bad request body length: got %lu", msglen ());
150 error_code (EINVAL);
151 msglen (0);
152 return;
153 }
154 error_code (0);
155 if (_parameters.in.group)
156 grp_serve ();
157 else
158 pwd_serve ();
159 debug_printf ("Request account information returns <%s> error %d", _parameters.out.line, error_code ());
160 }
161 #endif /* __OUTSIDE_CYGWIN__ */
This page took 0.037411 seconds and 4 git commands to generate.