attach-to-console.pl
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #!/usr/bin/env perl
  2. #########################################################################
  3. #  OpenKore - Socket interface
  4. #
  5. #  Copyright (c) 2007 OpenKore development team
  6. #
  7. #  This program is free software; you can redistribute it and/or modify
  8. #  it under the terms of the GNU General Public License as published by
  9. #  the Free Software Foundation; either version 2 of the License, or
  10. #  (at your option) any later version.
  11. #
  12. #  This program is distributed in the hope that it will be useful,
  13. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. #  GNU General Public License for more details.
  16. #########################################################################
  17. # This program allows you to attach to a running OpenKore session that uses
  18. # the Socket interface.
  19. use strict;
  20. use FindBin qw($RealBin);
  21. use lib "$RealBin/..";
  22. use lib "$RealBin/../deps";
  23. use IO::Socket::UNIX;
  24. use ErrorHandler;
  25. use Globals qw($interface $quit %consoleColors);
  26. use Settings;
  27. use FileParsers qw(parseSectionedFile);
  28. use Interface::Console;
  29. use Bus::Messages qw(serialize);
  30. use Bus::MessageParser;
  31. my $socket;
  32. my $parser;
  33. start();
  34. sub start {
  35. if (!Settings::parseArguments()) {
  36. usage(1);
  37. }
  38. if (@ARGV != 1) {
  39. usage(1);
  40. }
  41. $socket = new IO::Socket::UNIX(
  42. Type => SOCK_STREAM,
  43. Peer => $ARGV[0]
  44. );
  45. if (!$socket) {
  46. print "Cannot connect to $ARGV[0]: $!n";
  47. exit 1;
  48. }
  49. $socket->send(serialize("set active"));
  50. $socket->flush();
  51. $parser = new Bus::MessageParser();
  52. Settings::addControlFile("consolecolors.txt", loader => [&parseSectionedFile, %consoleColors]);
  53. Settings::loadAll();
  54. $interface = new Interface::Console();
  55. $interface->mainLoop();
  56. }
  57. sub usage {
  58. print "Usage: attach-to-console.pl <SOCKET FILE>n";
  59. exit 1;
  60. }
  61. sub mainLoop {
  62. my $bits = '';
  63. vec($bits, fileno($socket), 1) = 1;
  64. if (select($bits, undef, undef, 0) > 0) {
  65. my ($data, $ID);
  66. $socket->recv($data, 1024 * 32);
  67. if (!defined($data) || length($data) == 0) {
  68. $quit = 1;
  69. } else {
  70. $parser->add($data);
  71. while (my $args = $parser->readNext($ID)) {
  72. if ($ID eq "output") {
  73. $interface->writeOutput($args->{type},
  74. $args->{message},
  75. $args->{domain});
  76. } elsif ($ID eq "title changed") {
  77. $interface->title($args->{title});
  78. } elsif ($ID eq "inputted") {
  79. $interface->writeOutput("message",
  80. "$args->{data}n",
  81. "input");
  82. }
  83. }
  84. }
  85. }
  86. if (defined(my $input = $interface->getInput(0))) {
  87. if ($input eq "detach") {
  88. $quit = 1;
  89. } else {
  90. my $message = serialize("input", { data => $input });
  91. $socket->send($message);
  92. $socket->flush();
  93. }
  94. }
  95. }