Annotation of os2sdk/demos/examples/vioreg/register.c, revision 1.1.1.1

1.1       root        1: /*  Main entry point to REGISTER.  This routine does initial setup,   */
                      2: /*  such as opening the files, allocating the shared memory,         */
                      3: /*  registering the replacement routine, calling the original routine */
                      4: /*  and starting the ACCESS routine in a different screen group.      */
                      5: /*                                                                   */
                      6: /* Created by Microsoft Corp. 1988                                   */
                      7: 
                      8: 
                      9: #define INCL_DOSSESMGR
                     10: #define INCL_DOSFILEMGR
                     11: #define INCL_DOSMEMMGR
                     12: #define INCL_DOSSEMAPHORES
                     13: #define INCL_SUB
                     14: 
                     15: #include <os2def.h>
                     16: #include <bse.h>
                     17: #include <stdio.h>
                     18: #include <fcntl.h>
                     19: #include "share.h"        /* Common declarations between processes */
                     20: 
                     21: extern unsigned _aenvseg;  /* Used by GetPath in getting the full path */
                     22: extern unsigned _acmdln;   /* name of this program (the one used by    */
                     23:                           /* EXECPGM())                               */
                     24: 
                     25: int fileopen();
                     26: void GetPath();
                     27: 
                     28: 
                     29: main(argc, argv)
                     30: int argc;
                     31: NPCH argv[];
                     32: 
                     33: { STARTDATA SDbuf;                      /* Stores process data for
                     34:                                            DosStartSession */
                     35:   struct ShareRec far *SmemPtr;         /* Shared memory layout defined in
                     36:                                            Share.h  */
                     37:   HFILE fpoint;                         /* file pointer */
                     38:   USHORT byread;                        /* Number of bytes read by DosRead */
                     39:   unsigned rc;                          /* return code */
                     40:   SEL Selector;                         /* Shared memory selector */
                     41:   USHORT SessionID, ProcessID;          /* Values returned by DosStartSession
                     42:                                            when child process is started.
                     43:                                            ACCESS.EXE isn't a child process. */
                     44:   char string[10];                      /* Read by DosRead, written by
                     45:                                            VioWrtTTy */
                     46:   char *spbuf, pathbuf[128], Inputs[10];
                     47:   char pathname[128], modname[128];
                     48: 
                     49:    /* If no file is specified, exit the program to start again */
                     50:    if (argc == 1)  {
                     51:       printf("Usage: Register n\n");
                     52:       printf("  Must specify n as 1,2, or 3\n");
                     53:       DosExit(EXIT_PROCESS,0);
                     54:       }
                     55: 
                     56:    /* Allocate shared memory for counter in ACCESS.EXE */
                     57:    if (rc = DosAllocShrSeg( SHRSEGSIZE, SHRSEGNAME, &Selector))  {
                     58:             printf("Alloc of shared memory failed, error: %d\n", rc);
                     59:             DosExit(EXIT_PROCESS,0);
                     60:             }
                     61: 
                     62:    /* Get a far pointer from a 16-bit selector */
                     63:    SmemPtr = (struct ShareRec far *) MAKEP(Selector,0);
                     64: 
                     65:    /* Initialize shared memory semaphores */
                     66:    DosSemSet((HSEM)&(SmemPtr->updated));
                     67:    DosSemClear((HSEM)&(SmemPtr->mutexsem));
                     68:    SmemPtr->count = 0;
                     69:    SmemPtr->mutexsem = 0;
                     70:    SmemPtr->totalength = 0;
                     71: 
                     72:    /* Data that describes ACCESS.EXE for DosStartSession */
                     73:    spbuf = "SHARED MEMORY ACCESS";
                     74:    SDbuf.cb = sizeof(SDbuf);
                     75:    SDbuf.Related = 0;                    /* Unrelated process */
                     76:    SDbuf.FgBg = 0;                       /* Start ACCESS.EXE in foreground */
                     77:    SDbuf.TraceOpt = 0;                   /* Run synchronously */
                     78:    SDbuf.PgmTitle = spbuf;               /* Title in session manager box */
                     79:    GetPath(pathbuf);
                     80:    sprintf(pathname, "%s%s", pathbuf,"ACCESS.EXE");
                     81:    SDbuf.PgmName= pathname;              /* Exec path - see GetPath */
                     82:    SDbuf.PgmInputs= 0L;                  /* No command line arguments */
                     83:    SDbuf.TermQ = 0L;                     /* No notification queue */
                     84: 
                     85:    /* Start ACCESS.EXE using above data */
                     86:    /* SessionID and ProcessID are not returned - unrelated process */
                     87:    DosStartSession(&SDbuf, &SessionID, &ProcessID);
                     88: 
                     89:    /* Register the replacement routine in the dynamic link module, within
                     90:       this screen group. VIOROUT is the name of the dll, and VIOROUT is the
                     91:       name of the replacement routine in the dll.  */
                     92:    rc = VioRegister("VIOROUT", "VIOROUT", 0x4000L, 0L);
                     93:    if (rc >= 1)
                     94:       printf(" VioRegister error: %d\n", rc);
                     95: 
                     96:    /* Open file for VioWrtTTy to read */
                     97:    fpoint = fileopen(pathbuf,*argv[1]);
                     98: 
                     99:    DosRead(fpoint, string, 10, &byread);
                    100:    while (byread != 0) {
                    101:       /* Calling VioWrtTTy sends control to the VIO router, which invokes
                    102:         the replacement routine registered in VioRegister */
                    103:       VioWrtTTy(string,10,0);
                    104:       DosRead(fpoint, string, 10, &byread);
                    105:       }
                    106: 
                    107:    VioDeRegister();
                    108: 
                    109: }
                    110: 
                    111: int fileopen(pathvar,av)
                    112: NPCH pathvar;
                    113: int av;
                    114: {  int fp;
                    115:    char filename[128];
                    116: 
                    117:    switch (av) {
                    118:       case '1':
                    119:         sprintf(filename, "%s%s", pathvar, "TEST1.DAT");
                    120:         fp = open(filename, O_RDONLY);
                    121:         if (fp == -1) {
                    122:            printf(" Cannot open file 1.\n");
                    123:            DosExit(EXIT_PROCESS,0); }
                    124:         break;
                    125:       case '2':
                    126:         sprintf(filename, "%s%s", pathvar, "TEST2.DAT");
                    127:         fp = open(filename, O_RDONLY);
                    128:         if (fp == -1)  {
                    129:            printf(" Cannot open file 2.\n");
                    130:            DosExit(EXIT_PROCESS,0);  }
                    131:         break;
                    132:       case '3':
                    133:         sprintf(filename, "%s%s", pathvar, "TEST3.DAT");
                    134:         fp = open(filename, O_RDONLY);
                    135:         if (fp == -1)  {
                    136:            printf(" Cannot open file 3.\n");
                    137:            DosExit(EXIT_PROCESS,0);  }
                    138:         break;
                    139:       default:
                    140:         sprintf(filename, "%s%s", pathvar, "TEST1.DAT");
                    141:         fp = open(filename, O_RDONLY);
                    142:         if (fp == -1) {
                    143:            printf(" Cannot open file.\n");
                    144:            DosExit(EXIT_PROCESS,0); }
                    145:         break;
                    146:       }
                    147:    return(fp);
                    148: }
                    149: 
                    150: void GetPath(pbuf)
                    151: NPCH pbuf;
                    152: 
                    153: {    int i,c;
                    154:      PCH progname;
                    155: 
                    156: 
                    157:      SELECTOROF(progname) = _aenvseg;  /* Standard C runtime routines     */
                    158:      OFFSETOF(progname) = _acmdln-1;   /* The pathname comes just prior    */
                    159:      c = 0;                           /* to argv[0]-but is in a different */
                    160:      while(*--progname != '\\')        /* segment, thus the copy to pbuf   */
                    161:         ;
                    162: 
                    163:      /* Cut the program name off the path */
                    164:      while (*--progname)
                    165:         c++;
                    166: 
                    167:      for (i=0; i<=c; i++)
                    168:        pbuf[i]= *++progname;
                    169: 
                    170:      pbuf[++c] = '\0';
                    171: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.