home *** CD-ROM | disk | FTP | other *** search
/ Borland Programmer's Resource / Borland_Programmers_Resource_CD_1995.iso / utils / sossntr3 / src / netd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-19  |  4.8 KB  |  203 lines

  1. /*
  2.  *  netd.c -- 
  3.  *      Net daemon for PC NFS file server.  It sets up and
  4.  *      arbitrates the port mapper daemon, mount daemon and
  5.  *      the NFS server.
  6.  *
  7.  *  Author:
  8.  *      See-Mong Tan, 6/11/88
  9.  *  Modified by:
  10.  *      Rich Braun, 3/29/91
  11.  *
  12.  *  Revision history:
  13.  *  
  14.  * $Log: netd.c_v $
  15.  * Revision 1.5  1991/05/13  17:44:55  richb
  16.  * Add the -b command line option to specify read/write request size.
  17.  *
  18.  * Revision 1.4  1991/04/11  20:39:04  richb
  19.  * Add -t option and use standard parser (getopt).
  20.  *
  21.  */
  22.  
  23. #ifdef RCSID
  24. static char _rcsid_ = "$Id: netd.c_v 1.5 1991/05/13 17:44:55 richb Exp $";
  25. #endif
  26.  
  27. #include "common.h"
  28.  
  29. extern int getopt();
  30. extern int sock_start();
  31. extern void svc_init();
  32. extern long coreleft();
  33.  
  34. bool_t NFS_VERBOSE = FALSE; /* flag for nfs verbose mode */
  35. bool_t NFS_READONLYFS = FALSE;  /* true if started as a read only filesystem */
  36. bool_t NFS_TRUNCATENAMES = FALSE; /* true if long names should be truncated */
  37. int    nfsrd_size = RD_SIZ; /* I/O read default size */
  38. int    nfswr_size = WR_SIZ; /* I/O write default size */
  39.  
  40. main(argc, argv)
  41.     int argc;
  42.     char *argv[];
  43. {
  44. time_t now;
  45.  
  46.     netd_init(argc, argv);      /* initialize netd */
  47.  
  48.     time (&now);
  49.     (void) printf("SOSS v%s %s (compiled %s)\n\nStarting net services at %s",
  50.               VERSION_NUM, VERSION_DATE, __DATE__, ctime (&now));
  51.  
  52.     sock_start();
  53.     svc_init();
  54.  
  55.     /* initialize and register services */
  56.     if (! pmap_init())
  57.         netd_Punt("portmapper");
  58.     DBGPRT0 (nfsdebug, "netd: port mapper created");
  59.  
  60.     if (! mountd_init())
  61.         netd_Punt("mount daemon");
  62.     DBGPRT0 (nfsdebug, "netd: mount daemon created");
  63.  
  64.     if (! nfs_init())
  65.         netd_Punt("nfs server");
  66.     DBGPRT0 (nfsdebug, "netd: nfs server created");
  67.  
  68.     if (! inode_init())
  69.         netd_Punt("inode interface");
  70.  
  71.     if (! dtime_init())
  72.         netd_Punt("dos time interface");
  73.  
  74. #ifdef NTFSAUTH
  75.     if( ! ntfs_mapping())
  76.         netd_Punt("can't map NTFS authent.");
  77. #endif
  78.     (void) printf("netd: port mapper, mountd and nfs server running\n\n");
  79.     DBGPRT1 (nfsdebug, "Memory available = %ld\n", coreleft());
  80.     (void) svc_run();       /* wait for and service net requests */
  81.     netd_Punt("net daemon returned");
  82.     return 0;
  83. }
  84.  
  85. long
  86. coreleft(void)
  87. {
  88.     MEMORYSTATUS m;
  89.     GlobalMemoryStatus(&m);
  90.     return (long) m.dwAvailPageFile;
  91. }
  92.  
  93.  
  94. /*
  95.  *  void netd_Punt(char *s) --
  96.  *      Prints net daemon error message and exits.
  97.  *      For irrecoverable errors.
  98.  */
  99. void netd_Punt(s)
  100.     char *s;
  101. {
  102.     int i;
  103.  
  104.     (void) fprintf(stderr, "net daemon error: %s\n", s);
  105.     /* Does this really work? */
  106.     for(i = 0; i < 3; i++)
  107.         closesocket(i);
  108.     exit(1);
  109. }
  110.  
  111. int
  112. netd_daemon(void)
  113. {
  114.     SECURITY_ATTRIBUTES saPipe; 
  115.     PROCESS_INFORMATION pi;
  116.     STARTUPINFO si;  /* for CreateProcess call */
  117.     int r;
  118.     char *cmd = "soss";
  119.  
  120.     saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
  121.     saPipe.lpSecurityDescriptor = NULL;
  122.     saPipe.bInheritHandle = FALSE;
  123.  
  124.     memset(&si, 0, sizeof(si));
  125.     si.cb = sizeof(si);
  126.     r = CreateProcess(NULL,  /* filename */
  127.         cmd,  /* full command line for child */
  128.         NULL,  /* process security descriptor */
  129.         NULL,  /* thread security descriptor */
  130.         FALSE,  /* inherit handles? */
  131.         0,  /* creation flags */
  132.         NULL,  /* inherited environment address */
  133.         NULL,  /* startup dir; NULL = start in current */
  134.         &si,  /* pointer to startup info (input) */
  135.         &pi);  /* pointer to process info (output) */
  136.     if (!r) {
  137.         fprintf(stderr,"CreateProcess() failed!\n");
  138.         return 1;
  139.     }
  140.     CloseHandle(pi.hThread);
  141.     CloseHandle(pi.hProcess);
  142.     return 0;
  143. }
  144.  
  145. /*
  146.  *  void netd_init(int argc, char **argv) --
  147.  *      Initializes the net daemon.  Should be called before any other
  148.  *      routine in the server.
  149.  */
  150. void netd_init(argc, argv)
  151.     int argc;
  152.     char *argv[];
  153. {
  154.         dbg_init ();
  155.     netd_parsecmdln(argc, argv);    /* parse command line */
  156.     signal(SIGINT, netd_break); /* break handler */
  157. }
  158.  
  159. /*
  160.  *  void netd_break() --
  161.  *      Break handler.  Closes all sockets and exits.
  162.  */
  163. void netd_break(int x)
  164. {
  165.     int i;
  166.  
  167.     (void) fprintf(stderr, "Netd:  break caught... exiting\n");
  168.     for(i = 0; i < 3; i++)
  169.         closesocket(i);
  170.  
  171.     exit(1);
  172. }
  173.  
  174. /*
  175.  *  void netd_parsecmdln(int argc, char **argv) --
  176.  *      Parse command line arguments.
  177.  */
  178. void netd_parsecmdln(argc, argv)
  179.     int argc;
  180.     char *argv[];
  181. {
  182.     int c;
  183.     extern int optind;
  184.     extern char *optarg;
  185.     int err = FALSE;
  186.  
  187.     while ((c = getopt (argc, argv, "b:drtv")) != -1)
  188.       switch (c) {
  189.     case 'b':       if (sscanf (optarg, "%d", &nfsrd_size) == 1)
  190.                nfswr_size = nfsrd_size;
  191.             else
  192.                err = TRUE;
  193.             break;
  194.     case 'd':   printf("NETD_DAEMON!\n"); netd_daemon(); exit(0);
  195.     case 'r':   NFS_READONLYFS = TRUE;    break;
  196.     case 't':   NFS_TRUNCATENAMES = TRUE; break;
  197.     case 'v':   NFS_VERBOSE = TRUE;   break;
  198.     default:        err = TRUE;
  199.       }
  200.       if (err || optind < argc)
  201.     netd_Punt("Usage: soss [ -b blocksize -rtv ]");
  202. }       
  203.