]> sourceware.org Git - newlib-cygwin.git/blame - winsup/cygserver/pwdgrp.cc
* pwdgrp.cc (client_request_pwdgrp::pwd_serve): Add 1 to the message
[newlib-cygwin.git] / winsup / cygserver / pwdgrp.cc
CommitLineData
600afd99
CV
1/* pwdgrp.cc: Request account information
2
3 Copyright 2014 Red Hat, Inc.
4
5This file is part of Cygwin.
6
7This software is a copyrighted work licensed under the terms of the
8Cygwin license. Please consult the file "CYGWIN_LICENSE" for
9details. */
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
28client_request_pwdgrp::client_request_pwdgrp ()
29 : client_request (CYGSERVER_REQUEST_PWDGRP,
30 &_parameters, sizeof (_parameters))
31{
32}
33
34void
35client_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 ?: "",
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;
82 }
83 _parameters.out.line[0] = '\0';
84 msglen (0);
85 error_code (ENOENT);
86 }
87}
88
89void
90client_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 ?: "",
d98d7f39 112 (uint32_t) grp->gr_gid) + 1);
600afd99
CV
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
140void
141client_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.036715 seconds and 5 git commands to generate.