#include <errno.h>
#include <unistd.h>
+#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
-
-#include "Cycript.tab.hh"
+#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pwd.h>
#include <apr_getopt.h>
+#include <apr_pools.h>
+#include <apr_strings.h>
#include <dlfcn.h>
-#include "Replace.hpp"
#include "Display.hpp"
+#include "Replace.hpp"
+
+#include "Cycript.tab.hh"
+#include "Driver.hpp"
static volatile enum {
Working,
static CYUTF8String Run(CYPool &pool, int client, CYUTF8String code) {
const char *json;
- size_t size;
+ uint32_t size;
if (client == -1) {
mode_ = Running;
CYSendAll(client, code.data, code.size);
mode_ = Waiting;
CYRecvAll(client, &size, sizeof(size));
- if (size == _not(size_t))
+ if (size == _not(uint32_t))
json = NULL;
else {
char *temp(new(pool) char[size + 1]);
else
passwd = getpwuid(getuid());
- const char *basedir(pool.sprintf("%s/.cycript", passwd->pw_dir));
- const char *histfile(pool.sprintf("%s/history", basedir));
+ const char *basedir(pool.strcat(passwd->pw_dir, "/.cycript", NULL));
+ const char *histfile(pool.strcat(basedir, "/history", NULL));
size_t histlines(0);
rl_initialize();
void InjectLibrary(pid_t pid);
int Main(int argc, char const * const argv[], char const * const envp[]) {
+ _aprcall(apr_initialize());
+
+ apr_pool_t *pool;
+ apr_pool_create(&pool, NULL);
+
bool tty(isatty(STDIN_FILENO));
bool compile(false);
CYOptions options;
pid_t pid(_not(pid_t));
#endif
- CYPool pool;
+ const char *host(NULL);
+ const char *port(NULL);
+
apr_getopt_t *state;
_aprcall(apr_getopt_init(&state, pool, argc, argv));
#ifdef CY_ATTACH
"p:"
#endif
+ "r:"
"s"
, &opt, &arg));
#ifdef CY_ATTACH
" [-p <pid|name>]"
#endif
+ " [-r <host:port>]"
" [<script> [<arg>...]]\n"
);
return 1;
pid = strtoul(arg, &end, 0);
if (arg + size != end) {
// XXX: arg needs to be escaped in some horrendous way of doom
- const char *command(pool.sprintf("ps axc|sed -e '/^ *[0-9]/{s/^ *\\([0-9]*\\)\\( *[^ ]*\\)\\{3\\} *-*\\([^ ]*\\)/\\3 \\1/;/^%s /{s/^[^ ]* //;q;};};d'", arg));
+ const char *command(apr_pstrcat(pool, "ps axc|sed -e '/^ *[0-9]/{s/^ *\\([0-9]*\\)\\( *[^ ]*\\)\\{3\\} *-*\\([^ ]*\\)/\\3 \\1/;/^", arg, " /{s/^[^ ]* //;q;};};d'", NULL));
if (FILE *pids = popen(command, "r")) {
char value[32];
} break;
#endif
+ case 'r': {
+ //size_t size(strlen(arg));
+
+ char *colon(strrchr(arg, ':'));
+ if (colon == NULL) {
+ fprintf(stderr, "missing colon in hostspec\n");
+ return 1;
+ }
+
+ /*char *end;
+ port = strtoul(colon + 1, &end, 10);
+ if (end != arg + size) {
+ fprintf(stderr, "invalid port in hostspec\n");
+ return 1;
+ }*/
+
+ host = arg;
+ *colon = '\0';
+ port = colon + 1;
+ } break;
+
case 's':
strict_ = true;
break;
client_ = -1;
#endif
+ if (client_ == -1 && host != NULL && port != NULL) {
+ struct addrinfo hints;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = 0;
+ hints.ai_flags = 0;
+
+ struct addrinfo *infos;
+ _syscall(getaddrinfo(host, port, &hints, &infos));
+
+ _assert(infos != NULL); try {
+ for (struct addrinfo *info(infos); info != NULL; info = info->ai_next) {
+ int client(_syscall(socket(info->ai_family, info->ai_socktype, info->ai_protocol))); try {
+ _syscall(connect(client, info->ai_addr, info->ai_addrlen));
+ client_ = client;
+ break;
+ } catch (...) {
+ _syscall(close(client));
+ throw;
+ }
+ }
+ } catch (...) {
+ freeaddrinfo(infos);
+ throw;
+ }
+ }
+
if (script == NULL && tty)
Console(options);
else {
}
}
+ apr_pool_destroy(pool);
+
return 0;
}