annotate src/hftctl.c @ 617:af57a77cbc92

[xemacs-hg @ 2001-06-18 07:09:50 by ben] --------------------------------------------------------------- DOCUMENTATION FIXES: --------------------------------------------------------------- eval.c: Correct documentation. elhash.c: Doc correction. --------------------------------------------------------------- LISP OBJECT CLEANUP: --------------------------------------------------------------- bytecode.h, buffer.h, casetab.h, chartab.h, console-msw.h, console.h, database.c, device.h, eldap.h, elhash.h, events.h, extents.h, faces.h, file-coding.h, frame.h, glyphs.h, gui-x.h, gui.h, keymap.h, lisp-disunion.h, lisp-union.h, lisp.h, lrecord.h, lstream.h, mule-charset.h, objects.h, opaque.h, postgresql.h, process.h, rangetab.h, specifier.h, toolbar.h, tooltalk.h, ui-gtk.h: Add wrap_* to all objects (it was already there for a few of them) -- an expression to encapsulate a pointer into a Lisp object, rather than the inconvenient XSET*. "wrap" was chosen because "make" as in make_int(), make_char() is not appropriate. (It implies allocation. The issue does not exist for ints and chars because they are not allocated.) Full error checking has been added to these expressions. When used without error checking, non-union build, use of these expressions will incur no loss of efficiency. (In fact, XSET* is now defined in terms of wrap_* in a non-union build.) In a union build, you will also get no loss of efficiency provided that you have a decent optimizing compiler, and a compiler that either understands inlines or automatically inlines those particular functions. (And since people don't normally do their production builds on union, it doesn't matter.) Update the sample Lisp object definition in lrecord.h accordingly. dumper.c: Fix places in dumper that referenced wrap_object to reference its new name, wrap_pointer_1. buffer.c, bufslots.h, conslots.h, console.c, console.h, devslots.h, device.c, device.h, frame.c, frame.h, frameslots.h, window.c, window.h, winslots.h: -- Extract out the Lisp objects of `struct device' into devslots.h, just like for the other structures. -- Extract out the remaining (not copied into the window config) Lisp objects in `struct window' into winslots.h; use different macros (WINDOW_SLOT vs. WINDOW_SAVED_SLOT) to differentiate them. -- Eliminate the `dead' flag of `struct frame', since it duplicates information already available in `framemeths', and fix FRAME_LIVE_P accordingly. (Devices and consoles already work this way.) -- In *slots.h, switch to system where MARKED_SLOT is automatically undef'd at the end of the file. (Follows what winslots.h already does.) -- Update the comments at the beginning of *slots.h to be accurate. -- When making any of the above objects dead, zero it out entirely and reset all Lisp object slots to Qnil. (We were already doing this somewhat, but not consistently.) This (1) Eliminates the possibility of extra objects hanging around that ought to be GC'd, (2) Causes an immediate crash if anyone tries to access a structure in one of these objects, (3) Ensures consistent behavior wrt dead objects. dialog-msw.c: Use internal_object_printer, since this object should not escape. --------------------------------------------------------------- FIXING A CRASH THAT I HIT ONCE (AND A RELATED BAD BEHAVIOR): --------------------------------------------------------------- eval.c: Fix up some comments about the FSF implementation. Fix two nasty bugs: (1) condition_case_unwind frees the conses sitting in the catch->tag slot too quickly, resulting in a crash that I hit. (2) catches need to be unwound one at a time when calling unwind-protect code, rather than all at once at the end; otherwise, incorrect behavior can result. (A comment shows exactly how.) backtrace.h: Improve comment about FSF differences in the handler stack. --------------------------------------------------------------- FIXING A CRASH THAT I REPEATEDLY HIT WHEN USING THE MOUSE WHEEL UNDER MSWINDOWS: --------------------------------------------------------------- Basic idea: My crash is due either to a dead, non-marked, GC-collected frame inside of a window mirror, or a prematurely freed window mirror. We need to mark the Lisp objects inside of window mirrors. Tracking the lifespan of window mirrors and scrollbar instances is extremely hard, and there may well be lurking bugs where such objects are freed too soon. The only safe way to fix these problems (and it fixes both problems at once) is to make both of these structures Lisp objects. lrecord.h, emacs.c, inline.c, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, scrollbar.h, symsinit.h: Make scrollbar instances actual Lisp objects. Mark the window mirrors in them. inline.c needs to know about scrollbar.h now. Record the new type in lrecord.h. Fix up scrollbar-*.c appropriately. Create a hash table in scrollbar-msw.c so that the scrollbar instances stored in scrollbar HWND's are properly GC-protected. Create complex_vars_of_scrollbar_mswindows() to create the hash table at startup, and call it from emacs.c. Don't store the scrollbar instance as a property of the GTK scrollbar, as it's not used and if we did this, we'd have to separately GC-protect it in a hash table, like in MS Windows. lrecord.h, frame.h, frame.c, frameslots.h, redisplay.c, window.c, window.h: Move mark_window_mirror from redisplay.c to window.c. Make window mirrors actual Lisp objects. Tell lrecord.h about them. Change the window mirror member of struct frame from a pointer to a Lisp object, and add XWINDOW_MIRROR in appropriate places. Mark the scrollbar instances in the window mirror. redisplay.c, redisplay.h, alloc.c: Delete mark_redisplay. Don't call mark_redisplay. We now mark frame-specific structures in mark_frame. NOTE: I also deleted an extremely questionable call to update_frame_window_mirrors(). It was extremely questionable before, and now totally impossible, since it will create Lisp objects during redisplay. frame.c: Mark the scrollbar instances, which are now Lisp objects. Call mark_gutter() here, not in mark_redisplay(). gutter.c: Update comments about correct marking. --------------------------------------------------------------- ISSUES BROUGHT UP BY MARTIN: --------------------------------------------------------------- buffer.h: Put back these macros the way Steve T and I think they ought to be. I already explained in a previous changelog entry why I think these macros should be the way I'd defined them. Once again: We fix these macros so they don't care about the type of their lvalues. The non-C-string equivalents of these already function in the same way, and it's correct because it should be OK to pass in a CBufbyte *, a BufByte *, a Char_Binary *, an UChar_Binary *, etc. The whole reason for these different types is to work around errors caused by signed-vs-unsigned non-matching types. Any possible error that might be caught in a DFC macro would also be caught wherever the argument is used elsewhere. So creating multiple macro versions would add no useful error-checking and just further complicate an already complicated area. As for Martin's "ANSI aliasing" bug, XEmacs is not ANSI-aliasing clean and probably never will be. Unless the board agrees to change XEmacs in this way (and we really don't want to go down that road), this is not a bug. sound.h: Undo Martin's type change. signal.c: Fix problem identified by Martin with Linux and g++ due to non-standard declaration of setitimer(). systime.h: Update the docs for "qxe_" to point out why making the encapsulation explicit is always the right way to go. (setitimer() itself serves as an example.) For 21.4: update-elc-2.el: Correct misplaced parentheses, making lisp/mule not get recompiled.
author ben
date Mon, 18 Jun 2001 07:10:32 +0000
parents 3ecd8885ac67
children b39c14581166
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* IBM has disclaimed copyright on this module. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 /* Synched up with: FSF 19.30. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 /***************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 /* Function: hftctl */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 /* Syntax: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 /* #include <sys/ioctl.h> */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 /* #include <sys/hft.h> */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 /* int hftctl(fildes, request, arg ) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 /* int fildes, request; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 /* char *arg; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 /* Description: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 /* Does the following: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 /* 1. determines if fildes is pty */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 /* does normal ioctl it is not */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* 2. places fildes into raw mode */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* 3. converts ioctl arguments to data stream */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* 4. waits for 2 secs for acknowledgement before */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* timing out. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 /* 5. places response in callers buffer ( just like */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 /* ioctl. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 /* 6. returns fildes to its original mode */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 /* User of this program should review steps 1,4, and 3. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 /* hftctl makes no check on the request type. It must be */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 /* a HFT ioctl that is supported remotely. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 /* This program will use the SIGALRM and alarm(2). Any */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 /* Previous alarms are lost. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 /* Users of this program are free to modify it any way */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 /* they want. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 /* Return Value: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 /* If ioctl fails, a value of -1 is returned and errno */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 /* is set to indicate the error. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 /* */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 /***************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 #include "lisp.h" /* encapsulated open, close, read, write */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 #include <sys/signal.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 #include <errno.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 #include <fcntl.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 #include <setjmp.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 #include <sys/ioctl.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 #include <sys/devinfo.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 #include <termios.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 #include <termio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 #include <sys/hft.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #include <sys/uio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 #include <sys/tty.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 /* #include <sys/pty.h> */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 #define REMOTE 0x01
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 #undef ioctl
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 static char SCCSid[] = "com/gnuemacs/src,3.1,9021-90/05/03-5/3/90";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 /*************** LOCAL DEFINES **********************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 #define QDEV ((HFQPDEVCH<<8)|HFQPDEVCL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 #define QLOC ((HFQLOCCH<<8)|HFQLOCCL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #define QPS ((HFQPRESCH<<8)|HFQPRESCL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 #ifndef TCGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 #define TCGETS TCGETA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 #ifndef TCSETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 #define TCSETS TCSETA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 /*************** EXTERNAL / GLOBAL DATA AREA ********************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 static int hfqry();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 static int hfskbd();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 extern int errno;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 static JMP_BUF hftenv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 static int is_ack_vtd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 static SIGTYPE (*sav_alrm) ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 static struct hfctlreq req =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 { 0x1b,'[','x',0,0,0,21,HFCTLREQCH,HFCTLREQCL};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 static struct hfctlack ACK =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 { 0x1b,'[','x',0,0,0,21,HFCTLACKCH,HFCTLACKCL};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 /* FUNC signal(); */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 /*************** LOCAL MACROS ***********************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 #define HFTYPE(p) ((p->hf_typehi<<8)|(p->hf_typelo))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 #define BYTE4(p) ((p)[0]<<24 | (p)[1]<<16 | (p)[2]<<8 | (p)[3])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 /* read a buffer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 #define RD_BUF(f,p,l) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 while ((l)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 if ((j = read((f),(p),(l))) < 0) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 if (errno != EINTR) return (-1); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 else continue; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 else { (l) -= j; (p) += j; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 /*************** function prototypes ***************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 #ifdef __STDC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 static GT_ACK (int fd, int req, char *buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 static WR_REQ (int fd, int request, int cmdlen, char *cmd, int resplen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 static void hft_alrm(int sig);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 static GT_ACK ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 static WR_REQ ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 static void hft_alrm ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 /*************** HFTCTL FUNCTION *******************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 hftctl (fd, request, arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 int fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 int request;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 union {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 struct hfintro *intro;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 struct hfquery *query;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 char *c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 } arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 int fd_flag; /* fcntl flags */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 union {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 struct hfintro *cmd; /* p.cmd - intro des. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 struct hfqphdevc *ph; /* p.ph - physical dev.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 char *c; /* p.c - char ptr */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 } p; /* general pointer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 int pty_new; /* pty modes */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 int pty_old;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 int retcode;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 struct termios term_new; /* terminal attributes */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 struct termios term_old;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 struct devinfo devInfo; /* defined in sys/devinfo.h */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 if (ioctl (fd, IOCINFO, &devInfo) == -1) return(-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 if (devInfo.devtype != DD_PSEU) /* is it a pty? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 return (ioctl(fd, request, arg)); /* no, do IOCTL */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 /******* START PTY **************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 /** Pty found, possible HFT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 /** set new file des as raw */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 /** as you can. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 /********************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 /* Get current state of file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 /* descriptor & save */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 if ((fd_flag = fcntl (fd, F_GETFL, 0)) == -1) return (-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 if (ioctl (fd, TCGETS, &term_old) == -1) return (-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 /* set terminal attr to raw */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 /* and to delay on read */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 pty_new = pty_old | REMOTE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 memcpy (&term_new, &term_old, sizeof (term_new));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 term_new.c_iflag = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 term_new.c_oflag = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 term_new.c_lflag = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 /* term_new.c_line = 0; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 for (i = 1; i <= 5; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 term_new.c_cc[i] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 term_new.c_cc[0] = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 ioctl (fd, TCSETS, &term_new);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 if (fcntl (fd, F_SETFL, fd_flag & ~O_NDELAY) == -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 return(-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 /* call spacific function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 if (request == HFSKBD)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 retcode = hfskbd (fd, request, arg.c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 else /* assume HFQUERY */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 retcode = hfqry (fd, request, arg.c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 fcntl (fd, F_SETFL, fd_flag); /* reset terminal to original */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 ioctl (fd, TCSETS, &term_old);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 return (retcode); /* return error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 /*************** HFSKBD FUNCTION ******************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 hfskbd (fd, request, arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 int fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 int request;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 struct hfbuf *arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 WR_REQ(fd, request, arg->hf_buflen, arg->hf_bufp,0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 return (GT_ACK(fd, request, arg->hf_bufp));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 /*************** HFQUERY FUNCTION ******************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 hfqry (fd, request, arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 int fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 int request;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 struct hfquery *arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 WR_REQ(fd, request, arg->hf_cmdlen, arg->hf_cmd, arg->hf_resplen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 return (GT_ACK(fd, request, arg->hf_resp));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 /*************** GT_ACK FUNCTION ******************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 GT_ACK (fd, req, buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 int fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 int req;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 char *buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 struct hfctlack ack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 int i = sizeof (ack);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 int j = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 union {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 char *c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 struct hfctlack *ack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 } p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 is_ack_vtd = 0; /* flag no ACT VTD yet */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 if (SETJMP (hftenv)) /* set environment in case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 { /* of time out */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 errno = ENODEV; /* if time out, set errno */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 return (-1); /* flag error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 alarm(3); /* time out in 3 secs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 sav_alrm = signal (SIGALRM, hft_alrm); /* prepare to catch time out */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 p.ack = &ack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 while (! is_ack_vtd) /* do until valid ACK VTD */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 RD_BUF(fd, p.c, i); /* read until a ACK VTD is fill*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 if (! memcmp (&ack, &ACK, sizeof (HFINTROSZ)) /* the ACK intro & */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 && (ack.hf_request == req)) /* is it the response we want ?*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 { /* yes, ACK VTD found */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 is_ack_vtd = 1; /* quickly, flag it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 break; /* get the %$%#@ out of here */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 p.ack = &ack; /* no, then skip 1st */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 ++p.c; /* char and start over */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 i = sizeof (ack) - 1; /* one less ESC to cry over */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 while ((*p.c != 0x1b) && i) /* scan for next ESC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 { ++p.c; --i; } /* if any */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 (i ? memcpy (&ack, p.c, i) : 0); /* if any left over, then move */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 p.ack = &ack; /* ESC to front of ack struct */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 p.c += i; /* skip over what's been read */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 i = sizeof (ack) - i; /* set what's left to be read */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 } /***** TRY AGAIN */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 alarm(0); /* ACK VTD received, reset alrm*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 signal (SIGALRM, sav_alrm); /* reset signal */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 if (i = ack.hf_arg_len) /* any data following ? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 { /* yes, */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 RD_BUF(fd,buf,i); /* read until it is received */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 if (errno = ack.hf_retcode) /* set errno based on returned */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 return (-1); /* code, if 0, then no error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 return (0); /* if set, then error returned */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 /*************** HFT_ALRM FUNCTION ******************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 hft_alrm (sig) /* Function hft_alrm - handle */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 int sig; /* alarm signal */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 signal (SIGALRM, sav_alrm); /* reset to previous */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 if (is_ack_vtd) /* has ack vtd arrived ? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 return; /* yes, then continue */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 else /* no, then return with error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 LONGJMP (hftenv, -1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 /*********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 /*** ***/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 /*** NOTE: Both the HFCTLREQ and the arg structure should be ***/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 /*** sent in one io write operation. If terminal ***/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 /*** emulators are in NODELAY mode then multiple writes ***/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 /*** may cause bogus information to be read by the emulator ***/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 /*** depending on the timing. ***/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 /*** ***/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 /*********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 WR_REQ (fd, request, cmdlen, cmd, resplen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 int fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 int request;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 int cmdlen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 char *cmd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 int resplen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 struct {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 char *c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 struct hfctlreq *req;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 } p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 int size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 req.hf_request = request;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 req.hf_arg_len = cmdlen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 req.hf_rsp_len = resplen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 if (cmdlen) /* if arg structure to pass */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 size = sizeof (struct hfctlreq) + cmdlen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 if ((p.c = xmalloc(size)) == NULL) /* malloc one area */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 return (-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 memcpy (p.c, &req, sizeof (req)); /* copy CTL REQ struct */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 memcpy (p.c + sizeof (req), cmd, cmdlen); /* copy arg struct */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 p.req = &req; /* otherwise use only CTL REQ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 size = sizeof (req);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 /* write request to terminal */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 if (write(fd,p.c,size) == -1) return (-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 if (p.req != &req) /* free if allocated */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 xfree (p.c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 return (0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 }