|
|
1.1 root 1: /*
2: * This example demonstrates some of the session manager API
3: */
4:
5: #include <dos.h> /* defines FP_SEG and FP_OFF */
6: #include <stdio.h>
7: #include <ctype.h>
8: #include <doscalls.h>
9: #include <subcalls.h>
10:
11:
12: #define TOTAL_COLMS 80 /* screen size in colms */
13: #define TOTAL_ROWS 24 /* screen size in rows */
14:
15: void Menu();
16: void StartChild();
17: void KillChild();
18: void ExitThisProc();
19:
20: extern unsigned _aenvseg;
21: extern unsigned _acmdln;
22:
23:
24: short KidSID; /* Array of session IDs */
25: short KidPID;
26: short Instance;
27: char spbuf[80], pbuf[128], Inputs[10];
28: char Title[100] = "SESSION.EXE";
29:
30: main(ac,av)
31: int ac;
32: char **av;
33: {
34: int i;
35: char **p;
36: char far *progname;
37: /*
38: * Grab the full path name of this program (the one used by EXECPGM())
39: * for use in creating child sessions.
40: */
41: FP_SEG(progname) = _aenvseg; /* This is standard C runtime stuff */
42: FP_OFF(progname) = _acmdln-1; /* The Path name comes just prior to */
43: /* AV[0] - but remember this is in a */
44: while(*--progname) /* different segment than the rest of */
45: ; /* the program, thus the copy (below) */
46:
47: for (i=0; *++progname; i++) /* Copy a far string to a local buffer */
48: pbuf[i] = *progname;
49: pbuf[i] = 0;
50:
51: KidSID = -1;
52: /*
53: * Look for the first Numeric argument, convert it and break out.
54: */
55: Instance = 0;
56: for (p = av+1; **p; p++) {
57: if (isdigit(**p)) {
58: Instance = atoi(*p);
59: break;
60: }
61: }
62:
63: for (;;) {
64:
65: Menu();
66:
67: switch(getch()) {
68:
69: case 's':
70: StartChild();
71: break;
72: case 'f':
73: KillChild();
74: break;
75: case 'e':
76: ExitThisProc();
77: break;
78: case 'm':
79: break;
80: default:
81: putc('\007', stdout);
82: }
83: }
84: }
85:
86: void
87: Menu()
88: {
89: if( Instance)
90: printf("\t%s Child process # %u\n\n", Title, Instance);
91: else
92: printf("\t%s\n\n", Title);
93: printf("Select an option:\n\n");
94: printf("\ts: Start child\n");
95: printf("\tf: Stop child\n");
96: printf("\te: Exit\n");
97: printf("\tm: Menu\n\n");
98: printf("? ");
99: }
100:
101: void
102: StartChild()
103: {
104: int rc;
105: struct StartData SDbuf;
106: unsigned SessionID, ProcessID;
107:
108: if (KidSID != -1) {
109: printf("Sorry, only one child at a time.\n");
110: return;
111: }
112: sprintf(spbuf, "Child Session # %u", Instance + 1 );
113: sprintf(Inputs, "%u", Instance + 1);
114:
115:
116: printf("Starting Child...\n");
117:
118: SDbuf.Length = sizeof(SDbuf);
119: SDbuf.Related = 1; /* Yes */
120: SDbuf.FgBg = 0; /* Start in the foreground */
121: SDbuf.TraceOpt = 0; /* Run the child synchronously, why? I dunno */
122: SDbuf.PgmTitle = spbuf; /* Title in session manager box */
123: SDbuf.PgmName = pbuf; /* Exec path (see main) */
124: SDbuf.PgmInputs = Inputs; /* Any command line arguments */
125: SDbuf.TermQ = 0L; /* No notification queue */
126:
127: rc = DOSSTARTSESSION(&SDbuf, &SessionID, &ProcessID);
128:
129: if (rc)
130: printf("Failed, %d no more screens available\n", rc);
131: else
132: {
133: printf("Success, screen group %u, PID %u\n", SessionID, ProcessID);
134: KidSID = SessionID;
135: KidPID = ProcessID;
136: }
137:
138: }
139:
140: void
141: KillChild()
142: {
143: short rc;
144:
145: if (KidSID == -1) {
146: printf("Sorry, must start session before you can stop it.\n");
147: return;
148: }
149: rc = DOSSTOPSESSION(0, KidSID, 0l);
150: #ifdef DEBUG
151: printf("Screen ID: %d\n", KidSID);
152: #endif
153: if (rc)
154: printf("Stop session failed, code %d\n", rc);
155: KidSID = -1;
156: }
157:
158: void
159: ExitThisProc()
160: {
161: printf(" Exiting, gasp cough die...\n");
162: exit(0);
163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.