Code Snippets

From WTFwiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

This page holds random code snippets that do cool things:

This snippet creates a subprocess with a bi-directional pipe between them for communication. It can be used for (for example) wrapping a ssh connection (if you call setsid ssh will use the command defined in SSH_ASKPASS to request the password), daemonizing a process (see also Daemonize) or many other things...

 require 'socket'
# create a new stream socket pair in the unix domain input, output = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0) if pid = fork # forktastic Process.detach(pid) # if we exit, make sure the child doesn't zombie input.puts 'ho' sleep 10 input.puts 'bye' puts output.gets else Process.setsid # make the forked process run in a new session puts output.gets puts output.gets sleep 5 input.puts 'farewell' end

This snippet connects to a UNIX socket on the machine. If the server isn't running; it spawns one in a subprocess and detaches it. This is useful for robustness.

 require 'socket'
PATH=File.join(ENV['HOME'], '.testsock')
begin sock = UNIXSocket.new(PATH) rescue Errno::ENOENT, Errno::ECONNREFUSED => e File.delete(PATH) if File.socket?(PATH) if pid = fork() Process.detach(pid) sleep 1 retry else server = UNIXServer.new(PATH) loop do sock = server.accept sock.puts("Echo: "+sock.gets) end end end
sock.puts("HI!") puts sock.gets

Here's a GLIB event loop for an erlang port program (that communicates with the VM over stdio). The port is set up for {packet, 2} mode which means all messages (sending and receiving) are prefixed with a 2 byte (16 bit) 'length' field.

#include <sys/uio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <glib.h>
gboolean socket_data(GIOChannel *source, GIOCondition condition, gpointer data) {
 uint16_t len;
 uint16_t inlen;
 char *inbuf;
 
 if (condition == G_IO_IN) {
  read(0, &len, 2);
  inlen = ntohs(len);
  inbuf = malloc(inlen + 1);
  
  memset(inbuf, 0, inlen+1);
 
  read(0, inbuf, inlen);
 
  write(1, &len, sizeof(uint16_t));
  write(1, inbuf, strlen(inbuf));
  free(inbuf);
 } else {
  g_main_loop_quit((GMainLoop*) data);
  return FALSE;
 }

 return TRUE;
}

int main(int argc, char** argv) {
 GMainLoop *mainloop = g_main_loop_new (NULL, FALSE);
 GIOChannel *chan = g_io_channel_unix_new(0);
 g_io_add_watch(chan, G_IO_IN | G_IO_HUP | G_IO_ERR, socket_data, mainloop);
 
 g_main_loop_run (mainloop);
 
 return 0;
}