home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR4 / SHTDWN15.ZIP / SHUTDWN2.C < prev   
C/C++ Source or Header  |  1993-12-29  |  7KB  |  243 lines

  1. /* Shutdown for OS/2
  2.  
  3.   version    : 1.5
  4.   compiler   : Borland C++ v1.0 for OS/2
  5.  
  6.   created on : 29 March 1993
  7.                Santiago Crespo, 2:341/24@fidonet.org
  8.   modified   : 29 December 1993
  9.                Steven van.Loef, 2:512/45.16@fidonet.org
  10.                added option to shutdown after specified seconds
  11.                added option to shutdown on specified date and/or time
  12. */
  13.  
  14. #define USAGE "Shutdown v1.5 for OS/2 2.x\n\n" \
  15. "Usage      : SHUTDOWN.EXE [[/axxxx] | [[/dyyyymmdd] [/thhmm]]]\n" \
  16. "             /a - shutdown after xxxx seconds\n" \
  17. "             /d - shutdown on YYYYMMDD (Year, Month, Day)\n" \
  18. "             /t - shutdown on HHMM (24 hour format)\n" \
  19. "             /? - show this help\n" \
  20. "             SHUTDOWN without options will shutdown the system immediately\n\n"
  21.  
  22. #define INCL_DOSPROCESS
  23. #define INCL_DOSERRORS
  24. #define INCL_NOPMAPI
  25.  
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include <os2.h>
  30.  
  31. #define OPT_STRING      "a~d~t~?"
  32. /* Meaning:
  33.  *
  34.  * -? takes no arguments.
  35.  * -a, -d and -t take mandatory arguments (I set 'optneed' to '~', below).
  36.  */
  37.  
  38. #define OPT_CHARS       "-/"
  39. /* Meaning:
  40.  *
  41.  * Options can begin with '-', or '/'.
  42.  */
  43.  
  44. /* Global variables for egetopt(): */
  45. extern int optneed;     /* character used for mandatory arguments */
  46. extern int optmaybe;    /* character used for optional arguments */
  47. extern int optchar;     /* character which begins a given argument */
  48. extern int optbad;      /* what egetopt() returns for a bad option */
  49. extern int opterrfd;    /* where egetopt() error messages go */
  50. extern char *optstart;  /* string which contains valid option start chars */
  51. extern int optind;      /* index of current argv[] */
  52. extern int optopt;      /* the actual option pointed to */
  53. extern int opterr;      /* set to 0 to suppress egetopt's error messages */
  54. extern char *optarg;    /* the argument of the option */
  55.  
  56. /* Functions */
  57. extern int egetopt(int, char **, char *);
  58. void sdWaitSec(ULONG);
  59. void sdWaitDayTime(DATETIME *);
  60. void Usage(void);
  61.  
  62. void main(int argc, char *argv[])
  63. {
  64.     DATETIME dtSdTime;
  65.     ULONG    seconds = 0,
  66.              sdate,
  67.              stime;
  68.     USHORT   rc;
  69.     UCHAR    method = 0;
  70.     int      ch;
  71.     char     months[][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
  72.                             "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
  73.  
  74.     opterrfd = fileno(stderr);      /* errors to stderr */
  75.     opterr = 1;             /* set this to 1 to get egetopt's error msgs */
  76.     optbad = '!';           /* return '!' instead of '?' on error */
  77.     optneed = '~';          /* mandatory arg identifier (in OPT_STRING) */
  78.     optstart = OPT_CHARS;   /* characters that can start options */
  79.  
  80.     DosGetDateTime (&dtSdTime);
  81.     dtSdTime.hours = dtSdTime.minutes = 0;
  82.  
  83.     /* process command line arguments */
  84.     while ((ch = egetopt(argc, argv, OPT_STRING)) != EOF)
  85.     {
  86.         switch (ch)
  87.         {
  88.             case '?':
  89.                 Usage();
  90.                 break;
  91.  
  92.             case 'a':
  93.                 if (method > 1 || strlen(optarg) > 4)
  94.                     Usage();
  95.                 seconds = atol(optarg);
  96.                 method = 1; /* in x seconds */
  97.                 break;
  98.  
  99.             case 'd':
  100.                 if (seconds != 0 || strlen(optarg) != 8)
  101.                     Usage();
  102.                 sdate = atol(optarg);
  103.                 dtSdTime.year  = sdate / 10000;
  104.                 dtSdTime.month = (sdate - dtSdTime.year * 10000) / 100;
  105.                 dtSdTime.day   = (sdate - (dtSdTime.year * 10000) -
  106.                                  (dtSdTime.month * 100));
  107.                 if (method == 3)
  108.                     method = 4;   /* date & time */
  109.                 else
  110.                     method = 2;   /* date only */
  111.                 break;
  112.  
  113.             case 't':
  114.                 if (seconds != 0 || strlen(optarg) != 4)
  115.                     Usage();
  116.                 stime = atol(optarg);
  117.                 dtSdTime.hours   = stime / 100;
  118.                 dtSdTime.minutes = (stime - dtSdTime.hours * 100);
  119.                 if (method == 2)
  120.                     method = 4;   /* date & time */
  121.                 else
  122.                     method = 3;   /* time only */
  123.                 break;
  124.  
  125.             case '!':
  126.                 Usage();
  127.                 break;
  128.  
  129.             default:
  130.                 Usage();
  131.                 break;
  132.         }
  133.     }
  134.  
  135.     fprintf(stderr, "Shutdown v1.5 for OS/2 2.x\n\n");
  136.     switch (method)
  137.     {
  138.         case 1:
  139.             fprintf(stderr, "Shutting down the system in %4d seconds", seconds);
  140.             break;
  141.  
  142.         case 2:
  143.         case 3:
  144.         case 4:
  145.             fprintf(stderr, "The system will shutdown on %02d %s %4d at " \
  146.                     "%02d:%02d\n",
  147.                     dtSdTime.day, months[dtSdTime.month - 1], dtSdTime.year,
  148.                     dtSdTime.hours, dtSdTime.minutes);
  149.             break;
  150.  
  151.         default:
  152.             fprintf(stderr, "The system will shutdown immediately...\n");
  153.     }
  154.  
  155.     /* Wait until shutdown time */
  156.     if (method != 0)
  157.     {
  158.         if (method == 1)
  159.             sdWaitSec(seconds);
  160.         else
  161.             sdWaitDayTime(&dtSdTime);
  162.     }
  163.  
  164.     /* Perform the shutdown */
  165.     rc = DosShutdown(0L);
  166.  
  167.     /* Display result of shutdown */
  168.     switch (rc)
  169.     {
  170.         case NO_ERROR:
  171.             fprintf(stderr, "\nThe system was shutdown succesfully, you can " \
  172.                             "now turn of the power");
  173.             break;
  174.  
  175.         case ERROR_ALREADY_SHUTDOWN:
  176.             fprintf(stderr, "\nThe system was already shutdown, therefor it " \
  177.                             "is safe to turn of the power now");
  178.             break;
  179.  
  180.         case ERROR_INVALID_PARAMETER:
  181.             fprintf(stderr, "\nInvalid paramater to DosShutdown, please " \
  182.                             "contact the author");
  183.             break;
  184.  
  185.         default:
  186.             fprintf(stderr, "\nUnknown return code [%lu], please contact " \
  187.                             "the author", rc);
  188.             break;
  189.     }
  190. }
  191.  
  192. void sdWaitSec(ULONG seconds)
  193. {
  194.     DATETIME dtTime;
  195.     ULONG    sdtime,
  196.              total,
  197.              diff;
  198.  
  199.     diff = sdtime = 0;
  200.  
  201.     /* enter loop until shutdown time */
  202.     while (diff < seconds)
  203.     {
  204.         DosGetDateTime (&dtTime);
  205.         total = (dtTime.hours) * 3600 +
  206.                 (dtTime.minutes * 60) +
  207.                 (dtTime.seconds);
  208.  
  209.         if (sdtime == 0)
  210.             sdtime = total;
  211.  
  212.         diff = (total - sdtime);
  213.         fprintf (stderr, "%4d seconds", (seconds - diff));
  214.         DosSleep(500);
  215.     }
  216.     fprintf(stderr, "\n");
  217. }
  218.  
  219. void sdWaitDayTime(DATETIME *dtSdTime)
  220. {
  221.     DATETIME dtTime;
  222.  
  223.     while (1)
  224.     {
  225.         DosGetDateTime (&dtTime);
  226.         if (dtTime.year == dtSdTime->year)
  227.             if (dtTime.month == dtSdTime->month)
  228.                 if (dtTime.day == dtSdTime->day)
  229.                     if (dtTime.hours == dtSdTime->hours)
  230.                         if (dtTime.minutes == dtSdTime->minutes)
  231.                             break;
  232.         DosSleep(500);
  233.     }
  234. }
  235.  
  236. /* Display usage information if wrong argument supplied or /? issued */
  237. void Usage(void)
  238. {
  239.     fprintf(stderr, USAGE);
  240.     exit(0);
  241. }
  242.  
  243.