changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate emacs/lib/c2.el

changeset 698: 96958d3eb5b0
parent: a304c9713a51
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
587
Richard Westhaver <ellis@rwest.io>
parents: 167
diff changeset
1
 ;;; c2.el --- remote execution of elisp -*- lexical-binding: t -*-
167
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
2
 ;; Copyright (C) 2021-2024  ellis
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
3
 ;; 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
4
 ;; Author: ellis
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
5
 ;; Keywords: local, vc, net, process
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
6
 ;; 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
7
 ;; This program is free software; you can redistribute it and/or modify
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
8
 ;; it under the terms of the GNU General Public License as published by
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
9
 ;; the Free Software Foundation, either version 3 of the License, or
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
10
 ;; (at your option) any later version.
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
11
 ;; 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
12
 ;; This program is distributed in the hope that it will be useful,
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
13
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
14
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
15
 ;; GNU General Public License for more details.
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
16
 ;; 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
17
 ;; You should have received a copy of the GNU General Public License
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
18
 ;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
19
 ;; 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
20
 ;; Commentary:
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
21
 ;; 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
22
 ;; This package provides functions for executing elisp on a running
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
23
 ;; emacs instance remotely.
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
24
 ;; 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
25
 ;;; Code:
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
26
 (defgroup c2 nil
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
27
   "elisp server")
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
28
 
623
a304c9713a51 init graph.el
Richard Westhaver <ellis@rwest.io>
parents: 587
diff changeset
29
 (defcustom c2-directory (join-paths user-stash-directory "c2") "c2 directory."
167
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
30
   :group 'c2)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
31
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
32
 (defcustom c2-after-make-frame-hook nil
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
33
   "Hook run when c2 creates a client frame.
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
34
 The created frame is selected when the hook is called."
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
35
   :type 'hook
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
36
   :group 'c2)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
37
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
38
 (defcustom c2-done-hook nil
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
39
   "Hook run when done editing a buffer with c2."
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
40
   :type 'hook
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
41
   :group 'c2)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
42
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
43
 (defcustom c2-port 62824
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
44
   "port of the c2 broadcaster"
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
45
   :group 'c2)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
46
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
47
 (defvar c2-process nil
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
48
   "The c2 process handle.")
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
49
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
50
 (defvar c2-clients nil
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
51
   "List of current c2 clients.
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
52
 Each element is a process.")
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
53
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
54
 ;;; Bindat
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
55
 (setq c2-header-bindat-spec
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
56
       '((dest-ip   ip)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
57
         (dest-port u16)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
58
         (src-ip    ip)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
59
         (src-port  u16)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
60
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
61
 (setq c2-body-bindat-spec
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
62
       '((type      u8)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
63
         (opcode    u8)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
64
         (length    u16)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
65
         (id        strz 8)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
66
         (data      vec (length))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
67
         (align     4)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
68
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
69
 (setq c2-packet-bindat-spec
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
70
       '((header    struct header-spec)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
71
         (counters  vec 2 u32r)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
72
         (items     u8)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
73
         (fill      3)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
74
         (item      repeat (items)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
75
                    (struct data-spec))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
76
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
77
 (defun c2-insert-string (string)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
78
   (insert string 0 (make-string (- 3 (% (length string) 4)) 0)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
79
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
80
 (defun c2-insert-int32 (value)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
81
   (let (bytes)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
82
     (dotimes (i 4)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
83
       (push (% value 256) bytes)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
84
       (setq value (/ value 256)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
85
     (dolist (byte bytes)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
86
       (insert byte))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
87
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
88
 (defun c2-insert-float32 (value)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
89
   (let (s (e 0) f)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
90
     (cond
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
91
      ((string= (format "%f" value) (format "%f" -0.0))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
92
       (setq s 1 f 0))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
93
      ((string= (format "%f" value) (format "%f" 0.0))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
94
       (setq s 0 f 0))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
95
      ((= value 1.0e+INF)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
96
       (setq s 0 e 255 f (1- (expt 2 23))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
97
      ((= value -1.0e+INF)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
98
       (setq s 1 e 255 f (1- (expt 2 23))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
99
      ((string= (format "%f" value) (format "%f" 0.0e+NaN))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
100
       (setq s 0 e 255 f 1))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
101
      (t
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
102
       (setq s (if (>= value 0.0)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
103
 		  (progn (setq f value) 0)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
104
 		(setq f (* -1 value)) 1))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
105
       (while (>= (* f (expt 2.0 e)) 2.0) (setq e (1- e)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
106
       (if (= e 0) (while (< (* f (expt 2.0 e)) 1.0) (setq e (1+ e))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
107
       (setq f (round (* (1- (* f (expt 2.0 e))) (expt 2 23)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
108
 	    e (+ (* -1 e) 127))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
109
     (insert (+ (lsh s 7) (lsh (logand e #XFE) -1))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
110
 	    (+ (lsh (logand e #X01) 7) (lsh (logand f #X7F0000) -16))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
111
 	    (lsh (logand f #XFF00) -8)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
112
 	    (logand f #XFF))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
113
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
114
 (defun c2-read-string ()
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
115
   (let ((pos (point)) string)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
116
     (while (not (= (following-char) 0)) (forward-char 1))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
117
     (setq string (buffer-substring-no-properties pos (point)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
118
     (forward-char (- 4 (% (length string) 4)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
119
     string))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
120
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
121
 (defun c2-read-int32 ()
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
122
   (let ((value 0))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
123
     (dotimes (i 4)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
124
       (setq value (logior (* value 256) (following-char)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
125
       (forward-char 1))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
126
     value))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
127
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
128
 (defun c2-read-float32 ()
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
129
   (let ((s (lsh (logand (following-char) #X80) -7))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
130
 	(e (+ (lsh (logand (following-char) #X7F) 1)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
131
 	      (lsh (logand (progn (forward-char) (following-char)) #X80) -7)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
132
 	(f (+ (lsh (logand (following-char) #X7F) 16)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
133
 	      (lsh (progn (forward-char) (following-char)) 8)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
134
 	      (prog1 (progn (forward-char) (following-char)) (forward-char)))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
135
     (cond
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
136
      ((and (= e 0) (= f 0))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
137
       (* 0.0 (expt -1 s))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
138
       ((and (= e 255) (or (= f (1- (expt 2 23))) (= f 0)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
139
        (* 1.0e+INF (expt -1 s)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
140
       ((and (= e 255) (not (or (= f 0) (= f (1- (expt 2 23))))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
141
        0.0e+NaN)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
142
       (t
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
143
        (* (expt -1 s)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
144
 	  (expt 2.0 (- e 127))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
145
 	  (1+ (/ f (expt 2.0 23)))))))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
146
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
147
 ;;; Network
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
148
 ;;;###autoload
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
149
 (defun net-check-opts ()
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
150
   ;; https://gnu.huihoo.org/emacs/24.4/emacs-lisp/Network-Options.html#Network-Options
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
151
   ;; non-blocking
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
152
   (featurep 'make-network-process '(:nowait t))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
153
   ;; UNIX socket
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
154
 					;(featurep 'make-network-process '(:family local))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
155
   ;; UDP
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
156
   (featurep 'make-network-process '(:type datagram)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
157
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
158
 ;;; Process
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
159
 (defun c2-make-client (host port)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
160
   (make-network-process
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
161
    :name "c2-client"
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
162
    :coding 'binary
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
163
    :host host
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
164
    :service port
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
165
    :type 'datagram
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
166
    :nowait t))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
167
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
168
 (defun c2-sentinel (proc msg)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
169
   (when (string= msg "connection broken by remote peer\n")
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
170
     (setq c2-clients (assq-delete-all proc c2-clients))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
171
     (c2-log (format "client %s has quit" proc))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
172
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
173
 ;;from server.el
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
174
 (defun c2-log (string &optional client)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
175
   "If a *c2* buffer exists, write STRING to it for logging purposes."
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
176
   (if (get-buffer "*c2*")
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
177
       (with-current-buffer "*c2*"
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
178
         (goto-char (point-max))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
179
         (insert (if client (format "<%s>: " (format-network-address (process-datagram-address client))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
180
                 string)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
181
         (or (bolp) (newline)))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
182
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
183
 ;;;###autoload
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
184
 (defun c2-start nil
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
185
   "start c2 over udp"
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
186
   (interactive)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
187
   (unless (process-status "c2")
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
188
     (make-network-process :name "c2"
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
189
 			  :buffer "*c2*"
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
190
 			  :family 'ipv4
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
191
 			  :service c2-port
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
192
 			  :type 'datagram
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
193
 			  :coding 'binary
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
194
 			  :sentinel 'c2-sentinel
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
195
 			  :filter 'c2-filter
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
196
 			  :server t
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
197
 			  :broadcast t) 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
198
     (setq c2-clients '())
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
199
     ;; setup additional filters
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
200
     (add-function :after (process-filter (get-process "c2")) #'c2-eval-response-filter))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
201
   (message "c2: ONLINE"))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
202
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
203
 ;;;###autoload
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
204
 (defun c2-stop ()
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
205
   "stop the c2 server."
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
206
   (interactive)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
207
   (while  c2-clients
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
208
     (delete-process (car (car c2-clients)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
209
     (setq c2-clients (cdr c2-clients)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
210
   (with-current-buffer "*c2*"
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
211
     (let ((proc (get-buffer-process (current-buffer))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
212
       (if proc (delete-process proc)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
213
     (set-buffer-modified-p nil)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
214
     (kill-this-buffer))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
215
   (message "c2 stopped"))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
216
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
217
 (defun c2-filter (proc string)   
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
218
   (let ((pending (assoc proc c2-clients))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
219
         message
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
220
         index)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
221
     ;;create entry if required
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
222
     (unless pending
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
223
       (setq c2-clients (cons (cons proc "") c2-clients))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
224
       (setq pending  (assoc proc c2-clients)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
225
     (setq message (concat (cdr pending) string))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
226
     (while (setq index (string-match "\n" message))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
227
       (setq index (1+ index))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
228
 ;      (process-send-string proc (substring message 0 index))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
229
       (c2-log  (substring message 0 index) proc)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
230
       (setq message (substring message index)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
231
     (setcdr pending message)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
232
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
233
 (defun c2-packet-filter (proc string)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
234
   "process-filter for decoding 'c2-packet-bindat-spec'"
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
235
   (bindat-unpack packet-spec string))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
236
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
237
 (defun ordinary-insertion-filter (proc string)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
238
   (when (buffer-live-p (process-buffer proc))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
239
     (with-current-buffer (process-buffer proc)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
240
       (let ((moving (= (point) (process-mark proc))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
241
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
242
         (save-excursion
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
243
           ;; Insert the text, advancing the process marker.
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
244
           (goto-char (process-mark proc))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
245
           (insert string)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
246
           (set-marker (process-mark proc) (point)))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
247
         (if moving (goto-char (process-mark proc)))))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
248
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
249
 (defun c2-eval-response-filter (proc string)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
250
   "execute STRING from PROC."
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
251
   (let ((msg (car (read-from-string string))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
252
     (process-send-string proc (concat (format "%s" (ignore-errors "error: %S" (eval msg))) "\n"))))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
253
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
254
 ;;;; Signals
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
255
 ;;;###autoload
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
256
 (defun c2-shutdown ()
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
257
   "Save buffers, Quit, and Shutdown (kill) server"
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
258
   (interactive)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
259
   (save-some-buffers)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
260
   (kill-emacs))
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
261
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
262
 ;;;###autoload
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
263
 (defun c2-restart ()
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
264
   "Handler for SIGUSR1 signal, to (re)start an emacs server.
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
265
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
266
 Can be tested from within emacs with:
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
267
   (signal-process (emacs-pid) 'sigusr1)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
268
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
269
 or from the command line with:
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
270
 $ kill -USR1 <emacs-pid>
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
271
 $ emacsclient -c
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
272
 "
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
273
   (interactive)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
274
   (server-force-delete)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
275
   (server-start)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
276
   )
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
277
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
278
 (define-key special-event-map [sigusr1] 'c2-restart)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
279
 
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
280
 (provide 'c2)
611060cba9f0 rust net updates and c2.el import
ellis <ellis@rwest.io>
parents:
diff changeset
281
 ;;; c2.el ends here