ReactOS  0.4.15-dev-494-g1d8c567
nfs41_daemon.c File Reference
#include <windows.h>
#include <process.h>
#include <tchar.h>
#include <stdio.h>
#include <devioctl.h>
#include <lmcons.h>
#include <iphlpapi.h>
#include "nfs41_driver.h"
#include "nfs41_np.h"
#include "idmap.h"
#include "daemon_debug.h"
#include "upcall.h"
#include "util.h"
#include "service.h"
Include dependency graph for nfs41_daemon.c:

Go to the source code of this file.

Classes

struct  _nfs41_process_thread
 
struct  _nfsd_args
 

Macros

#define MAX_NUM_THREADS   128
 

Typedefs

typedef struct _nfs41_process_thread nfs41_process_thread
 
typedef struct _nfsd_args nfsd_args
 

Functions

static int map_user_to_ids (nfs41_idmapper *idmapper, uid_t *uid, gid_t *gid)
 
static unsigned int WINAPI thread_main (void *args)
 
VOID ServiceStop ()
 
static bool_t check_for_files ()
 
static void PrintUsage ()
 
static bool_t parse_cmdlineargs (int argc, TCHAR *argv[], nfsd_args *out)
 
static void print_getaddrinfo (struct addrinfo *ptr)
 
static int getdomainname ()
 
VOID ServiceStart (DWORD argc, LPTSTR *argv)
 

Variables

DWORD NFS41D_VERSION = 0
 
static const char FILE_NETCONFIG [] = "C:\\ReactOS\\System32\\drivers\\etc\\netconfig"
 
char localdomain_name [NFS41_HOSTNAME_LEN]
 
int default_uid = 666
 
int default_gid = 777
 
HANDLE stop_event = NULL
 

Macro Definition Documentation

◆ MAX_NUM_THREADS

#define MAX_NUM_THREADS   128

Definition at line 41 of file nfs41_daemon.c.

Typedef Documentation

◆ nfs41_process_thread

◆ nfsd_args

Function Documentation

◆ check_for_files()

static bool_t check_for_files ( )
static

Definition at line 168 of file nfs41_daemon.c.

169 {
170  FILE *fd;
171 #ifdef __REACTOS__
172  char config_path[MAX_PATH];
173 
174  if (GetSystemDirectoryA(config_path, ARRAYSIZE(config_path)))
175  {
176  StringCchCatA(config_path, ARRAYSIZE(config_path), "\\drivers\\etc\\netconfig");
177  }
178  else
179  {
180  eprintf("GetSystemDirectoryA failed with error %ld\n", GetLastError());
181  return FALSE;
182  }
183 
184  fd = fopen(config_path, "r");
185 #else
186 
187  fd = fopen(FILE_NETCONFIG, "r");
188 #endif
189  if (fd == NULL) {
190 #ifdef __REACTOS__
191  fprintf(stderr,"nfsd() failed to open file '%s'\n", config_path);
192 #else
193  fprintf(stderr,"nfsd() failed to open file '%s'\n", FILE_NETCONFIG);
194 #endif
195  return FALSE;
196  }
197  fclose(fd);
198  return TRUE;
199 }
static const char FILE_NETCONFIG[]
Definition: nfs41_daemon.c:45
#define TRUE
Definition: types.h:120
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2282
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
void eprintf(LPCSTR format,...)
Definition: daemon_debug.c:86
static int fd
Definition: io.c:51
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
STRSAFEAPI StringCchCatA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:320
smooth NULL
Definition: ftsmooth.c:416
#define MAX_PATH
Definition: compat.h:26
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
FILE * stderr

Referenced by ServiceStart().

◆ getdomainname()

static int getdomainname ( )
static

Definition at line 290 of file nfs41_daemon.c.

291 {
292  int status = 0;
293  PFIXED_INFO net_info = NULL;
294  DWORD size = 0;
295  BOOLEAN flag = FALSE;
296 
297  status = GetNetworkParams(net_info, &size);
298  if (status != ERROR_BUFFER_OVERFLOW) {
299  eprintf("getdomainname: GetNetworkParams returned %d\n", status);
300  goto out;
301  }
302  net_info = calloc(1, size);
303  if (net_info == NULL) {
304  status = GetLastError();
305  goto out;
306  }
307  status = GetNetworkParams(net_info, &size);
308  if (status) {
309  eprintf("getdomainname: GetNetworkParams returned %d\n", status);
310  goto out_free;
311  }
312 
313  if (net_info->DomainName[0] == '\0') {
314  struct addrinfo *result = NULL, *ptr = NULL, hints = { 0 };
315  char hostname[NI_MAXHOST], servInfo[NI_MAXSERV];
316 
317  hints.ai_socktype = SOCK_STREAM;
318  hints.ai_protocol = IPPROTO_TCP;
319 
320  status = getaddrinfo(net_info->HostName, NULL, &hints, &result);
321  if (status) {
323  eprintf("getdomainname: getaddrinfo failed with %d\n", status);
324  goto out_free;
325  }
326 
327  for (ptr=result; ptr != NULL; ptr=ptr->ai_next) {
329 
330  switch (ptr->ai_family) {
331  case AF_INET6:
332  case AF_INET:
333  status = getnameinfo((struct sockaddr *)ptr->ai_addr,
334  (socklen_t)ptr->ai_addrlen, hostname, NI_MAXHOST,
335  servInfo, NI_MAXSERV, NI_NAMEREQD);
336  if (status)
337  dprintf(1, "getnameinfo failed %d\n", WSAGetLastError());
338  else {
339  size_t i, len = strlen(hostname);
340  char *p = hostname;
341  dprintf(1, "getdomainname: hostname %s %d\n", hostname, len);
342  for (i = 0; i < len; i++)
343  if (p[i] == '.')
344  break;
345  if (i == len)
346  break;
347  flag = TRUE;
349  dprintf(1, "getdomainname: domainname %s %d\n",
351  goto out_loop;
352  }
353  break;
354  default:
355  break;
356  }
357  }
358 out_loop:
359  if (!flag) {
361  eprintf("getdomainname: unable to get a domain name. "
362  "Set this machine's domain name:\n"
363  "System > ComputerName > Change > More > mydomain\n");
364  }
366  } else {
367  dprintf(1, "domain name is %s\n", net_info->DomainName);
368  memcpy(localdomain_name, net_info->DomainName,
369  strlen(net_info->DomainName));
370  localdomain_name[strlen(net_info->DomainName)] = '\0';
371  }
372 out_free:
373  free(net_info);
374 out:
375  return status;
376 }
char localdomain_name[NFS41_HOSTNAME_LEN]
Definition: nfs41_daemon.c:49
namespace GUID const ADDRINFOEXW * hints
Definition: sock.c:80
#define NI_NAMEREQD
Definition: ws2def.h:355
#define TRUE
Definition: types.h:120
#define freeaddrinfo
Definition: wspiapi.h:46
#define ERROR_INTERNAL_ERROR
Definition: winerror.h:840
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define ERROR_BUFFER_OVERFLOW
Definition: winerror.h:185
#define free
Definition: debug_ros.c:5
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
void eprintf(LPCSTR format,...)
Definition: daemon_debug.c:86
char * hostname
Definition: ftp.c:88
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define dprintf
Definition: regdump.c:33
static PVOID ptr
Definition: dispmode.c:27
DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
#define AF_INET6
Definition: winsock.h:369
char DomainName[MAX_DOMAIN_NAME_LEN+4]
Definition: iptypes.h:82
INT WSAAPI WSAGetLastError(VOID)
Definition: dllmain.c:112
GLsizeiptr size
Definition: glext.h:5919
#define NI_MAXSERV
Definition: ws2def.h:360
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
int socklen_t
Definition: tcp.c:35
#define NI_MAXHOST
Definition: ws2def.h:359
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean flag
Definition: glfuncs.h:52
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
char HostName[MAX_HOSTNAME_LEN+4]
Definition: iptypes.h:81
#define getnameinfo
Definition: wspiapi.h:45
static void print_getaddrinfo(struct addrinfo *ptr)
Definition: nfs41_daemon.c:265
#define calloc
Definition: rosglue.h:14
#define AF_INET
Definition: tcpip.h:117
#define SOCK_STREAM
Definition: tcpip.h:118
GLfloat GLfloat p
Definition: glext.h:8902
GLuint64EXT * result
Definition: glext.h:11304
static SERVICE_STATUS status
Definition: service.c:31
#define getaddrinfo
Definition: wspiapi.h:44
Definition: ps.c:97

Referenced by get_default_domain(), and ServiceStart().

◆ map_user_to_ids()

static int map_user_to_ids ( nfs41_idmapper idmapper,
uid_t uid,
gid_t gid 
)
static

Definition at line 62 of file nfs41_daemon.c.

63 {
64  char username[UNLEN + 1];
65  DWORD len = UNLEN + 1;
66  int status = NO_ERROR;
67 
68  if (!GetUserNameA(username, &len)) {
69  status = GetLastError();
70  eprintf("GetUserName() failed with %d\n", status);
71  goto out;
72  }
73  dprintf(1, "map_user_to_ids: mapping user %s\n", username);
74 
75  if (nfs41_idmap_name_to_ids(idmapper, username, uid, gid)) {
76  /* instead of failing for auth_sys, fall back to 'nobody' uid/gid */
77  *uid = default_uid;
78  *gid = default_gid;
79  }
80 out:
81  return status;
82 }
int default_uid
Definition: nfs41_daemon.c:50
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
void eprintf(LPCSTR format,...)
Definition: daemon_debug.c:86
int nfs41_idmap_name_to_ids(struct idmap_context *context, const char *username, uid_t *uid_out, gid_t *gid_out)
Definition: idmap.c:889
#define NO_ERROR
Definition: dderror.h:5
int default_gid
Definition: nfs41_daemon.c:51
#define dprintf
Definition: regdump.c:33
static WCHAR username[]
Definition: url.c:32
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLsizei len
Definition: glext.h:6722
BOOL WINAPI GetUserNameA(LPSTR lpszName, LPDWORD lpSize)
Definition: misc.c:246
#define UNLEN
Definition: sspi.c:28
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by thread_main().

◆ parse_cmdlineargs()

static bool_t parse_cmdlineargs ( int  argc,
TCHAR argv[],
nfsd_args out 
)
static

Definition at line 206 of file nfs41_daemon.c.

207 {
208  int i;
209 
210  /* set defaults. */
211  out->debug_level = 1;
212  out->ldap_enable = TRUE;
213 
214  /* parse command line */
215  for (i = 1; i < argc; i++) {
216  if (argv[i][0] == TEXT('-')) {
217  if (_tcscmp(argv[i], TEXT("-h")) == 0) { /* help */
218  PrintUsage();
219  return FALSE;
220  }
221  else if (_tcscmp(argv[i], TEXT("-d")) == 0) { /* debug level */
222  ++i;
223  if (i >= argc) {
224  fprintf(stderr, "Missing debug level value\n");
225  PrintUsage();
226  return FALSE;
227  }
228  out->debug_level = _ttoi(argv[i]);
229  }
230  else if (_tcscmp(argv[i], TEXT("--noldap")) == 0) { /* no LDAP */
231  out->ldap_enable = FALSE;
232  }
233  else if (_tcscmp(argv[i], TEXT("--uid")) == 0) { /* no LDAP, setting default uid */
234  ++i;
235  if (i >= argc) {
236  fprintf(stderr, "Missing uid value\n");
237  PrintUsage();
238  return FALSE;
239  }
240  default_uid = _ttoi(argv[i]);
241  if (!default_uid) {
242  fprintf(stderr, "Invalid (or missing) anonymous uid value of %d\n",
243  default_uid);
244  return FALSE;
245  }
246  }
247  else if (_tcscmp(argv[i], TEXT("--gid")) == 0) { /* no LDAP, setting default gid */
248  ++i;
249  if (i >= argc) {
250  fprintf(stderr, "Missing gid value\n");
251  PrintUsage();
252  return FALSE;
253  }
254  default_gid = _ttoi(argv[i]);
255  }
256  else
257  fprintf(stderr, "Unrecognized option '%s', disregarding.\n", argv[i]);
258  }
259  }
260  fprintf(stdout, "parse_cmdlineargs: debug_level %d ldap is %d\n",
261  out->debug_level, out->ldap_enable);
262  return TRUE;
263 }
static int argc
Definition: ServiceArgs.c:12
#define TRUE
Definition: types.h:120
int _tcscmp(const _TCHAR *s1, const _TCHAR *s2)
Definition: tcscmp.h:8
int default_uid
Definition: nfs41_daemon.c:50
#define argv
Definition: mplay32.c:18
int default_gid
Definition: nfs41_daemon.c:51
FILE * stdout
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static void PrintUsage()
Definition: nfs41_daemon.c:201
static FILE * out
Definition: regtests2xml.c:44
#define TEXT(s)
Definition: k32.h:26
int CDECL _ttoi(const _TCHAR *str)
Definition: atoi.c:10
FILE * stderr

Referenced by ServiceStart().

◆ print_getaddrinfo()

static void print_getaddrinfo ( struct addrinfo ptr)
static

Definition at line 265 of file nfs41_daemon.c.

266 {
267  char ipstringbuffer[46];
268  DWORD ipbufferlength = 46;
269 
270  dprintf(1, "getaddrinfo response flags: 0x%x\n", ptr->ai_flags);
271  switch (ptr->ai_family) {
272  case AF_UNSPEC: dprintf(1, "Family: Unspecified\n"); break;
273  case AF_INET:
274  dprintf(1, "Family: AF_INET IPv4 address %s\n",
275  inet_ntoa(((struct sockaddr_in *)ptr->ai_addr)->sin_addr));
276  break;
277  case AF_INET6:
278  if (WSAAddressToString((LPSOCKADDR)ptr->ai_addr, (DWORD)ptr->ai_addrlen,
279  NULL, ipstringbuffer, &ipbufferlength))
280  dprintf(1, "WSAAddressToString failed with %u\n", WSAGetLastError());
281  else
282  dprintf(1, "Family: AF_INET6 IPv6 address %s\n", ipstringbuffer);
283  break;
284  case AF_NETBIOS: dprintf(1, "AF_NETBIOS (NetBIOS)\n"); break;
285  default: dprintf(1, "Other %ld\n", ptr->ai_family); break;
286  }
287  dprintf(1, "Canonical name: %s\n", ptr->ai_canonname);
288 }
#define AF_NETBIOS
Definition: winsock.h:363
#define dprintf
Definition: regdump.c:33
static PVOID ptr
Definition: dispmode.c:27
smooth NULL
Definition: ftsmooth.c:416
#define AF_INET6
Definition: winsock.h:369
#define AF_UNSPEC
Definition: winsock.h:344
#define inet_ntoa(addr)
Definition: inet.h:100
INT WSAAPI WSAGetLastError(VOID)
Definition: dllmain.c:112
unsigned long DWORD
Definition: ntddk_ex.h:95
#define AF_INET
Definition: tcpip.h:117
#define WSAAddressToString
Definition: winsock2.h:2443

Referenced by getdomainname().

◆ PrintUsage()

static void PrintUsage ( void  )
static

Definition at line 201 of file nfs41_daemon.c.

202 {
203  fprintf(stderr, "Usage: nfsd.exe -d <debug_level> --noldap "
204  "--uid <non-zero value> --gid\n");
205 }
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
FILE * stderr

Referenced by parse_cmdlineargs().

◆ ServiceStart()

VOID ServiceStart ( DWORD  argc,
LPTSTR argv 
)

Definition at line 381 of file nfs41_daemon.c.

383 {
384  DWORD status = 0, len;
385  // handle to our drivers
386  HANDLE pipe;
388  nfs41_idmapper *idmapper = NULL;
389  int i;
390  nfsd_args cmd_args;
391 
392  if (!check_for_files())
393  exit(0);
394  if (!parse_cmdlineargs(argc, argv, &cmd_args))
395  exit(0);
396  set_debug_level(cmd_args.debug_level);
397  open_log_files();
398 
399 #ifdef __REACTOS__
400  /* Start the kernel part */
401  {
403  if (hSvcMan)
404  {
405  HANDLE hSvc = OpenService(hSvcMan, "nfs41_driver", SERVICE_ALL_ACCESS);
406  if (hSvc)
407  {
408  SERVICE_STATUS SvcSt;
409  QueryServiceStatus(hSvc, &SvcSt);
410  if (SvcSt.dwCurrentState != SERVICE_RUNNING)
411  {
412  if (StartService(hSvc, 0, NULL))
413  {
414  dprintf(1, "NFS41 driver started\n");
415  }
416  else
417  {
418  eprintf("Driver failed to start: %d\n", GetLastError());
419  }
420  }
421  else
422  {
423  eprintf("Driver in state: %x\n", SvcSt.dwCurrentState);
424  }
425 
426  CloseServiceHandle(hSvc);
427  }
428  else
429  {
430  eprintf("Failed to open service: %d\n", GetLastError());
431  }
432 
433  CloseServiceHandle(hSvcMan);
434  }
435  else
436  {
437  eprintf("Failed to open service manager: %d\n", GetLastError());
438  }
439  }
440 #endif
441 
442 #ifdef _DEBUG
443  /* dump memory leaks to stderr on exit; this requires the debug heap,
444  /* available only when built in debug mode under visual studio -cbodley */
447 #pragma warning (push)
448 #pragma warning (disable : 4306) /* conversion from 'int' to '_HFILE' of greater size */
450 #pragma warning (pop)
451  dprintf(1, "debug mode. dumping memory leaks to stderr on exit.\n");
452 #endif
453  /* acquire and store in global memory current dns domain name.
454  * needed for acls */
455  if (getdomainname())
456  exit(0);
457 
459 
460  if (cmd_args.ldap_enable) {
461  status = nfs41_idmap_create(&idmapper);
462  if (status) {
463  eprintf("id mapping initialization failed with %d\n", status);
464  goto out_logs;
465  }
466  }
467 
469  dprintf(1, "NFS41 Daemon starting: version %d\n", NFS41D_VERSION);
470 
473  0, NULL);
474  if (pipe == INVALID_HANDLE_VALUE)
475  {
476  eprintf("Unable to open upcall pipe %d\n", GetLastError());
477  goto out_idmap;
478  }
479 
480  dprintf(1, "starting nfs41 mini redirector\n");
482  &NFS41D_VERSION, sizeof(DWORD), NULL, 0, (LPDWORD)&len, NULL);
483  if (!status) {
484  eprintf("IOCTL_NFS41_START failed with %d\n",
485  GetLastError());
486  goto out_pipe;
487  }
488 
489 #ifndef STANDALONE_NFSD
491  if (stop_event == NULL)
492  goto out_pipe;
493 #endif
494 
495  for (i = 0; i < MAX_NUM_THREADS; i++) {
497  idmapper, 0, &tids[i].tid);
498  if (tids[i].handle == INVALID_HANDLE_VALUE) {
499  status = GetLastError();
500  eprintf("_beginthreadex failed %d\n", status);
501  goto out_pipe;
502  }
503  }
504 #ifndef STANDALONE_NFSD
505  // report the status to the service control manager.
507  goto out_pipe;
509 #else
510  //This can be changed to waiting on an array of handles and using waitformultipleobjects
511  dprintf(1, "Parent waiting for children threads\n");
512  for (i = 0; i < MAX_NUM_THREADS; i++)
514 #endif
515  dprintf(1, "Parent woke up!!!!\n");
516 
517 out_pipe:
518  CloseHandle(pipe);
519 out_idmap:
520  if (idmapper) nfs41_idmap_free(idmapper);
521 out_logs:
522 #ifndef STANDALONE_NFSD
523  close_log_files();
524 #endif
525  return;
526 }
#define CreateEvent
Definition: winbase.h:3588
#define StartService
Definition: winsvc.h:585
static int argc
Definition: ServiceArgs.c:12
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:407
static bool_t check_for_files()
Definition: nfs41_daemon.c:168
DWORD dwCurrentState
Definition: winsvc.h:100
#define _CRTDBG_ALLOC_MEM_DF
Definition: crtdbg.h:55
#define _CRT_WARN
Definition: crtdbg.h:27
static int getdomainname()
Definition: nfs41_daemon.c:290
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
#define NFS41_USER_DEVICE_NAME_A
Definition: nfs41_driver.h:28
bool_t ldap_enable
Definition: nfs41_daemon.c:164
#define INVALID_HANDLE_VALUE
Definition: compat.h:400
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
void eprintf(LPCSTR format,...)
Definition: daemon_debug.c:86
#define SERVICE_ALL_ACCESS
Definition: winsvc.h:62
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void *_Security, _In_ unsigned _StackSize, _In_ unsigned(__stdcall *_StartAddress)(void *), _In_opt_ void *_ArgList, _In_ unsigned _InitFlag, _Out_opt_ unsigned *_ThrdAddr)
#define argv
Definition: mplay32.c:18
#define NO_ERROR
Definition: dderror.h:5
#define _CrtSetReportFile(t, f)
Definition: crtdbg.h:247
#define OpenService
Definition: winsvc.h:576
#define FILE_SHARE_READ
Definition: compat.h:125
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE stop_event
Definition: nfs41_daemon.c:55
void set_debug_level(int level)
Definition: daemon_debug.c:35
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
void nfs41_server_list_init()
Definition: nfs41_server.c:48
#define dprintf
Definition: regdump.c:33
#define GENERIC_WRITE
Definition: nt_native.h:90
#define SERVICE_RUNNING
Definition: winsvc.h:24
static unsigned int WINAPI thread_main(void *args)
Definition: nfs41_daemon.c:84
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
Definition: scm.c:577
DWORD NFS41D_VERSION
Definition: nfs41_daemon.c:42
smooth NULL
Definition: ftsmooth.c:416
void close_log_files()
Definition: daemon_debug.c:59
#define OPEN_EXISTING
Definition: compat.h:435
#define IOCTL_NFS41_START
Definition: nfs41_driver.h:43
#define _CRTDBG_LEAK_CHECK_DF
Definition: crtdbg.h:60
#define OpenSCManager
Definition: winsvc.h:575
PVOID HANDLE
Definition: typedefs.h:72
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL WINAPI QueryServiceStatus(SC_HANDLE hService, LPSERVICE_STATUS lpServiceStatus)
Definition: scm.c:2788
#define _CRTDBG_MODE_FILE
Definition: crtdbg.h:32
GLenum GLsizei len
Definition: glext.h:6722
#define _CRTDBG_FILE_STDERR
Definition: crtdbg.h:40
#define GENERIC_READ
Definition: compat.h:124
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: deviceio.c:136
IN OUT PVCB OUT PDIRENT OUT PBCB IN BOOLEAN CreateFile
Definition: fatprocs.h:913
static bool_t parse_cmdlineargs(int argc, TCHAR *argv[], nfsd_args *out)
Definition: nfs41_daemon.c:206
#define SC_MANAGER_ALL_ACCESS
Definition: winsvc.h:13
uint32_t * LPDWORD
Definition: typedefs.h:58
void open_log_files()
Definition: daemon_debug.c:40
int nfs41_idmap_create(struct idmap_context **context_out)
Definition: idmap.c:805
void exit(int exitcode)
Definition: _exit.c:33
#define INFINITE
Definition: serial.h:102
static TfClientId tid
#define _CrtSetDbgFlag(f)
Definition: crtdbg.h:253
void nfs41_idmap_free(struct idmap_context *context)
Definition: idmap.c:867
#define _CrtSetReportMode(t, f)
Definition: crtdbg.h:246
BOOL ReportStatusToSCMgr(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint)
Definition: service.c:240
#define MAX_NUM_THREADS
Definition: nfs41_daemon.c:41
Definition: ps.c:97

Referenced by CmdDebugService(), IopLoadServiceModule(), and service_main().

◆ ServiceStop()

VOID ServiceStop ( )

Definition at line 156 of file nfs41_daemon.c.

157 {
158  if (stop_event)
160 }
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
HANDLE stop_event
Definition: nfs41_daemon.c:55

Referenced by ControlHandler(), and service_ctrl().

◆ thread_main()

static unsigned int WINAPI thread_main ( void args)
static

Definition at line 84 of file nfs41_daemon.c.

85 {
86  nfs41_idmapper *idmapper = (nfs41_idmapper*)args;
87  DWORD status = 0;
88  HANDLE pipe;
89  // buffer used to process upcall, assumed to be fixed size.
90  // if we ever need to handle non-cached IO, need to make it dynamic
91  unsigned char outbuf[UPCALL_BUF_SIZE], inbuf[UPCALL_BUF_SIZE];
92  DWORD inbuf_len = UPCALL_BUF_SIZE, outbuf_len;
94 
97  0, NULL);
98  if (pipe == INVALID_HANDLE_VALUE)
99  {
100  eprintf("Unable to open upcall pipe %d\n", GetLastError());
101  return GetLastError();
102  }
103 
104  while(1) {
106  outbuf, UPCALL_BUF_SIZE, (LPDWORD)&outbuf_len, NULL);
107  if (!status) {
108  eprintf("IOCTL_NFS41_READ failed %d\n", GetLastError());
109  continue;
110  }
111 
112  status = upcall_parse(outbuf, (uint32_t)outbuf_len, &upcall);
113  if (status) {
114  upcall.status = status;
115  goto write_downcall;
116  }
117 
118  /* map username to uid/gid */
119  status = map_user_to_ids(idmapper, &upcall.uid, &upcall.gid);
120  if (status) {
121  upcall.status = status;
122  goto write_downcall;
123  }
124 
125  if (upcall.opcode == NFS41_SHUTDOWN) {
126  printf("Shutting down..\n");
127  exit(0);
128  }
129 
131 
132 write_downcall:
133  dprintf(1, "writing downcall: xid=%lld opcode=%s status=%d "
134  "get_last_error=%d\n", upcall.xid, opcode2string(upcall.opcode),
135  upcall.status, upcall.last_error);
136 
137  upcall_marshall(&upcall, inbuf, (uint32_t)inbuf_len, (uint32_t*)&outbuf_len);
138 
139  dprintf(2, "making a downcall: outbuf_len %ld\n\n", outbuf_len);
141  inbuf, inbuf_len, NULL, 0, (LPDWORD)&outbuf_len, NULL);
142  if (!status) {
143  eprintf("IOCTL_NFS41_WRITE failed with %d xid=%lld opcode=%s\n",
144  GetLastError(), upcall.xid, opcode2string(upcall.opcode));
146  }
147  if (upcall.status != NFSD_VERSION_MISMATCH)
149  }
150  CloseHandle(pipe);
151 
152  return GetLastError();
153 }
void upcall_cancel(IN nfs41_upcall *upcall)
Definition: upcall.c:189
#define CloseHandle
Definition: compat.h:407
int upcall_parse(IN unsigned char *buffer, IN uint32_t length, OUT nfs41_upcall *upcall)
Definition: upcall.c:75
static int inbuf
Definition: adnsresfilter.c:73
int upcall_handle(IN nfs41_upcall *upcall)
Definition: upcall.c:138
#define NFS41_USER_DEVICE_NAME_A
Definition: nfs41_driver.h:28
#define INVALID_HANDLE_VALUE
Definition: compat.h:400
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
void eprintf(LPCSTR format,...)
Definition: daemon_debug.c:86
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
Definition: match.c:390
#define FILE_SHARE_READ
Definition: compat.h:125
void upcall_cleanup(IN nfs41_upcall *upcall)
Definition: upcall.c:197
#define dprintf
Definition: regdump.c:33
#define GENERIC_WRITE
Definition: nt_native.h:90
#define NFSD_VERSION_MISMATCH
Definition: upcall.h:28
smooth NULL
Definition: ftsmooth.c:416
static int map_user_to_ids(nfs41_idmapper *idmapper, uid_t *uid, gid_t *gid)
Definition: nfs41_daemon.c:62
#define OPEN_EXISTING
Definition: compat.h:435
unsigned long DWORD
Definition: ntddk_ex.h:95
#define GENERIC_READ
Definition: compat.h:124
void upcall_marshall(IN nfs41_upcall *upcall, OUT unsigned char *buffer, IN uint32_t length, OUT uint32_t *length_out)
Definition: upcall.c:157
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: deviceio.c:136
IN OUT PVCB OUT PDIRENT OUT PBCB IN BOOLEAN CreateFile
Definition: fatprocs.h:913
#define UPCALL_BUF_SIZE
Definition: nfs41_const.h:42
UINT32 uint32_t
Definition: types.h:75
const char * opcode2string(DWORD opcode)
Definition: daemon_debug.c:280
#define IOCTL_NFS41_READ
Definition: nfs41_driver.h:48
nfs41_updowncall_list upcall
Definition: nfs41_driver.c:273
#define IOCTL_NFS41_WRITE
Definition: nfs41_driver.h:49
uint32_t * LPDWORD
Definition: typedefs.h:58
void exit(int exitcode)
Definition: _exit.c:33
static SERVICE_STATUS status
Definition: service.c:31
#define printf
Definition: config.h:203
Definition: ps.c:97

Referenced by ServiceStart().

Variable Documentation

◆ default_gid

int default_gid = 777

Definition at line 51 of file nfs41_daemon.c.

Referenced by map_user_to_ids(), and parse_cmdlineargs().

◆ default_uid

int default_uid = 666

Definition at line 50 of file nfs41_daemon.c.

Referenced by map_user_to_ids(), and parse_cmdlineargs().

◆ FILE_NETCONFIG

const char FILE_NETCONFIG[] = "C:\\ReactOS\\System32\\drivers\\etc\\netconfig"
static

Definition at line 45 of file nfs41_daemon.c.

Referenced by check_for_files().

◆ localdomain_name

char localdomain_name[NFS41_HOSTNAME_LEN]

Definition at line 49 of file nfs41_daemon.c.

Referenced by getdomainname(), and handle_setacl().

◆ NFS41D_VERSION

DWORD NFS41D_VERSION = 0

Definition at line 42 of file nfs41_daemon.c.

Referenced by marshall_mount(), ServiceStart(), and upcall_parse().

◆ stop_event

HANDLE stop_event = NULL