Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Simple IPC protocol for unix domain sockets

This library implements a very simple protocol for unix domain sockets to send messages and file descriptors. Demos are included in demo/client and demo/server where the client connects to the server via a socket file in the current directory. The client gives the stdout file descriptor to the server which writes a message to it.

Demo

The server:

$ rm -f sock && go build ./demo/server && ./server
2017/10/04 14:10:09 Receive client &{{0xc420020150}}
2017/10/04 14:10:09 Received header simpleipc.Header{Seq:0x2a, Reserved0:0x0, Reserved1:0x0, NumFiles:0x1, Size:0x0, Files:[]*os.File{(*os.File)(0xc42000e050)}}

The client:

$ go build ./demo/client && ./client
2017/10/04 14:10:09 Connected to server &{{0xc4200200e0}}
Hello world

Wire protocol

Messages are sent to the socket with a header and an optional payload. This library is only specifying what the header format is and the payload is left to the underlying application to specify.

Numbers are encoded in big endian.

Header format:

0 8 16 24 32
+-------------------------------+
| Message number uint32 BE |
+-----------------------+-------+
| Reserved | NumF |
+-----------------------+-------+
| Payload size uint32 BE |
+-------------------------------+
  • message number is application specific. It is suggested that the client choose even sequence numbers and the server odd sequence numbers. When sending a message, the peer allocates a new sequence number in their pool, and when responding to a message, it uses the sequence number of the original request. It is also suggested that the first sequence numbers (0 and 1) are for messages with no reply.

  • NumF: the number of file descriptors in ancillary data

  • Payload size: the size of the following payload. It is suggested that long messages should be shared using a file descriptor instead with the apyload describing what is contained in the file descriptors and how they should be interpreted.

The header size is constant to ensure that it can be read with a single read and that ancillary data attached with it are found correctly. See discussion about what happens when messages with ancillary data are read partially:

https://unix.stackexchange.com/questions/185011/what-happens-with-unix-stream-ancillary-data-on-partial-reads

Contributions

The goal of this protocol is to stay simple, I don't plan to add features to it. However if you want to contribute, you can contribute to tests and implementation on other languages.

About

Simple IPC with sockets and file descriptors passinc in ancillary data

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Simple IPC protocol for unix domain sockets

This library implements a very simple protocol for unix domain sockets to send messages and file descriptors. Demos are included in demo/client and demo/server where the client connects to the server via a socket file in the current directory. The client gives the stdout file descriptor to the server which writes a message to it.

Demo

The server:

$ rm -f sock && go build ./demo/server && ./server
2017/10/04 14:10:09 Receive client &{{0xc420020150}}
2017/10/04 14:10:09 Received header simpleipc.Header{Seq:0x2a, Reserved0:0x0, Reserved1:0x0, NumFiles:0x1, Size:0x0, Files:[]*os.File{(*os.File)(0xc42000e050)}}

The client:

$ go build ./demo/client && ./client
2017/10/04 14:10:09 Connected to server &{{0xc4200200e0}}
Hello world

Wire protocol

Messages are sent to the socket with a header and an optional payload. This library is only specifying what the header format is and the payload is left to the underlying application to specify.

Numbers are encoded in big endian.

Header format:

0 8 16 24 32
+-------------------------------+
| Message number uint32 BE |
+-----------------------+-------+
| Reserved | NumF |
+-----------------------+-------+
| Payload size uint32 BE |
+-------------------------------+
  • message number is application specific. It is suggested that the client choose even sequence numbers and the server odd sequence numbers. When sending a message, the peer allocates a new sequence number in their pool, and when responding to a message, it uses the sequence number of the original request. It is also suggested that the first sequence numbers (0 and 1) are for messages with no reply.

  • NumF: the number of file descriptors in ancillary data

  • Payload size: the size of the following payload. It is suggested that long messages should be shared using a file descriptor instead with the apyload describing what is contained in the file descriptors and how they should be interpreted.

The header size is constant to ensure that it can be read with a single read and that ancillary data attached with it are found correctly. See discussion about what happens when messages with ancillary data are read partially:

https://unix.stackexchange.com/questions/185011/what-happens-with-unix-stream-ancillary-data-on-partial-reads

Contributions

The goal of this protocol is to stay simple, I don't plan to add features to it. However if you want to contribute, you can contribute to tests and implementation on other languages.

About

Simple IPC with sockets and file descriptors passinc in ancillary data

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Simple IPC protocol for unix domain sockets

This library implements a very simple protocol for unix domain sockets to send messages and file descriptors. Demos are included in demo/client and demo/server where the client connects to the server via a socket file in the current directory. The client gives the stdout file descriptor to the server which writes a message to it.

Demo

The server:

$ rm -f sock && go build ./demo/server && ./server
2017/10/04 14:10:09 Receive client &{{0xc420020150}}
2017/10/04 14:10:09 Received header simpleipc.Header{Seq:0x2a, Reserved0:0x0, Reserved1:0x0, NumFiles:0x1, Size:0x0, Files:[]*os.File{(*os.File)(0xc42000e050)}}

The client:

$ go build ./demo/client && ./client
2017/10/04 14:10:09 Connected to server &{{0xc4200200e0}}
Hello world

Wire protocol

Messages are sent to the socket with a header and an optional payload. This library is only specifying what the header format is and the payload is left to the underlying application to specify.

Numbers are encoded in big endian.

Header format:

0 8 16 24 32
+-------------------------------+
| Message number uint32 BE |
+-----------------------+-------+
| Reserved | NumF |
+-----------------------+-------+
| Payload size uint32 BE |
+-------------------------------+
  • message number is application specific. It is suggested that the client choose even sequence numbers and the server odd sequence numbers. When sending a message, the peer allocates a new sequence number in their pool, and when responding to a message, it uses the sequence number of the original request. It is also suggested that the first sequence numbers (0 and 1) are for messages with no reply.

  • NumF: the number of file descriptors in ancillary data

  • Payload size: the size of the following payload. It is suggested that long messages should be shared using a file descriptor instead with the apyload describing what is contained in the file descriptors and how they should be interpreted.

The header size is constant to ensure that it can be read with a single read and that ancillary data attached with it are found correctly. See discussion about what happens when messages with ancillary data are read partially:

https://unix.stackexchange.com/questions/185011/what-happens-with-unix-stream-ancillary-data-on-partial-reads

Contributions

The goal of this protocol is to stay simple, I don't plan to add features to it. However if you want to contribute, you can contribute to tests and implementation on other languages.

About

Simple IPC with sockets and file descriptors passinc in ancillary data

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Simple IPC protocol for unix domain sockets

This library implements a very simple protocol for unix domain sockets to send messages and file descriptors. Demos are included in demo/client and demo/server where the client connects to the server via a socket file in the current directory. The client gives the stdout file descriptor to the server which writes a message to it.

Demo

The server:

$ rm -f sock && go build ./demo/server && ./server
2017/10/04 14:10:09 Receive client &{{0xc420020150}}
2017/10/04 14:10:09 Received header simpleipc.Header{Seq:0x2a, Reserved0:0x0, Reserved1:0x0, NumFiles:0x1, Size:0x0, Files:[]*os.File{(*os.File)(0xc42000e050)}}

The client:

$ go build ./demo/client && ./client
2017/10/04 14:10:09 Connected to server &{{0xc4200200e0}}
Hello world

Wire protocol

Messages are sent to the socket with a header and an optional payload. This library is only specifying what the header format is and the payload is left to the underlying application to specify.

Numbers are encoded in big endian.

Header format:

0 8 16 24 32
+-------------------------------+
| Message number uint32 BE |
+-----------------------+-------+
| Reserved | NumF |
+-----------------------+-------+
| Payload size uint32 BE |
+-------------------------------+
  • message number is application specific. It is suggested that the client choose even sequence numbers and the server odd sequence numbers. When sending a message, the peer allocates a new sequence number in their pool, and when responding to a message, it uses the sequence number of the original request. It is also suggested that the first sequence numbers (0 and 1) are for messages with no reply.

  • NumF: the number of file descriptors in ancillary data

  • Payload size: the size of the following payload. It is suggested that long messages should be shared using a file descriptor instead with the apyload describing what is contained in the file descriptors and how they should be interpreted.

The header size is constant to ensure that it can be read with a single read and that ancillary data attached with it are found correctly. See discussion about what happens when messages with ancillary data are read partially:

https://unix.stackexchange.com/questions/185011/what-happens-with-unix-stream-ancillary-data-on-partial-reads

Contributions

The goal of this protocol is to stay simple, I don't plan to add features to it. However if you want to contribute, you can contribute to tests and implementation on other languages.

About

Simple IPC with sockets and file descriptors passinc in ancillary data

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Simple IPC protocol for unix domain sockets

This library implements a very simple protocol for unix domain sockets to send messages and file descriptors. Demos are included in demo/client and demo/server where the client connects to the server via a socket file in the current directory. The client gives the stdout file descriptor to the server which writes a message to it.

Demo

The server:

$ rm -f sock && go build ./demo/server && ./server
2017/10/04 14:10:09 Receive client &{{0xc420020150}}
2017/10/04 14:10:09 Received header simpleipc.Header{Seq:0x2a, Reserved0:0x0, Reserved1:0x0, NumFiles:0x1, Size:0x0, Files:[]*os.File{(*os.File)(0xc42000e050)}}

The client:

$ go build ./demo/client && ./client
2017/10/04 14:10:09 Connected to server &{{0xc4200200e0}}
Hello world

Wire protocol

Messages are sent to the socket with a header and an optional payload. This library is only specifying what the header format is and the payload is left to the underlying application to specify.

Numbers are encoded in big endian.

Header format:

0 8 16 24 32
+-------------------------------+
| Message number uint32 BE |
+-----------------------+-------+
| Reserved | NumF |
+-----------------------+-------+
| Payload size uint32 BE |
+-------------------------------+
  • message number is application specific. It is suggested that the client choose even sequence numbers and the server odd sequence numbers. When sending a message, the peer allocates a new sequence number in their pool, and when responding to a message, it uses the sequence number of the original request. It is also suggested that the first sequence numbers (0 and 1) are for messages with no reply.

  • NumF: the number of file descriptors in ancillary data

  • Payload size: the size of the following payload. It is suggested that long messages should be shared using a file descriptor instead with the apyload describing what is contained in the file descriptors and how they should be interpreted.

The header size is constant to ensure that it can be read with a single read and that ancillary data attached with it are found correctly. See discussion about what happens when messages with ancillary data are read partially:

https://unix.stackexchange.com/questions/185011/what-happens-with-unix-stream-ancillary-data-on-partial-reads

Contributions

The goal of this protocol is to stay simple, I don't plan to add features to it. However if you want to contribute, you can contribute to tests and implementation on other languages.

About

Simple IPC with sockets and file descriptors passinc in ancillary data

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Simple IPC protocol for unix domain sockets

This library implements a very simple protocol for unix domain sockets to send messages and file descriptors. Demos are included in demo/client and demo/server where the client connects to the server via a socket file in the current directory. The client gives the stdout file descriptor to the server which writes a message to it.

Demo

The server:

$ rm -f sock && go build ./demo/server && ./server
2017/10/04 14:10:09 Receive client &{{0xc420020150}}
2017/10/04 14:10:09 Received header simpleipc.Header{Seq:0x2a, Reserved0:0x0, Reserved1:0x0, NumFiles:0x1, Size:0x0, Files:[]*os.File{(*os.File)(0xc42000e050)}}

The client:

$ go build ./demo/client && ./client
2017/10/04 14:10:09 Connected to server &{{0xc4200200e0}}
Hello world

Wire protocol

Messages are sent to the socket with a header and an optional payload. This library is only specifying what the header format is and the payload is left to the underlying application to specify.

Numbers are encoded in big endian.

Header format:

0 8 16 24 32
+-------------------------------+
| Message number uint32 BE |
+-----------------------+-------+
| Reserved | NumF |
+-----------------------+-------+
| Payload size uint32 BE |
+-------------------------------+
  • message number is application specific. It is suggested that the client choose even sequence numbers and the server odd sequence numbers. When sending a message, the peer allocates a new sequence number in their pool, and when responding to a message, it uses the sequence number of the original request. It is also suggested that the first sequence numbers (0 and 1) are for messages with no reply.

  • NumF: the number of file descriptors in ancillary data

  • Payload size: the size of the following payload. It is suggested that long messages should be shared using a file descriptor instead with the apyload describing what is contained in the file descriptors and how they should be interpreted.

The header size is constant to ensure that it can be read with a single read and that ancillary data attached with it are found correctly. See discussion about what happens when messages with ancillary data are read partially:

https://unix.stackexchange.com/questions/185011/what-happens-with-unix-stream-ancillary-data-on-partial-reads

Contributions

The goal of this protocol is to stay simple, I don't plan to add features to it. However if you want to contribute, you can contribute to tests and implementation on other languages.

About

Simple IPC with sockets and file descriptors passinc in ancillary data

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Simple IPC protocol for unix domain sockets

This library implements a very simple protocol for unix domain sockets to send messages and file descriptors. Demos are included in demo/client and demo/server where the client connects to the server via a socket file in the current directory. The client gives the stdout file descriptor to the server which writes a message to it.

Demo

The server:

$ rm -f sock && go build ./demo/server && ./server
2017/10/04 14:10:09 Receive client &{{0xc420020150}}
2017/10/04 14:10:09 Received header simpleipc.Header{Seq:0x2a, Reserved0:0x0, Reserved1:0x0, NumFiles:0x1, Size:0x0, Files:[]*os.File{(*os.File)(0xc42000e050)}}

The client:

$ go build ./demo/client && ./client
2017/10/04 14:10:09 Connected to server &{{0xc4200200e0}}
Hello world

Wire protocol

Messages are sent to the socket with a header and an optional payload. This library is only specifying what the header format is and the payload is left to the underlying application to specify.

Numbers are encoded in big endian.

Header format:

0 8 16 24 32
+-------------------------------+
| Message number uint32 BE |
+-----------------------+-------+
| Reserved | NumF |
+-----------------------+-------+
| Payload size uint32 BE |
+-------------------------------+
  • message number is application specific. It is suggested that the client choose even sequence numbers and the server odd sequence numbers. When sending a message, the peer allocates a new sequence number in their pool, and when responding to a message, it uses the sequence number of the original request. It is also suggested that the first sequence numbers (0 and 1) are for messages with no reply.

  • NumF: the number of file descriptors in ancillary data

  • Payload size: the size of the following payload. It is suggested that long messages should be shared using a file descriptor instead with the apyload describing what is contained in the file descriptors and how they should be interpreted.

The header size is constant to ensure that it can be read with a single read and that ancillary data attached with it are found correctly. See discussion about what happens when messages with ancillary data are read partially:

https://unix.stackexchange.com/questions/185011/what-happens-with-unix-stream-ancillary-data-on-partial-reads

Contributions

The goal of this protocol is to stay simple, I don't plan to add features to it. However if you want to contribute, you can contribute to tests and implementation on other languages.

About

Simple IPC with sockets and file descriptors passinc in ancillary data

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Simple IPC protocol for unix domain sockets

This library implements a very simple protocol for unix domain sockets to send messages and file descriptors. Demos are included in demo/client and demo/server where the client connects to the server via a socket file in the current directory. The client gives the stdout file descriptor to the server which writes a message to it.

Demo

The server:

$ rm -f sock && go build ./demo/server && ./server
2017/10/04 14:10:09 Receive client &{{0xc420020150}}
2017/10/04 14:10:09 Received header simpleipc.Header{Seq:0x2a, Reserved0:0x0, Reserved1:0x0, NumFiles:0x1, Size:0x0, Files:[]*os.File{(*os.File)(0xc42000e050)}}

The client:

$ go build ./demo/client && ./client
2017/10/04 14:10:09 Connected to server &{{0xc4200200e0}}
Hello world

Wire protocol

Messages are sent to the socket with a header and an optional payload. This library is only specifying what the header format is and the payload is left to the underlying application to specify.

Numbers are encoded in big endian.

Header format:

0 8 16 24 32
+-------------------------------+
| Message number uint32 BE |
+-----------------------+-------+
| Reserved | NumF |
+-----------------------+-------+
| Payload size uint32 BE |
+-------------------------------+
  • message number is application specific. It is suggested that the client choose even sequence numbers and the server odd sequence numbers. When sending a message, the peer allocates a new sequence number in their pool, and when responding to a message, it uses the sequence number of the original request. It is also suggested that the first sequence numbers (0 and 1) are for messages with no reply.

  • NumF: the number of file descriptors in ancillary data

  • Payload size: the size of the following payload. It is suggested that long messages should be shared using a file descriptor instead with the apyload describing what is contained in the file descriptors and how they should be interpreted.

The header size is constant to ensure that it can be read with a single read and that ancillary data attached with it are found correctly. See discussion about what happens when messages with ancillary data are read partially:

https://unix.stackexchange.com/questions/185011/what-happens-with-unix-stream-ancillary-data-on-partial-reads

Contributions

The goal of this protocol is to stay simple, I don't plan to add features to it. However if you want to contribute, you can contribute to tests and implementation on other languages.

About

Simple IPC with sockets and file descriptors passinc in ancillary data

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages