]> sourceware.org Git - newlib-cygwin.git/commitdiff
* Makefile.in (OBJS): Add pwdgrp.o.
authorCorinna Vinschen <corinna@vinschen.de>
Wed, 12 Mar 2014 17:37:04 +0000 (17:37 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Wed, 12 Mar 2014 17:37:04 +0000 (17:37 +0000)
* client.cc (client_request::handle_request): Handle
CYGSERVER_REQUEST_PWDGRP message.
* pwdgrp.cc: New file implementing CYGSERVER_REQUEST_PWDGRP.

winsup/cygserver/ChangeLog
winsup/cygserver/Makefile.in
winsup/cygserver/client.cc
winsup/cygserver/pwdgrp.cc [new file with mode: 0644]

index f0a9911a727890f91d62fb3ba168f9a73879219e..b45148355b161c33a99e888af18a042f064693ab 100644 (file)
@@ -1,3 +1,10 @@
+2014-03-12  Corinna Vinschen  <corinna@vinschen.de>
+
+       * Makefile.in (OBJS): Add pwdgrp.o.
+       * client.cc (client_request::handle_request): Handle
+       CYGSERVER_REQUEST_PWDGRP message.
+       * pwdgrp.cc: New file implementing CYGSERVER_REQUEST_PWDGRP.
+
 2014-03-12  Corinna Vinschen  <corinna@vinschen.de>
 
        * Throughout, fix format specifiers in debug statements to accommodate
index e2fe3099272383bb58987fe95c87bf0a05c516b5..816f5b3db09aa18c0e725b0c66adf8fb14730304 100644 (file)
@@ -1,5 +1,5 @@
 # Makefile for Cygwin server
-# Copyright 2003, 2006, 2007, 2008, 2009 Red Hat, Inc.
+# Copyright 2003, 2006, 2007, 2008, 2009, 2014 Red Hat, Inc.
 
 # This file is part of Cygwin.
 
@@ -46,7 +46,7 @@ AR:=@AR@
 OBJS:= cygserver.o client.o process.o msg.o sem.o shm.o threaded_queue.o \
        transport.o transport_pipes.o \
        bsd_helper.o bsd_log.o bsd_mutex.o \
-       sysv_msg.o sysv_sem.o sysv_shm.o setpwd.o
+       sysv_msg.o sysv_sem.o sysv_shm.o setpwd.o pwdgrp.o
 LIBOBJS:=${patsubst %.o,lib%.o,$(OBJS)}
 
 CYGWIN_OBJS:=$(cygwin_build)/version.o
index 94e56f383357909baf2859f2e602b328ae3f11c9..9775bbc443c7597c9a4db91672b40daa3e5109a2 100644 (file)
@@ -26,6 +26,7 @@ details. */
 #include "cygserver_sem.h"
 #include "cygserver_shm.h"
 #include "cygserver_setpwd.h"
+#include "cygserver_pwdgrp.h"
 
 #include "cygserver.h"
 #include "transport.h"
@@ -285,6 +286,9 @@ client_request::handle_request (transport_layer_base *const conn,
     case CYGSERVER_REQUEST_SETPWD:
       req = new client_request_setpwd;
       break;
+    case CYGSERVER_REQUEST_PWDGRP:
+      req = new client_request_pwdgrp;
+      break;
     default:
       syscall_printf ("unknown request code %d received: request ignored",
                      header.request_code);
diff --git a/winsup/cygserver/pwdgrp.cc b/winsup/cygserver/pwdgrp.cc
new file mode 100644 (file)
index 0000000..90e88ce
--- /dev/null
@@ -0,0 +1,161 @@
+/* pwdgrp.cc: Request account information
+
+   Copyright 2014 Red Hat, Inc.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifdef __OUTSIDE_CYGWIN__
+#include "woutsup.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <pwd.h>
+#include <grp.h>
+#include <sys/cygwin.h>
+
+#include "cygserver.h"
+#include "process.h"
+#include "transport.h"
+
+#include "cygserver_pwdgrp.h"
+
+#include <sddl.h>
+
+client_request_pwdgrp::client_request_pwdgrp ()
+  : client_request (CYGSERVER_REQUEST_PWDGRP,
+                   &_parameters, sizeof (_parameters))
+{ 
+}
+
+void
+client_request_pwdgrp::pwd_serve ()
+{
+  struct passwd *pwd = NULL;
+
+  switch (_parameters.in.type)
+    {
+    case SID_arg:
+      pwd = (struct passwd *) cygwin_internal (CW_GETPWSID, 0,
+                                             &_parameters.in.arg.sid);
+      break;
+    case NAME_arg:
+      pwd = getpwnam (_parameters.in.arg.name);
+      break;
+    case ID_arg:
+      pwd = getpwuid (_parameters.in.arg.id);
+      break;
+    }
+  if (pwd)
+    msglen (snprintf (_parameters.out.line, sizeof _parameters.out.line,
+                     "%s:%s:%u:%u:%s:%s:%s",
+                     pwd->pw_name ?: "",
+                     pwd->pw_passwd ?: "",
+                     (uint32_t) pwd->pw_uid,
+                     (uint32_t) pwd->pw_gid,
+                     pwd->pw_gecos ?: "",
+                     pwd->pw_dir ?: "",
+                     pwd->pw_shell ?: ""));
+  else
+    {
+      switch (_parameters.in.type)
+       {
+       case SID_arg:
+         {
+           char *str;
+           if (ConvertSidToStringSid (&_parameters.in.arg.sid, &str))
+             {
+               debug_printf ("User <%s> failed", str);
+               LocalFree (str);
+             }
+         }
+         break;
+       case NAME_arg:
+         debug_printf ("User <%s> failed", _parameters.in.arg.name);
+         break;
+       case ID_arg:
+         debug_printf ("User <%u> failed", _parameters.in.arg.id);
+         break;
+       }
+      _parameters.out.line[0] = '\0';
+      msglen (0);
+      error_code (ENOENT);
+    }
+}
+
+void
+client_request_pwdgrp::grp_serve ()
+{
+  struct group *grp = NULL;
+
+  switch (_parameters.in.type)
+    {
+    case SID_arg:
+      grp = (struct group *) cygwin_internal (CW_GETGRSID, 0,
+                                             &_parameters.in.arg.sid);
+      break;
+    case NAME_arg:
+      grp = getgrnam (_parameters.in.arg.name);
+      break;
+    case ID_arg:
+      grp = getgrgid (_parameters.in.arg.id);
+      break;
+    }
+  if (grp)
+    msglen (snprintf (_parameters.out.line, sizeof _parameters.out.line,
+                     "%s:%s:%u:",
+                     grp->gr_name ?: "",
+                     grp->gr_passwd ?: "",
+                     (uint32_t) grp->gr_gid));
+  else
+    {
+      switch (_parameters.in.type)
+       {
+       case SID_arg:
+         {
+           char *str;
+           if (ConvertSidToStringSid (&_parameters.in.arg.sid, &str))
+             {
+               debug_printf ("Group <%s> failed", str);
+               LocalFree (str);
+             }
+         }
+         break;
+       case NAME_arg:
+         debug_printf ("Group <%s> failed", _parameters.in.arg.name);
+         break;
+       case ID_arg:
+         debug_printf ("Group <%u> failed", _parameters.in.arg.id);
+         break;
+       }
+      _parameters.out.line[0] = '\0';
+      msglen (0);
+      error_code (ENOENT);
+    }
+}
+
+void
+client_request_pwdgrp::serve (transport_layer_base *const conn,
+                             process_cache *const cache)
+{
+  debug_printf ("Request account information");
+  if (msglen () < __builtin_offsetof (struct _pwdgrp_param_t::_pwdgrp_in_t, arg)
+                 + sizeof (uint32_t)
+      || msglen () > sizeof (_parameters.in))
+    {
+      syscall_printf ("bad request body length: got %lu", msglen ());
+      error_code (EINVAL);
+      msglen (0);
+      return;
+    }
+  error_code (0);
+  if (_parameters.in.group)
+    grp_serve ();
+  else
+    pwd_serve ();
+  debug_printf ("Request account information returns <%s> error %d", _parameters.out.line, error_code ());
+}
+#endif /* __OUTSIDE_CYGWIN__ */
This page took 0.040816 seconds and 5 git commands to generate.