Mercurial > hg > xemacs-beta
annotate lib-src/gnuslib.c @ 5127:a9c41067dd88 ben-lisp-object
more cleanups, terminology clarification, lots of doc work
-------------------- ChangeLog entries follow: --------------------
man/ChangeLog addition:
2010-03-05 Ben Wing <ben@xemacs.org>
* internals/internals.texi (Introduction to Allocation):
* internals/internals.texi (Integers and Characters):
* internals/internals.texi (Allocation from Frob Blocks):
* internals/internals.texi (lrecords):
* internals/internals.texi (Low-level allocation):
Rewrite section on allocation of Lisp objects to reflect the new
reality. Remove references to nonexistent XSETINT and XSETCHAR.
modules/ChangeLog addition:
2010-03-05 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c (allocate_pgconn):
* postgresql/postgresql.c (allocate_pgresult):
* postgresql/postgresql.h (struct Lisp_PGconn):
* postgresql/postgresql.h (struct Lisp_PGresult):
* ldap/eldap.c (allocate_ldap):
* ldap/eldap.h (struct Lisp_LDAP):
Same changes as in src/ dir. See large log there in ChangeLog,
but basically:
ALLOC_LISP_OBJECT -> ALLOC_NORMAL_LISP_OBJECT
LISP_OBJECT_HEADER -> NORMAL_LISP_OBJECT_HEADER
../hlo/src/ChangeLog addition:
2010-03-05 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (old_alloc_sized_lcrecord):
* alloc.c (very_old_free_lcrecord):
* alloc.c (copy_lisp_object):
* alloc.c (zero_sized_lisp_object):
* alloc.c (zero_nonsized_lisp_object):
* alloc.c (lisp_object_storage_size):
* alloc.c (free_normal_lisp_object):
* alloc.c (FREE_FIXED_TYPE_WHEN_NOT_IN_GC):
* alloc.c (ALLOC_FROB_BLOCK_LISP_OBJECT):
* alloc.c (Fcons):
* alloc.c (noseeum_cons):
* alloc.c (make_float):
* alloc.c (make_bignum):
* alloc.c (make_bignum_bg):
* alloc.c (make_ratio):
* alloc.c (make_ratio_bg):
* alloc.c (make_ratio_rt):
* alloc.c (make_bigfloat):
* alloc.c (make_bigfloat_bf):
* alloc.c (size_vector):
* alloc.c (make_compiled_function):
* alloc.c (Fmake_symbol):
* alloc.c (allocate_extent):
* alloc.c (allocate_event):
* alloc.c (make_key_data):
* alloc.c (make_button_data):
* alloc.c (make_motion_data):
* alloc.c (make_process_data):
* alloc.c (make_timeout_data):
* alloc.c (make_magic_data):
* alloc.c (make_magic_eval_data):
* alloc.c (make_eval_data):
* alloc.c (make_misc_user_data):
* alloc.c (Fmake_marker):
* alloc.c (noseeum_make_marker):
* alloc.c (size_string_direct_data):
* alloc.c (make_uninit_string):
* alloc.c (make_string_nocopy):
* alloc.c (mark_lcrecord_list):
* alloc.c (alloc_managed_lcrecord):
* alloc.c (free_managed_lcrecord):
* alloc.c (sweep_lcrecords_1):
* alloc.c (malloced_storage_size):
* buffer.c (allocate_buffer):
* buffer.c (compute_buffer_usage):
* buffer.c (DEFVAR_BUFFER_LOCAL_1):
* buffer.c (nuke_all_buffer_slots):
* buffer.c (common_init_complex_vars_of_buffer):
* buffer.h (struct buffer_text):
* buffer.h (struct buffer):
* bytecode.c:
* bytecode.c (make_compiled_function_args):
* bytecode.c (size_compiled_function_args):
* bytecode.h (struct compiled_function_args):
* casetab.c (allocate_case_table):
* casetab.h (struct Lisp_Case_Table):
* charset.h (struct Lisp_Charset):
* chartab.c (fill_char_table):
* chartab.c (Fmake_char_table):
* chartab.c (make_char_table_entry):
* chartab.c (copy_char_table_entry):
* chartab.c (Fcopy_char_table):
* chartab.c (put_char_table):
* chartab.h (struct Lisp_Char_Table_Entry):
* chartab.h (struct Lisp_Char_Table):
* console-gtk-impl.h (struct gtk_device):
* console-gtk-impl.h (struct gtk_frame):
* console-impl.h (struct console):
* console-msw-impl.h (struct Lisp_Devmode):
* console-msw-impl.h (struct mswindows_device):
* console-msw-impl.h (struct msprinter_device):
* console-msw-impl.h (struct mswindows_frame):
* console-msw-impl.h (struct mswindows_dialog_id):
* console-stream-impl.h (struct stream_console):
* console-stream.c (stream_init_console):
* console-tty-impl.h (struct tty_console):
* console-tty-impl.h (struct tty_device):
* console-tty.c (allocate_tty_console_struct):
* console-x-impl.h (struct x_device):
* console-x-impl.h (struct x_frame):
* console.c (allocate_console):
* console.c (nuke_all_console_slots):
* console.c (DEFVAR_CONSOLE_LOCAL_1):
* console.c (common_init_complex_vars_of_console):
* data.c (make_weak_list):
* data.c (make_weak_box):
* data.c (make_ephemeron):
* database.c:
* database.c (struct Lisp_Database):
* database.c (allocate_database):
* database.c (finalize_database):
* device-gtk.c (allocate_gtk_device_struct):
* device-impl.h (struct device):
* device-msw.c:
* device-msw.c (mswindows_init_device):
* device-msw.c (msprinter_init_device):
* device-msw.c (finalize_devmode):
* device-msw.c (allocate_devmode):
* device-tty.c (allocate_tty_device_struct):
* device-x.c (allocate_x_device_struct):
* device.c:
* device.c (nuke_all_device_slots):
* device.c (allocate_device):
* dialog-msw.c (handle_question_dialog_box):
* elhash.c:
* elhash.c (struct Lisp_Hash_Table):
* elhash.c (finalize_hash_table):
* elhash.c (make_general_lisp_hash_table):
* elhash.c (Fcopy_hash_table):
* elhash.h (htentry):
* emacs.c (main_1):
* eval.c:
* eval.c (size_multiple_value):
* event-stream.c (finalize_command_builder):
* event-stream.c (allocate_command_builder):
* event-stream.c (free_command_builder):
* event-stream.c (event_stream_generate_wakeup):
* event-stream.c (event_stream_resignal_wakeup):
* event-stream.c (event_stream_disable_wakeup):
* event-stream.c (event_stream_wakeup_pending_p):
* events.h (struct Lisp_Timeout):
* events.h (struct command_builder):
* extents-impl.h:
* extents-impl.h (struct extent_auxiliary):
* extents-impl.h (struct extent_info):
* extents-impl.h (set_extent_no_chase_aux_field):
* extents-impl.h (set_extent_no_chase_normal_field):
* extents.c:
* extents.c (gap_array_marker):
* extents.c (gap_array):
* extents.c (extent_list_marker):
* extents.c (extent_list):
* extents.c (stack_of_extents):
* extents.c (gap_array_make_marker):
* extents.c (extent_list_make_marker):
* extents.c (allocate_extent_list):
* extents.c (SLOT):
* extents.c (mark_extent_auxiliary):
* extents.c (allocate_extent_auxiliary):
* extents.c (attach_extent_auxiliary):
* extents.c (size_gap_array):
* extents.c (finalize_extent_info):
* extents.c (allocate_extent_info):
* extents.c (uninit_buffer_extents):
* extents.c (allocate_soe):
* extents.c (copy_extent):
* extents.c (vars_of_extents):
* extents.h:
* faces.c (allocate_face):
* faces.h (struct Lisp_Face):
* faces.h (struct face_cachel):
* file-coding.c:
* file-coding.c (finalize_coding_system):
* file-coding.c (sizeof_coding_system):
* file-coding.c (Fcopy_coding_system):
* file-coding.h (struct Lisp_Coding_System):
* file-coding.h (MARKED_SLOT):
* fns.c (size_bit_vector):
* font-mgr.c:
* font-mgr.c (finalize_fc_pattern):
* font-mgr.c (print_fc_pattern):
* font-mgr.c (Ffc_pattern_p):
* font-mgr.c (Ffc_pattern_create):
* font-mgr.c (Ffc_name_parse):
* font-mgr.c (Ffc_name_unparse):
* font-mgr.c (Ffc_pattern_duplicate):
* font-mgr.c (Ffc_pattern_add):
* font-mgr.c (Ffc_pattern_del):
* font-mgr.c (Ffc_pattern_get):
* font-mgr.c (fc_config_create_using):
* font-mgr.c (fc_strlist_to_lisp_using):
* font-mgr.c (fontset_to_list):
* font-mgr.c (Ffc_config_p):
* font-mgr.c (Ffc_config_up_to_date):
* font-mgr.c (Ffc_config_build_fonts):
* font-mgr.c (Ffc_config_get_cache):
* font-mgr.c (Ffc_config_get_fonts):
* font-mgr.c (Ffc_config_set_current):
* font-mgr.c (Ffc_config_get_blanks):
* font-mgr.c (Ffc_config_get_rescan_interval):
* font-mgr.c (Ffc_config_set_rescan_interval):
* font-mgr.c (Ffc_config_app_font_add_file):
* font-mgr.c (Ffc_config_app_font_add_dir):
* font-mgr.c (Ffc_config_app_font_clear):
* font-mgr.c (size):
* font-mgr.c (Ffc_config_substitute):
* font-mgr.c (Ffc_font_render_prepare):
* font-mgr.c (Ffc_font_match):
* font-mgr.c (Ffc_font_sort):
* font-mgr.c (finalize_fc_config):
* font-mgr.c (print_fc_config):
* font-mgr.h:
* font-mgr.h (struct fc_pattern):
* font-mgr.h (XFC_PATTERN):
* font-mgr.h (struct fc_config):
* font-mgr.h (XFC_CONFIG):
* frame-gtk.c (allocate_gtk_frame_struct):
* frame-impl.h (struct frame):
* frame-msw.c (mswindows_init_frame_1):
* frame-x.c (allocate_x_frame_struct):
* frame.c (nuke_all_frame_slots):
* frame.c (allocate_frame_core):
* gc.c:
* gc.c (GC_CHECK_NOT_FREE):
* glyphs.c (finalize_image_instance):
* glyphs.c (allocate_image_instance):
* glyphs.c (Fcolorize_image_instance):
* glyphs.c (allocate_glyph):
* glyphs.c (unmap_subwindow_instance_cache_mapper):
* glyphs.c (register_ignored_expose):
* glyphs.h (struct Lisp_Image_Instance):
* glyphs.h (struct Lisp_Glyph):
* glyphs.h (struct glyph_cachel):
* glyphs.h (struct expose_ignore):
* gui.c (allocate_gui_item):
* gui.h (struct Lisp_Gui_Item):
* keymap.c (struct Lisp_Keymap):
* keymap.c (make_keymap):
* lisp.h:
* lisp.h (struct Lisp_String_Direct_Data):
* lisp.h (struct Lisp_String_Indirect_Data):
* lisp.h (struct Lisp_Vector):
* lisp.h (struct Lisp_Bit_Vector):
* lisp.h (DECLARE_INLINE_LISP_BIT_VECTOR):
* lisp.h (struct weak_box):
* lisp.h (struct ephemeron):
* lisp.h (struct weak_list):
* lrecord.h:
* lrecord.h (struct lrecord_implementation):
* lrecord.h (MC_ALLOC_CALL_FINALIZER):
* lrecord.h (struct lcrecord_list):
* lstream.c (finalize_lstream):
* lstream.c (sizeof_lstream):
* lstream.c (Lstream_new):
* lstream.c (Lstream_delete):
* lstream.h (struct lstream):
* marker.c:
* marker.c (finalize_marker):
* marker.c (compute_buffer_marker_usage):
* mule-charset.c:
* mule-charset.c (make_charset):
* mule-charset.c (compute_charset_usage):
* objects-impl.h (struct Lisp_Color_Instance):
* objects-impl.h (struct Lisp_Font_Instance):
* objects-tty-impl.h (struct tty_color_instance_data):
* objects-tty-impl.h (struct tty_font_instance_data):
* objects-tty.c (tty_initialize_color_instance):
* objects-tty.c (tty_initialize_font_instance):
* objects.c (finalize_color_instance):
* objects.c (Fmake_color_instance):
* objects.c (finalize_font_instance):
* objects.c (Fmake_font_instance):
* objects.c (reinit_vars_of_objects):
* opaque.c:
* opaque.c (sizeof_opaque):
* opaque.c (make_opaque_ptr):
* opaque.c (free_opaque_ptr):
* opaque.h:
* opaque.h (Lisp_Opaque):
* opaque.h (Lisp_Opaque_Ptr):
* print.c (printing_unreadable_lcrecord):
* print.c (external_object_printer):
* print.c (debug_p4):
* process.c (finalize_process):
* process.c (make_process_internal):
* procimpl.h (struct Lisp_Process):
* rangetab.c (Fmake_range_table):
* rangetab.c (Fcopy_range_table):
* rangetab.h (struct Lisp_Range_Table):
* scrollbar.c:
* scrollbar.c (create_scrollbar_instance):
* scrollbar.c (compute_scrollbar_instance_usage):
* scrollbar.h (struct scrollbar_instance):
* specifier.c (finalize_specifier):
* specifier.c (sizeof_specifier):
* specifier.c (set_specifier_caching):
* specifier.h (struct Lisp_Specifier):
* specifier.h (struct specifier_caching):
* symeval.h:
* symeval.h (SYMBOL_VALUE_MAGIC_P):
* symeval.h (DEFVAR_SYMVAL_FWD):
* symsinit.h:
* syntax.c (init_buffer_syntax_cache):
* syntax.h (struct syntax_cache):
* toolbar.c:
* toolbar.c (allocate_toolbar_button):
* toolbar.c (update_toolbar_button):
* toolbar.h (struct toolbar_button):
* tooltalk.c (struct Lisp_Tooltalk_Message):
* tooltalk.c (make_tooltalk_message):
* tooltalk.c (struct Lisp_Tooltalk_Pattern):
* tooltalk.c (make_tooltalk_pattern):
* ui-gtk.c:
* ui-gtk.c (allocate_ffi_data):
* ui-gtk.c (emacs_gtk_object_finalizer):
* ui-gtk.c (allocate_emacs_gtk_object_data):
* ui-gtk.c (allocate_emacs_gtk_boxed_data):
* ui-gtk.h:
* window-impl.h (struct window):
* window-impl.h (struct window_mirror):
* window.c (finalize_window):
* window.c (allocate_window):
* window.c (new_window_mirror):
* window.c (mark_window_as_deleted):
* window.c (make_dummy_parent):
* window.c (compute_window_mirror_usage):
* window.c (compute_window_usage):
Overall point of this change and previous ones in this repository:
(1) Introduce new, clearer terminology: everything other than int
or char is a "record" object, which comes in two types: "normal
objects" and "frob-block objects". Fix up all places that
referred to frob-block objects as "simple", "basic", etc.
(2) Provide an advertised interface for doing operations on Lisp
objects, including creating new types, that is clean and
consistent in its naming, uses the above-referenced terms and
avoids referencing "lrecords", "old lcrecords", etc., which should
hide under the surface.
(3) Make the size_in_bytes and finalizer methods take a
Lisp_Object rather than a void * for consistency with other methods.
(4) Separate finalizer method into finalizer and disksaver, so
that normal finalize methods don't have to worry about disksaving.
Other specifics:
(1) Renaming:
LISP_OBJECT_HEADER -> NORMAL_LISP_OBJECT_HEADER
ALLOC_LISP_OBJECT -> ALLOC_NORMAL_LISP_OBJECT
implementation->basic_p -> implementation->frob_block_p
ALLOCATE_FIXED_TYPE_AND_SET_IMPL -> ALLOC_FROB_BLOCK_LISP_OBJECT
*FCCONFIG*, wrap_fcconfig -> *FC_CONFIG*, wrap_fc_config
*FCPATTERN*, wrap_fcpattern -> *FC_PATTERN*, wrap_fc_pattern
(the last two changes make the naming of these macros consistent
with the naming of all other macros, since the objects are named
fc-config and fc-pattern with a hyphen)
(2) Lots of documentation fixes in lrecord.h.
(3) Eliminate macros for copying, freeing, zeroing objects, getting
their storage size. Instead, new functions:
zero_sized_lisp_object()
zero_nonsized_lisp_object()
lisp_object_storage_size()
free_normal_lisp_object()
(copy_lisp_object() already exists)
LISP_OBJECT_FROB_BLOCK_P() (actually a macro)
Eliminated:
free_lrecord()
zero_lrecord()
copy_lrecord()
copy_sized_lrecord()
old_copy_lcrecord()
old_copy_sized_lcrecord()
old_zero_lcrecord()
old_zero_sized_lcrecord()
LISP_OBJECT_STORAGE_SIZE()
COPY_SIZED_LISP_OBJECT()
COPY_SIZED_LCRECORD()
COPY_LISP_OBJECT()
ZERO_LISP_OBJECT()
FREE_LISP_OBJECT()
(4) Catch the remaining places where lrecord stuff was used directly
and use the advertised interface, e.g. alloc_sized_lrecord() ->
ALLOC_SIZED_LISP_OBJECT().
(5) Make certain statically-declared pseudo-objects
(buffer_local_flags, console_local_flags) have their lheader
initialized correctly, so things like copy_lisp_object() can work
on them. Make extent_auxiliary_defaults a proper heap object
Vextent_auxiliary_defaults, and make extent auxiliaries dumpable
so that this object can be dumped. allocate_extent_auxiliary()
now just creates the object, and attach_extent_auxiliary()
creates an extent auxiliary and attaches to an extent, like the
old allocate_extent_auxiliary().
(6) Create EXTENT_AUXILIARY_SLOTS macro, similar to the foo-slots.h
files but in a macro instead of a file. The purpose is to avoid
duplication when iterating over all the slots in an extent auxiliary.
Use it.
(7) In lstream.c, don't zero out object after allocation because
allocation routines take care of this.
(8) In marker.c, fix a mistake in computing marker overhead.
(9) In print.c, clean up printing_unreadable_lcrecord(),
external_object_printer() to avoid lots of ifdef NEW_GC's.
(10) Separate toolbar-button allocation into a separate
allocate_toolbar_button() function for use in the example code
in lrecord.h.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Fri, 05 Mar 2010 04:08:17 -0600 |
parents | 2161ac78b41e |
children | e6508b64ee08 061f4f90f874 |
rev | line source |
---|---|
428 | 1 /* -*-C-*- |
613 | 2 Common library code for the XEmacs server and client. |
428 | 3 |
613 | 4 This file is part of XEmacs. |
428 | 5 |
6 Copying is permitted under those conditions described by the GNU | |
7 General Public License. | |
8 | |
9 Copyright (C) 1989 Free Software Foundation, Inc. | |
10 | |
11 Author: Andy Norman (ange@hplb.hpl.hp.com), based on | |
12 'etc/server.c' and 'etc/emacsclient.c' from the 18.52 GNU | |
13 Emacs distribution. | |
14 | |
15 Please mail bugs and suggestions to the author at the above address. | |
16 */ | |
17 | |
18 /* HISTORY | |
19 * 11-Nov-1990 bristor@simba | |
20 * Added EOT stuff. | |
21 */ | |
22 | |
23 /* | |
24 * This file incorporates new features added by Bob Weiner <weiner@mot.com>, | |
25 * Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>. | |
26 * Please see the note at the end of the README file for details. | |
27 * | |
28 * (If gnuserv came bundled with your emacs, the README file is probably | |
29 * ../etc/gnuserv.README relative to the directory containing this file) | |
30 */ | |
31 | |
32 #if 0 | |
33 static char rcsid [] = "!Header: gnuslib.c,v 2.4 95/02/16 11:57:37 arup alpha !"; | |
34 #endif | |
35 | |
36 #include "gnuserv.h" | |
37 #include <errno.h> | |
38 | |
39 #ifdef SYSV_IPC | |
40 static int connect_to_ipc_server (void); | |
41 #endif | |
42 #ifdef UNIX_DOMAIN_SOCKETS | |
43 static int connect_to_unix_server (void); | |
44 #endif | |
45 #ifdef INTERNET_DOMAIN_SOCKETS | |
458 | 46 static int connect_to_internet_server (char *serverhost, unsigned short port); |
428 | 47 #endif |
48 | |
49 /* On some systems, e.g. DGUX, inet_addr returns a 'struct in_addr'. */ | |
50 #ifdef HAVE_BROKEN_INET_ADDR | |
51 # define IN_ADDR struct in_addr | |
52 # define NUMERIC_ADDR_ERROR (numeric_addr.s_addr == -1) | |
53 #else | |
54 # if (LONGBITS > 32) | |
55 # define IN_ADDR unsigned int | |
56 # else | |
57 # define IN_ADDR unsigned long | |
58 # endif | |
59 # define NUMERIC_ADDR_ERROR (numeric_addr == (IN_ADDR) -1) | |
60 #endif | |
61 | |
62 #include <stdlib.h> | |
63 #include <stdio.h> | |
64 #include <sys/types.h> | |
65 #include <sys/stat.h> | |
66 #ifdef HAVE_UNISTD_H | |
67 #include <unistd.h> | |
68 #endif /* HAVE_UNISTD_H */ | |
69 #ifdef HAVE_STRING_H | |
70 #include <string.h> | |
71 #endif /* HAVE_STRING_H */ | |
72 | |
73 #include <arpa/inet.h> | |
74 | |
75 char *tmpdir = NULL; | |
76 | |
77 char *progname = NULL; | |
78 | |
440 | 79 int |
80 make_connection (char *hostarg, int portarg, int *s) | |
428 | 81 { |
82 #ifdef INTERNET_DOMAIN_SOCKETS | |
83 char *ptr; | |
84 if (hostarg == NULL) | |
85 hostarg = getenv("GNU_HOST"); | |
86 if (portarg == 0 && (ptr=getenv("GNU_PORT")) != NULL) | |
87 portarg = atoi(ptr); | |
88 #endif | |
89 | |
90 if (hostarg != NULL) { | |
91 /* hostname was given explicitly, via cmd line arg or GNU_HOST, | |
92 * so obey it. */ | |
93 #ifdef UNIX_DOMAIN_SOCKETS | |
94 if (!strcmp(hostarg, "unix")) { | |
95 *s = connect_to_unix_server(); | |
96 return (int) CONN_UNIX; | |
97 } | |
98 #endif /* UNIX_DOMAIN_SOCKETS */ | |
99 #ifdef INTERNET_DOMAIN_SOCKETS | |
100 *s = connect_to_internet_server(hostarg, portarg); | |
101 return (int) CONN_INTERNET; | |
102 #endif | |
103 #ifdef SYSV_IPC | |
104 return -1; /* hostarg should always be NULL for SYSV_IPC */ | |
105 #endif | |
106 } else { | |
107 /* no hostname given. Use unix-domain/sysv-ipc, or | |
108 * internet-domain connection to local host if they're not available. */ | |
109 #if defined(UNIX_DOMAIN_SOCKETS) | |
110 *s = connect_to_unix_server(); | |
111 return (int) CONN_UNIX; | |
112 #elif defined(SYSV_IPC) | |
113 *s = connect_to_ipc_server(); | |
114 return (int) CONN_IPC; | |
115 #elif defined(INTERNET_DOMAIN_SOCKETS) | |
116 { | |
117 char localhost[HOSTNAMSZ]; | |
118 gethostname(localhost,HOSTNAMSZ); /* use this host by default */ | |
119 *s = connect_to_internet_server(localhost, portarg); | |
120 return (int) CONN_INTERNET; | |
121 } | |
122 #endif /* IPC type */ | |
123 } | |
124 } | |
125 | |
126 #ifdef SYSV_IPC | |
127 /* | |
128 connect_to_ipc_server -- establish connection with server process via SYSV IPC | |
129 Returns msqid for server if successful. | |
130 */ | |
440 | 131 static int |
132 connect_to_ipc_server (void) | |
428 | 133 { |
134 int s; /* connected msqid */ | |
135 key_t key; /* message key */ | |
136 char buf[GSERV_BUFSZ+1]; /* buffer for filename */ | |
137 | |
138 sprintf(buf,"%s/gsrv%d",tmpdir,(int)geteuid()); | |
139 creat(buf,0600); | |
140 if ((key = ftok(buf,1)) == -1) { | |
141 perror(progname); | |
142 fprintf(stderr, "%s: unable to get ipc key from %s\n", | |
143 progname, buf); | |
144 exit(1); | |
145 } | |
146 | |
147 if ((s = msgget(key,0600)) == -1) { | |
148 perror(progname); | |
149 fprintf(stderr,"%s: unable to access msg queue\n",progname); | |
150 exit(1); | |
151 }; /* if */ | |
152 | |
153 return(s); | |
154 | |
155 } /* connect_to_ipc_server */ | |
156 | |
157 | |
158 /* | |
159 disconnect_from_ipc_server -- inform the server that sending has finished, | |
160 and wait for its reply. | |
161 */ | |
440 | 162 void |
163 disconnect_from_ipc_server (int s, struct msgbuf *msgp, int echo) | |
428 | 164 { |
165 int len; /* length of received message */ | |
166 | |
167 send_string(s,EOT_STR); /* EOT terminates this message */ | |
168 msgp->mtype = 1; | |
169 | |
170 if(msgsnd(s,msgp,strlen(msgp->mtext)+1,0) < 0) { | |
171 perror(progname); | |
172 fprintf(stderr,"%s: unable to send message to server\n",progname); | |
173 exit(1); | |
174 }; /* if */ | |
175 | |
176 if((len = msgrcv(s,msgp,GSERV_BUFSZ,getpid(),0)) < 0) { | |
177 perror(progname); | |
178 fprintf(stderr,"%s: unable to receive message from server\n",progname); | |
179 exit(1); | |
180 }; /* if */ | |
181 | |
182 if (echo) { | |
183 msgp->mtext[len] = '\0'; /* string terminate message */ | |
184 fputs(msgp->mtext, stdout); | |
185 if (msgp->mtext[len-1] != '\n') putchar ('\n'); | |
186 }; /* if */ | |
187 | |
188 } /* disconnect_from_ipc_server */ | |
189 #endif /* SYSV_IPC */ | |
190 | |
191 | |
192 #if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS) | |
193 /* | |
194 send_string -- send string to socket. | |
195 */ | |
440 | 196 void |
442 | 197 send_string (int s, const char *msg) |
428 | 198 { |
199 #if 0 | |
200 if (send(s,msg,strlen(msg),0) < 0) { | |
201 perror(progname); | |
202 fprintf(stderr,"%s: unable to send\n",progname); | |
203 exit(1); | |
204 }; /* if */ | |
205 #else | |
206 int len, left=strlen(msg); | |
207 while (left > 0) { | |
208 if ((len=write(s,msg,min2(left,GSERV_BUFSZ))) < 0) { | |
209 /* XEmacs addition: robertl@arnet.com */ | |
210 if (errno == EPIPE) { | |
211 return ; | |
212 } | |
213 perror(progname); | |
214 fprintf(stderr,"%s: unable to send\n",progname); | |
215 exit(1); | |
216 }; /* if */ | |
217 left -= len; | |
218 msg += len; | |
219 }; /* while */ | |
220 #endif | |
221 } /* send_string */ | |
222 | |
223 /* | |
224 read_line -- read a \n terminated line from a socket | |
225 */ | |
440 | 226 int |
227 read_line (int s, char *dest) | |
428 | 228 { |
229 int length; | |
230 int offset=0; | |
231 char buffer[GSERV_BUFSZ+1]; | |
232 | |
233 while ((length=read(s,buffer+offset,1)>0) && buffer[offset]!='\n' | |
234 && buffer[offset] != EOT_CHR) { | |
235 offset += length; | |
236 if (offset >= GSERV_BUFSZ) | |
237 break; | |
238 } | |
239 buffer[offset] = '\0'; | |
240 strcpy(dest,buffer); | |
241 return 1; | |
242 } /* read_line */ | |
243 #endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */ | |
244 | |
245 | |
246 #ifdef UNIX_DOMAIN_SOCKETS | |
247 /* | |
248 connect_to_unix_server -- establish connection with server process via a unix- | |
249 domain socket. Returns socket descriptor for server | |
250 if successful. | |
251 */ | |
440 | 252 static int |
253 connect_to_unix_server (void) | |
428 | 254 { |
255 int s; /* connected socket descriptor */ | |
256 struct sockaddr_un server; /* for unix connections */ | |
257 | |
258 if ((s = socket(AF_UNIX,SOCK_STREAM,0)) < 0) { | |
259 perror(progname); | |
260 fprintf(stderr,"%s: unable to create socket\n",progname); | |
261 exit(1); | |
262 }; /* if */ | |
263 | |
264 server.sun_family = AF_UNIX; | |
265 #ifdef HIDE_UNIX_SOCKET | |
266 sprintf(server.sun_path,"%s/gsrvdir%d/gsrv",tmpdir,(int)geteuid()); | |
267 #else /* HIDE_UNIX_SOCKET */ | |
268 sprintf(server.sun_path,"%s/gsrv%d",tmpdir,(int)geteuid()); | |
269 #endif /* HIDE_UNIX_SOCKET */ | |
270 if (connect(s,(struct sockaddr *)&server,strlen(server.sun_path)+2) < 0) { | |
271 perror(progname); | |
272 fprintf(stderr,"%s: unable to connect to local\n",progname); | |
273 exit(1); | |
274 }; /* if */ | |
275 | |
276 return(s); | |
277 | |
278 } /* connect_to_unix_server */ | |
279 #endif /* UNIX_DOMAIN_SOCKETS */ | |
280 | |
281 | |
282 #ifdef INTERNET_DOMAIN_SOCKETS | |
283 /* | |
284 internet_addr -- return the internet addr of the hostname or | |
285 internet address passed. Return -1 on error. | |
286 */ | |
440 | 287 int |
288 internet_addr (char *host) | |
428 | 289 { |
290 struct hostent *hp; /* pointer to host info for remote host */ | |
291 IN_ADDR numeric_addr; /* host address */ | |
292 | |
293 numeric_addr = inet_addr(host); | |
294 if (!NUMERIC_ADDR_ERROR) | |
295 return numeric_addr; | |
296 else if ((hp = gethostbyname(host)) != NULL) | |
297 return ((struct in_addr *)(hp->h_addr))->s_addr; | |
298 else | |
299 return -1; | |
300 | |
301 } /* internet_addr */ | |
302 | |
303 #ifdef AUTH_MAGIC_COOKIE | |
304 # include <X11/X.h> | |
305 # include <X11/Xauth.h> | |
306 | |
307 static Xauth *server_xauth = NULL; | |
308 #endif | |
309 | |
310 /* | |
311 connect_to_internet_server -- establish connection with server process via | |
312 an internet domain socket. Returns socket | |
313 descriptor for server if successful. | |
314 */ | |
440 | 315 static int |
458 | 316 connect_to_internet_server (char *serverhost, unsigned short port) |
428 | 317 { |
318 int s; /* connected socket descriptor */ | |
319 struct servent *sp; /* pointer to service information */ | |
320 struct sockaddr_in peeraddr_in; /* for peer socket address */ | |
321 char buf[512]; /* temporary buffer */ | |
322 | |
323 /* clear out address structures */ | |
324 memset((char *)&peeraddr_in,0,sizeof(struct sockaddr_in)); | |
325 | |
326 /* Set up the peer address to which we will connect. */ | |
327 peeraddr_in.sin_family = AF_INET; | |
328 | |
329 /* look up the server host's internet address */ | |
647 | 330 if ((peeraddr_in.sin_addr.s_addr = internet_addr (serverhost)) == |
331 (unsigned int) -1) | |
332 { | |
333 fprintf (stderr, "%s: unable to find %s in /etc/hosts or from YP\n", | |
334 progname, serverhost); | |
335 exit(1); | |
336 } | |
428 | 337 |
338 if (port == 0) { | |
339 if ((sp = getservbyname ("gnuserv","tcp")) == NULL) | |
340 peeraddr_in.sin_port = htons(DEFAULT_PORT+getuid()); | |
341 else | |
342 peeraddr_in.sin_port = sp->s_port; | |
343 } /* if */ | |
344 else | |
345 peeraddr_in.sin_port = htons(port); | |
346 | |
347 /* Create the socket. */ | |
348 if ((s = socket (AF_INET,SOCK_STREAM, 0))== -1) { | |
349 perror(progname); | |
350 fprintf(stderr,"%s: unable to create socket\n",progname); | |
351 exit(1); | |
352 }; /* if */ | |
353 | |
354 /* Try to connect to the remote server at the address | |
355 * which was just built into peeraddr. | |
356 */ | |
357 if (connect(s, (struct sockaddr *)&peeraddr_in, | |
358 sizeof(struct sockaddr_in)) == -1) { | |
359 perror(progname); | |
360 fprintf(stderr, "%s: unable to connect to remote\n",progname); | |
361 exit(1); | |
362 }; /* if */ | |
363 | |
364 #ifdef AUTH_MAGIC_COOKIE | |
365 | |
366 /* send credentials using MIT-MAGIC-COOKIE-1 protocol */ | |
367 | |
368 server_xauth = | |
369 XauGetAuthByAddr(FamilyInternet, | |
370 sizeof(peeraddr_in.sin_addr.s_addr), | |
371 (char *) &peeraddr_in.sin_addr.s_addr, | |
372 strlen(MCOOKIE_SCREEN), MCOOKIE_SCREEN, | |
373 strlen(MCOOKIE_X_NAME), MCOOKIE_X_NAME); | |
374 | |
375 if (server_xauth && server_xauth->data) { | |
376 sprintf(buf, "%s\n%d\n", MCOOKIE_NAME, server_xauth->data_length); | |
377 write (s, buf, strlen(buf)); | |
378 write (s, server_xauth->data, server_xauth->data_length); | |
379 | |
380 return (s); | |
381 } | |
382 | |
383 #endif /* AUTH_MAGIC_COOKIE */ | |
384 | |
385 sprintf (buf, "%s\n", DEFAUTH_NAME); | |
386 write (s, buf, strlen(buf)); | |
387 | |
388 return(s); | |
389 | |
390 } /* connect_to_internet_server */ | |
391 #endif /* INTERNET_DOMAIN_SOCKETS */ | |
392 | |
393 | |
394 #if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS) | |
395 /* | |
396 disconnect_from_server -- inform the server that sending has finished, and wait for | |
397 its reply. | |
398 */ | |
440 | 399 void |
400 disconnect_from_server (int s, int echo) | |
428 | 401 { |
402 #if 0 | |
403 char buffer[REPLYSIZ+1]; | |
404 #else | |
405 char buffer[GSERV_BUFSZ+1]; | |
406 #endif | |
407 int add_newline = 1; | |
408 int length; | |
409 | |
410 send_string(s,EOT_STR); /* make sure server gets string */ | |
411 | |
3556 | 412 #ifndef _SCO_DS |
428 | 413 /* |
3556 | 414 * There used to be a comment here complaining about ancient Linux |
415 * versions. It is no longer relevant. I don't know why _SCO_DS is | |
416 * verboten here, as the original comment did not say. | |
428 | 417 */ |
418 | |
419 if (shutdown(s,1) == -1) { | |
420 perror(progname); | |
421 fprintf(stderr, "%s: unable to shutdown socket\n",progname); | |
422 exit(1); | |
423 }; /* if */ | |
424 #endif | |
425 | |
426 #if 0 | |
427 while((length = recv(s,buffer,REPLYSIZ,0)) > 0) { | |
428 buffer[length] = '\0'; | |
429 if (echo) fputs(buffer,stdout); | |
430 add_newline = (buffer[length-1] != '\n'); | |
431 }; /* while */ | |
432 #else | |
433 while ((length = read(s,buffer,GSERV_BUFSZ)) > 0 || | |
434 (length == -1 && errno == EINTR)) { | |
3556 | 435 if (length > 0) { |
428 | 436 buffer[length] = '\0'; |
437 if (echo) { | |
438 fputs(buffer,stdout); | |
439 add_newline = (buffer[length-1] != '\n'); | |
440 }; /* if */ | |
441 }; /* if */ | |
442 }; /* while */ | |
443 #endif | |
444 | |
445 if (echo && add_newline) putchar('\n'); | |
446 | |
447 if(length < 0) { | |
448 perror(progname); | |
449 fprintf(stderr,"%s: unable to read the reply from the server\n",progname); | |
450 exit(1); | |
451 }; /* if */ | |
452 | |
453 } /* disconnect_from_server */ | |
454 #endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */ |