shithub: lpa

ref: b69af6813720ca5ca47f267d7e8d832ae0b77172
dir: /systemcmd.c/

View raw version
#include <u.h>
#include <libc.h>
#include <thread.h>
#include <plumb.h>

#include "dat.h"
#include "fns.h"

char *syscmd_off(Session *, char *);
char *syscmd_ed(Session *, char *);

struct {
	char *name;
	char *(*fn)(Session *, char *);
} cmdtab[] = {
	{ "off", syscmd_off },
	{ "ed",	syscmd_ed },
};

void
systemcmd(Session *s, char *cmd, int ctl)
{
	char *out;
	char *parts[2];

	for(vlong i = strlen(cmd)-1; i >= 0; i--){
		if(cmd[i] != ' ')
			break;
		else
			cmd[i] = 0;
	}
	if(getfields(cmd, parts, 2, 1, " \n") == 1)
		parts[1] = "";

	char *(*fn)(Session *, char *) = nil;
	for(int i = 0; i < nelem(cmdtab) && fn == nil; i++)
		if(strcmp(cmdtab[i].name, parts[0]) == 0)
			fn = cmdtab[i].fn;

	if(fn != nil)
		out = fn(s, parts[1]);
	else
		out = smprint("invalid system command: %s", parts[0]);

	if(!ctl && out){
		appendlog(s, out); /* Otherwise do something that makes read from the ctl file get the response... */
		appendlog(s, "\n");
	}
	free(out);
}

char *
syscmd_off(Session *s, char *args)
{
	if(strcmp(args, "") != 0)
		return smprint("unexpected: %s\n", args);

	/* TODO force the lpa script's 'cat cons' to stop. */
	s->active = 0;

	return smprint("bye bye :)");
}

char *
syscmd_ed(Session *s, char *name)
{
	char *resp = nil;
	int fd = plumbopen("send", OWRITE);
	if(fd < 0)
		return smprint("plumb failed: %r");
	trim(name);

	/* create the symbol */
	sym(s->modules->modules[0]->symtab, name); /* TODO: fix this and the line below. Name and module should be parsed.. */

	char *path = smprint("/mnt/lpa/%ulld/modules/main/%s", s->id, name); 
	if(plumbsendtext(fd, "lpa", "edit", "/", path) < 0)
		resp = smprint("plumb failed: %r");
	close(fd);
	free(path);
	return resp;
}