public ShellConnection(ClovershellConnection connection, Socket socket) { this.connection = connection; this.socket = socket; id = -1; }
static void Main(string[] args) { string source; string target; int result = -1; int top, left; #if DEBUG Debug.Listeners.Add(new TextWriterTraceListener(System.Console.Error)); #endif using (var nes = new ClovershellConnection()) { try { if (args.Length == 0) { ShowHelp(); Environment.Exit(-1); } if (Process.GetProcessesByName("hakchi").Count() > 0) { throw new Exception("Please close hakchi2 first"); } var command = args[0].ToLower(); nes.Connect(); var ping = nes.Ping(); if (ping < 0) { throw new Exception("connected to NES Mini but clovershell is not responding"); } switch (command) { case "shell": if (args.Length >= 2) { nes.ShellPort = ushort.Parse(args[1]); } nes.ShellEnabled = true; nes.AutoReconnect = true; Console.WriteLine("Started shell server on port {0}.", nes.ShellPort); Console.WriteLine("Connect to it using terminal client (raw mode, no local echo)."); Console.WriteLine("Press ENTER to stop."); Console.ReadLine(); result = 0; break; case "exec": if (args.Length < 2) { ShowHelp(); Environment.Exit(-1); } Stream stdin = null; if (args.Length >= 3) { if (args[2] == "null") { stdin = null; } else if (args[2] == "-") { stdin = Console.OpenStandardInput(); } else { stdin = new FileStream(args[2], FileMode.Open); } } Stream stdout; if (args.Length >= 4) { if (args[3] == "-") { stdout = Console.OpenStandardOutput(); } else if (args[3] == "null") { stdout = null; } else { stdout = new FileStream(args[3], FileMode.Create); } } else { stdout = Console.OpenStandardOutput(); } Stream stderr; if (args.Length >= 5) { if (args[4] == "-") { stderr = Console.OpenStandardError(); } else if (args[4] == "null") { stderr = null; } else { stderr = new FileStream(args[4], FileMode.Create); } } else { stderr = Console.OpenStandardError(); } var s = DateTime.Now; result = nes.Execute(args[1], stdin, stdout, stderr); Console.Error.WriteLine("Done in {0}ms. Exit code: {1}", (int)(DateTime.Now - s).TotalMilliseconds, result); break; case "pull": if (args.Length < 2) { ShowHelp(); Environment.Exit(-1); } source = args[1]; if (args.Length >= 3) { target = args[2]; } else { target = source; int pos; while ((pos = target.IndexOf("/")) >= 0) { target = target.Substring(pos + 1); } } source = source.Replace("'", "\\'"); var sizeMS = new MemoryStream(); nes.Execute(string.Format("stat -c %s \"{0}\"", source), null, sizeMS, null, 1000, true); sizeMS.Seek(0, SeekOrigin.Begin); var size = int.Parse(new StreamReader(sizeMS).ReadToEnd()); Console.Write("Reading {0}... ", source); top = Console.CursorTop; left = Console.CursorLeft; var outFile = new TrackableFileStream(target, FileMode.Create); outFile.OnProgress += delegate(long Position, long Length) { Console.CursorTop = top; Console.CursorLeft = left; Console.Write("{0} / {1} ({2}%) ", Position, size > 0 ? size.ToString() : "???", size > 0 ? (Position * 100 / size).ToString() : "???"); }; result = nes.Execute("cat '" + source + "'", null, outFile, Console.OpenStandardError(), 1000, true); Console.WriteLine("Done."); break; case "push": if (args.Length < 3) { ShowHelp(); Environment.Exit(-1); } source = args[1]; target = args[2]; target = target.Replace("'", "\\'"); top = Console.CursorTop; left = Console.CursorLeft; var inFile = new TrackableFileStream(source, FileMode.Open); inFile.OnProgress += delegate(long Position, long Length) { Console.CursorTop = top; Console.CursorLeft = left; Console.Write("{0} / {1} ({2}%) ", Position, Length, Position * 100 / Length); }; result = nes.Execute("cat > '" + target + "'", inFile, Console.OpenStandardOutput(), Console.OpenStandardError(), 1000, true); Console.WriteLine("Done."); break; default: ShowHelp(); Environment.Exit(-1); break; } } catch (Exception ex) { Console.Error.WriteLine("Error: " + ex.Message); } #if DEBUG //Debug.WriteLine("Done."); //Console.ReadLine(); #endif } Environment.Exit(result); }
public ClovershellWrapper(ClovershellConnection theConnection) { conn = theConnection; conn.OnConnected += Conn_OnConnected; }