Personal Finger Daemon for Windows

By Robert Ellison. Updated on Wednesday, June 2, 2021.

Did you know that Windows still has a vestigial finger command with just about nothing left to talk to? One of my New Year's resolutions is to bring finger back and unlike the stalled webfinger project I need to make some progress. Here's some C# to run your own personal finger daemon... you just need to create a .plan file in your home directory (haven't done that for a while):

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace fingerd
{
static class Program
{
private const int FingerPort = 79;
private const int MaxFingerCommand = 256;
private const string PlanFile = ".plan";
private static readonly TcpListener _tcpListener = new TcpListener(
IPAddress.Any, FingerPort);
static void Main()
{
_tcpListener.Start();
while (true)
{
TcpClient tcpClient = _tcpListener.AcceptTcpClient();
Thread clientThread = new Thread(ClientThread);
clientThread.Start(tcpClient);
}
}
static void ClientThread(object client)
{
NetworkStream clientStream = null;
TcpClient tcpClient = client as TcpClient;
if (tcpClient == null) { return; }
try
{
byte[] command = new byte[MaxFingerCommand];
clientStream = tcpClient.GetStream();
int read = clientStream.Read(command, 0, command.Length);
if (read == 0) { return; }
ASCIIEncoding asciiEncoding = new ASCIIEncoding();
string commandText = asciiEncoding.GetString(command);
int endOfCommand = commandText.IndexOf("\r\n",
StringComparison.InvariantCultureIgnoreCase);
if (endOfCommand <= 0) { return; }
string user = commandText.Substring(0, endOfCommand);
if (string.Compare(user, Environment.UserName,
StringComparison.InvariantCultureIgnoreCase) != 0) { return; }
string planPath = Path.Combine(Environment.GetFolderPath(
Environment.SpecialFolder.UserProfile),
PlanFile);
if (!File.Exists(planPath)) { return; }
string plan = File.ReadAllText(planPath) + "\r\n";
byte[] planBytes = asciiEncoding.GetBytes(plan);
clientStream.Write(planBytes, 0, planBytes.Length);
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
finally
{
if (clientStream != null)
{
clientStream.Close();
}
tcpClient.Close();
}
}
}
}
view raw Program.cs hosted with ❤ by GitHub

Add your comment...

Related Posts

(All Code Posts)

(Published to the Fediverse as: Personal Finger Daemon for Windows #code #random #finger #fingerd An impractical attempt to bring finger back (the awesome UNIX utility for pinging a person, so much better than Facebook!) )

Add Comment

All comments are moderated. Your email address is used to display a Gravatar and optionally for notification of new comments and to sign up for the newsletter.