Exemplo n.º 1
0
void set_up_ipv4_socket(const struct options *opt)
{
	struct sockaddr_in serv_addr;
	int ret, one = 1;

	if (opt->tproto == PROTOCOL_TCP) {
		journal("Setting up IPv4 socket over TCP...\n");
		sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	} else {
		journal("Setting up IPv4 socket over UDP...\n");
		sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
	}

	if (sockfd < 0) {
		journal("Unable to create IPv4 socket: %s.\n", strerror(errno));
		cleanup(EXIT_IO, true);
	}

	ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)(&one), sizeof(one));
	if (ret < 0) {
		journal("Unable to set the socket to allow address reuse: %s.\n", strerror(errno));
	}

	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = INADDR_ANY;
	serv_addr.sin_port = htons(opt->port);

	ret = bind(sockfd, (const struct sockaddr *)(&serv_addr), sizeof(struct sockaddr_in));
	if (ret < 0) {
		journal("Unable to bind to IPv4 socket: %s.\n", strerror(errno));
		cleanup(EXIT_IO, true);
	}
}
Exemplo n.º 2
0
void udp_accept_connection(void)
{
	struct sockaddr_in cli_addr;
	socklen_t cli_len;
	char *buffer;
	size_t length;
	int ret;

	journal("Listening for connection...\n");
	ret = recvfrom(sockfd, NULL, 0, 0, (struct sockaddr *)(&cli_addr), &cli_len);
	if (unlikely(ret)) {
		int errsave = errno;
		ERR_TRACE();
		journal("Unable to read from socket: %s.\n", strerror(errsave));
		CHECK_SOCKET_ERROR(errsave);
	}

	cli_len = sizeof(cli_addr);

	ret = get_quote_of_the_day(&buffer, &length);
	if (unlikely(ret)) {
		return;
	}

	ret = sendto(sockfd, buffer, length, 0, (struct sockaddr *)(&cli_addr), cli_len);
	if (unlikely(ret < 0)) {
		ERR_TRACE();
		journal("Unable to write to UDP socket: %s.\n", strerror(errno));
		return;
	}
}
Exemplo n.º 3
0
int main(int argc, char **argv)
{
 if (argc <= 1)
 {
  std::cerr << "usage: " << argv[0] << " <file.joedb>\n";
  return 1;
 }
 else
 {
  joedb::File file(argv[1], joedb::File::mode_t::read_existing);

  if (!file.is_good())
  {
   std::cerr << "error: could not open file: " << argv[1] << '\n';
   return 1;
  }

  joedb::Journal_File journal(file);
  joedb::Dump_Listener dump_listener(std::cout);
  journal.replay_log(dump_listener);

  std::cout << "---> ";
  static const char * status_string[] =
  {
   "no_error",
   "bad_file",
   "unsupported_version",
   "bad_format",
   "crash_check"
  };
  std::cout << status_string[int(journal.get_state())] << '\n';
 }

 return 0;
}
Exemplo n.º 4
0
void
journaln(int out, long n)
{
    char buf[32];
    sprint(buf, sizeof (long) > 4 ? "%ld" : "%d", n);
    journal(out, buf);
}
Exemplo n.º 5
0
Arquivo: mesg.c Projeto: rennis250/sam
void
outstart(Hmesg type)
{
	journal(1, hname[type]);
	outmsg[0] = type;
	outp = outmsg+3;
}
Exemplo n.º 6
0
Akonadi::Item getErrorItem(Kolab::FolderType folderType, const QString &remoteId)
{
    //TODO set title, text and icon
    Akonadi::Item item;
    item.setRemoteId(remoteId);
    switch (folderType) {
    case Kolab::EventType: {
        KCalCore::Event::Ptr event(new KCalCore::Event);
        //FIXME Use message creation date time
        event->setDtStart(KDateTime::currentUtcDateTime());
        event->setSummary(i18n("Corrupt Event"));
        event->setDescription(i18n("Event could not be read. Delete this event to remove it from the server."));
        item.setMimeType(KCalCore::Event::eventMimeType());
        item.setPayload(event);
    }
    break;
    case Kolab::TaskType: {
        KCalCore::Todo::Ptr task(new KCalCore::Todo);
        //FIXME Use message creation date time
        task->setDtStart(KDateTime::currentUtcDateTime());
        task->setSummary(i18n("Corrupt Task"));
        task->setDescription(i18n("Task could not be read. Delete this task to remove it from the server."));
        item.setMimeType(KCalCore::Todo::todoMimeType());
        item.setPayload(task);
    }
    break;
    case Kolab::JournalType: {
        KCalCore::Journal::Ptr journal(new KCalCore::Journal);
        //FIXME Use message creation date time
        journal->setDtStart(KDateTime::currentUtcDateTime());
        journal->setSummary(i18n("Corrupt journal"));
        journal->setDescription(i18n("Journal could not be read. Delete this journal to remove it from the server."));
        item.setMimeType(KCalCore::Journal::journalMimeType());
        item.setPayload(journal);
    }
    break;
    case Kolab::ContactType: {
        KContacts::Addressee addressee;
        addressee.setName(i18n("Corrupt Contact"));
        addressee.setNote(i18n("Contact could not be read. Delete this contact to remove it from the server."));
        item.setMimeType(KContacts::Addressee::mimeType());
        item.setPayload(addressee);
    }
    break;
    case Kolab::NoteType: {
        Akonadi::NoteUtils::NoteMessageWrapper note;
        note.setTitle(i18n("Corrupt Note"));
        note.setText(i18n("Note could not be read. Delete this note to remove it from the server."));
        item.setPayload(Akonadi::NoteUtils::noteMimeType());
        item.setPayload(note.message());
    }
    break;
    case Kolab::MailType:
    //We don't convert mails, so that should never fail.
    default:
        qCWarning(KOLABRESOURCE_LOG) << "unhandled folder type: " << folderType;
    }
    return item;
}
Exemplo n.º 7
0
Arquivo: mesg.c Projeto: rennis250/sam
void
journalv(int out, vlong v)
{
	char buf[32];

	snprint(buf, sizeof buf, "%lld", v);
	journal(out, buf);
}
Exemplo n.º 8
0
Arquivo: mesg.c Projeto: rennis250/sam
void
journaln(int out, long n)
{
	char buf[32];

	snprint(buf, sizeof buf, "%ld", n);
	journal(out, buf);
}
Exemplo n.º 9
0
CJournal::Ptr CJournal::create_from_file ( const std::string & name,
                                           const boost::filesystem::path & file_path )
{
  CJournal::Ptr journal( new CJournal(name) );

  journal->load_journal_file(file_path);

  return journal;
}
Exemplo n.º 10
0
void tcp_accept_connection(void)
{
	struct sockaddr_in cli_addr;
	socklen_t cli_len;
	int consockfd;
	char *buffer;
	size_t length;
	int ret;

	journal("Listening for connection...\n");
	listen(sockfd, TCP_CONNECTION_BACKLOG);

	cli_len = sizeof(cli_addr);
	consockfd = accept(sockfd, (struct sockaddr *)(&cli_addr), &cli_len);
	if (consockfd < 0) {
		int errsave = errno;
		journal("Unable to accept connection: %s.\n", strerror(errsave));
		CHECK_SOCKET_ERROR(errsave);
		return;
	}

	ret = get_quote_of_the_day(&buffer, &length);
	if (unlikely(ret)) {
		return;
	}

	ret = write(consockfd, buffer, length);
	if (unlikely(ret < 0)) {
		ERR_TRACE();
		journal("Unable to wrtie to TCP connection socket: %s.\n", strerror(errno));
		return;
	}

	ret = close(consockfd);
	if (ret) {
		journal("Unable to close connection: %s.\n", strerror(errno));
		return;
	}
}
Exemplo n.º 11
0
void close_socket(void)
{
	int ret;

	if (sockfd < 0) {
		return;
	}

	ret = close(sockfd);
	if (ret) {
		journal("Unable to close socket file descriptor %d: %s.\n",
			sockfd, strerror(errno));
	}
}
Exemplo n.º 12
0
Arquivo: mesg.c Projeto: rennis250/sam
void
outS(String *s)
{
	char *c;
	int i;

	c = Strtoc(s);
	i = strlen(c);
	outcopy(i, c);
	if(i > 99)
		c[99] = 0;
	journaln(1, i);
	journal(1, c);
	free(c);
}
Exemplo n.º 13
0
void set_up_ipv6_socket(const struct options *opt)
{
	struct sockaddr_in6 serv_addr;
	int ret, one = 1;

	if (opt->tproto == PROTOCOL_TCP) {
		journal("Setting up IPv%s6 socket over TCP...\n",
				((opt->iproto == PROTOCOL_BOTH) ? "4/" : ""));
		sockfd = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
	} else {
		journal("Setting up IPv%s6 socket over UDP...\n",
				((opt->iproto == PROTOCOL_BOTH) ? "4/" : ""));
		sockfd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
	}

	if (sockfd < 0) {
		journal("Unable to create IPv6 socket: %s.\n", strerror(errno));
		cleanup(EXIT_IO, true);
	}

	if (opt->iproto == PROTOCOL_IPv6) {
		ret = setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)(&one), sizeof(one));
		if (ret < 0) {
			journal("Unable to set IPv4 compatibility option: %s.\n", strerror(errno));
			cleanup(EXIT_IO, true);
		}
	}

	ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)(&one), sizeof(one));
	if (ret < 0) {
		journal("Unable to set the socket to allow address reuse: %s.\n", strerror(errno));
	}

	serv_addr.sin6_family = AF_INET6;
	serv_addr.sin6_addr = in6addr_any;
	serv_addr.sin6_port = htons(opt->port);
	serv_addr.sin6_flowinfo = 0;
	serv_addr.sin6_scope_id = 0;

	ret = bind(sockfd, (const struct sockaddr *)(&serv_addr), sizeof(struct sockaddr_in6));
	if (ret < 0) {
		journal("Unable to bind to socket: %s.\n", strerror(errno));
		cleanup(EXIT_IO, true);
	}
}
Exemplo n.º 14
0
Arquivo: mesg.c Projeto: rennis250/sam
int
inmesg(Tmesg type)
{
	Rune buf[1025];
	char cbuf[64];
	int i, m;
	short s;
	long l, l1;
	vlong v;
	File *f;
	Posn p0, p1, p;
	Range r;
	String *str;
	char *c, *wdir;
	Rune *rp;
	Plumbmsg *pm;

	if(type > TMAX)
		panic("inmesg");

	journal(0, tname[type]);

	inp = indata;
	switch(type){
	case -1:
		panic("rcv error");

	default:
		fprint(2, "unknown type %d\n", type);
		panic("rcv unknown");

	case Tversion:
		tversion = inshort();
		journaln(0, tversion);
		break;

	case Tstartcmdfile:
		v = invlong();		/* for 64-bit pointers */
		journaln(0, v);
		Strdupl(&genstr, samname);
		cmd = newfile();
		cmd->unread = 0;
		outTsv(Hbindname, cmd->tag, v);
		outTs(Hcurrent, cmd->tag);
		logsetname(cmd, &genstr);
		cmd->rasp = listalloc('P');
		cmd->mod = 0;
		if(cmdstr.n){
			loginsert(cmd, 0L, cmdstr.s, cmdstr.n);
			Strdelete(&cmdstr, 0L, (Posn)cmdstr.n);
		}
		fileupdate(cmd, FALSE, TRUE);
		outT0(Hunlock);
		break;

	case Tcheck:
		/* go through whichfile to check the tag */
		outTs(Hcheck, whichfile(inshort())->tag);
		break;

	case Trequest:
		f = whichfile(inshort());
		p0 = inlong();
		p1 = p0+inshort();
		journaln(0, p0);
		journaln(0, p1-p0);
		if(f->unread)
			panic("Trequest: unread");
		if(p1>f->b.nc)
			p1 = f->b.nc;
		if(p0>f->b.nc) /* can happen e.g. scrolling during command */
			p0 = f->b.nc;
		if(p0 == p1){
			i = 0;
			r.p1 = r.p2 = p0;
		}else{
			r = rdata(f->rasp, p0, p1-p0);
			i = r.p2-r.p1;
			bufread(&f->b, r.p1, buf, i);
		}
		buf[i]=0;
		outTslS(Hdata, f->tag, r.p1, tmprstr(buf, i+1));
		break;

	case Torigin:
		s = inshort();
		l = inlong();
		l1 = inlong();
		journaln(0, l1);
		lookorigin(whichfile(s), l, l1);
		break;

	case Tstartfile:
		termlocked++;
		f = whichfile(inshort());
		if(!f->rasp)	/* this might be a duplicate message */
			f->rasp = listalloc('P');
		current(f);
		outTsv(Hbindname, f->tag, invlong());	/* for 64-bit pointers */
		outTs(Hcurrent, f->tag);
		journaln(0, f->tag);
		if(f->unread)
			load(f);
		else{
			if(f->b.nc>0){
				rgrow(f->rasp, 0L, f->b.nc);
				outTsll(Hgrow, f->tag, 0L, f->b.nc);
			}
			outTs(Hcheck0, f->tag);
			moveto(f, f->dot.r);
		}
		break;

	case Tworkfile:
		i = inshort();
		f = whichfile(i);
		current(f);
		f->dot.r.p1 = inlong();
		f->dot.r.p2 = inlong();
		f->tdot = f->dot.r;
		journaln(0, i);
		journaln(0, f->dot.r.p1);
		journaln(0, f->dot.r.p2);
		break;

	case Ttype:
		f = whichfile(inshort());
		p0 = inlong();
		journaln(0, p0);
		journal(0, (char*)inp);
		str = tmpcstr((char*)inp);
		i = str->n;
		loginsert(f, p0, str->s, str->n);
		if(fileupdate(f, FALSE, FALSE))
			seq++;
		if(f==cmd && p0==f->b.nc-i && i>0 && str->s[i-1]=='\n'){
			freetmpstr(str);
			termlocked++;
			termcommand();
		}else
			freetmpstr(str);
		f->dot.r.p1 = f->dot.r.p2 = p0+i; /* terminal knows this already */
		f->tdot = f->dot.r;
		break;

	case Tcut:
		f = whichfile(inshort());
		p0 = inlong();
		p1 = inlong();
		journaln(0, p0);
		journaln(0, p1);
		logdelete(f, p0, p1);
		if(fileupdate(f, FALSE, FALSE))
			seq++;
		f->dot.r.p1 = f->dot.r.p2 = p0;
		f->tdot = f->dot.r;   /* terminal knows the value of dot already */
		break;

	case Tpaste:
		f = whichfile(inshort());
		p0 = inlong();
		journaln(0, p0);
		for(l=0; l<snarfbuf.nc; l+=m){
			m = snarfbuf.nc-l;
			if(m>BLOCKSIZE)
				m = BLOCKSIZE;
			bufread(&snarfbuf, l, genbuf, m);
			loginsert(f, p0, tmprstr(genbuf, m)->s, m);
		}
		if(fileupdate(f, FALSE, TRUE))
			seq++;
		f->dot.r.p1 = p0;
		f->dot.r.p2 = p0+snarfbuf.nc;
		f->tdot.p1 = -1; /* force telldot to tell (arguably a BUG) */
		telldot(f);
		outTs(Hunlockfile, f->tag);
		break;

	case Tsnarf:
		i = inshort();
		p0 = inlong();
		p1 = inlong();
		snarf(whichfile(i), p0, p1, &snarfbuf, 0);
		break;

	case Tstartnewfile:
		v = invlong();
		Strdupl(&genstr, empty);
		f = newfile();
		f->rasp = listalloc('P');
		outTsv(Hbindname, f->tag, v);
		logsetname(f, &genstr);
		outTs(Hcurrent, f->tag);
		current(f);
		load(f);
		break;

	case Twrite:
		termlocked++;
		i = inshort();
		journaln(0, i);
		f = whichfile(i);
		addr.r.p1 = 0;
		addr.r.p2 = f->b.nc;
		if(f->name.s[0] == 0)
			error(Enoname);
		Strduplstr(&genstr, &f->name);
		writef(f);
		break;

	case Tclose:
		termlocked++;
		i = inshort();
		journaln(0, i);
		f = whichfile(i);
		current(f);
		trytoclose(f);
		/* if trytoclose fails, will error out */
		delete(f);
		break;

	case Tlook:
		f = whichfile(inshort());
		termlocked++;
		p0 = inlong();
		p1 = inlong();
		journaln(0, p0);
		journaln(0, p1);
		setgenstr(f, p0, p1);
		for(l = 0; l<genstr.n; l++){
			i = genstr.s[l];
			if(utfrune(".*+?(|)\\[]^$", i)){
				str = tmpcstr("\\");
				Strinsert(&genstr, str, l++);
				freetmpstr(str);
			}
		}
		Straddc(&genstr, '\0');
		nextmatch(f, &genstr, p1, 1);
		moveto(f, sel.p[0]);
		break;

	case Tsearch:
		termlocked++;
		if(curfile == 0)
			error(Enofile);
		if(lastpat.s[0] == 0)
			panic("Tsearch");
		nextmatch(curfile, &lastpat, curfile->dot.r.p2, 1);
		moveto(curfile, sel.p[0]);
		break;

	case Tsend:
		termlocked++;
		inshort();	/* ignored */
		p0 = inlong();
		p1 = inlong();
		setgenstr(cmd, p0, p1);
		bufreset(&snarfbuf);
		bufinsert(&snarfbuf, (Posn)0, genstr.s, genstr.n);
		outTl(Hsnarflen, genstr.n);
		if(genstr.s[genstr.n-1] != '\n')
			Straddc(&genstr, '\n');
		loginsert(cmd, cmd->b.nc, genstr.s, genstr.n);
		fileupdate(cmd, FALSE, TRUE);
		cmd->dot.r.p1 = cmd->dot.r.p2 = cmd->b.nc;
		telldot(cmd);
		termcommand();
		break;

	case Tdclick:
		f = whichfile(inshort());
		p1 = inlong();
		doubleclick(f, p1);
		f->tdot.p1 = f->tdot.p2 = p1;
		telldot(f);
		outTs(Hunlockfile, f->tag);
		break;

	case Tstartsnarf:
		if (snarfbuf.nc <= 0) {	/* nothing to export */
			outTs(Hsetsnarf, 0);
			break;
		}
		c = 0;
		i = 0;
		m = snarfbuf.nc;
		if(m > SNARFSIZE) {
			m = SNARFSIZE;
			dprint("?warning: snarf buffer truncated\n");
		}
		rp = malloc(m*sizeof(Rune));
		if(rp){
			bufread(&snarfbuf, 0, rp, m);
			c = Strtoc(tmprstr(rp, m));
			free(rp);
			i = strlen(c);
		}
		outTs(Hsetsnarf, i);
		if(c){
			Write(1, c, i);
			free(c);
		} else
			dprint("snarf buffer too long\n");
		break;

	case Tsetsnarf:
		m = inshort();
		if(m > SNARFSIZE)
			error(Etoolong);
		c = malloc(m+1);
		if(c){
			for(i=0; i<m; i++)
				c[i] = rcvchar();
			c[m] = 0;
			str = tmpcstr(c);
			free(c);
			bufreset(&snarfbuf);
			bufinsert(&snarfbuf, (Posn)0, str->s, str->n);
			freetmpstr(str);
			outT0(Hunlock);
		}
		break;

	case Tack:
		waitack = 0;
		break;

	case Tplumb:
		f = whichfile(inshort());
		p0 = inlong();
		p1 = inlong();
		pm = emalloc(sizeof(Plumbmsg));
		pm->src = strdup("sam");
		pm->dst = 0;
		/* construct current directory */
		c = Strtoc(&f->name);
		if(c[0] == '/')
			pm->wdir = c;
		else{
			wdir = emalloc(1024);
			getwd(wdir, 1024);
			pm->wdir = emalloc(1024);
			snprint(pm->wdir, 1024, "%s/%s", wdir, c);
			cleanname(pm->wdir);
			free(wdir);
			free(c);
		}
		c = strrchr(pm->wdir, '/');
		if(c)
			*c = '\0';
		pm->type = strdup("text");
		if(p1 > p0)
			pm->attr = nil;
		else{
			p = p0;
			while(p0>0 && (i=filereadc(f, p0 - 1))!=' ' && i!='\t' && i!='\n')
				p0--;
			while(p1<f->b.nc && (i=filereadc(f, p1))!=' ' && i!='\t' && i!='\n')
				p1++;
			sprint(cbuf, "click=%ld", p-p0);
			pm->attr = plumbunpackattr(cbuf);
		}
		if(p0==p1 || p1-p0>=BLOCKSIZE){
			plumbfree(pm);
			break;
		}
		setgenstr(f, p0, p1);
		pm->data = Strtoc(&genstr);
		pm->ndata = strlen(pm->data);
		c = plumbpack(pm, &i);
		if(c != 0){
			outTs(Hplumb, i);
			Write(1, c, i);
			free(c);
		}
		plumbfree(pm);
		break;

	case Texit:
		exits(0);
	}
	return TRUE;
}
Exemplo n.º 15
0
Arquivo: dur.cpp Projeto: jit/mongo
 static void WRITETOJOURNAL(const AlignedBuilder& bb) { 
     journal(bb);
 }
Exemplo n.º 16
0
int
inmesg(Tmesg type)
{
    Rune buf[1025];
    int i, m;
    short s;
    long l, l1;
    File *f;
    Posn p0, p1;
    Range r;
    String *str;
    char *c;
    Rune *rp;

    if(type > TMAX)
        panic("inmesg");

    journal(0, tname[type]);

    inp = indata;
    switch(type) {
    case -1:
        panic("rcv error");

    default:
        fprint(2, "unknown type %d\n", type);
        panic("rcv unknown");

    case Tversion:
        tversion = inshort();
        journaln(0, tversion);
        break;

    case Tstartcmdfile:
        l = invlong();		/* for 64-bit pointers */
        journaln(0, l);
        Strdupl(&genstr, samname);
        cmd = newfile();
        outTsv(Hbindname, cmd->tag, l);
        outTs(Hcurrent, cmd->tag);
        Fsetname(cmd, &genstr);
        cmd->rasp = emalloc(sizeof(List));
        cmd->state = Clean;
        if(cmdstr.n) {
            Finsert(cmd, &cmdstr, 0L);
            Strdelete(&cmdstr, 0L, (Posn)cmdstr.n);
        }
        Fupdate(cmd, FALSE, TRUE);
        outT0(Hunlock);
        break;

    case Tcheck:
        /* go through whichfile to check the tag */
        outTs(Hcheck, whichfile(inshort())->tag);
        break;

    case Trequest:
        f = whichfile(inshort());
        p0 = inlong();
        p1 = p0+inshort();
        journaln(0, p0);
        journaln(0, p1-p0);
        if(f->state == Unread)
            panic("Trequest: unread");
        if(p1>f->nrunes)
            p1 = f->nrunes;
        if(p0>f->nrunes) /* can happen e.g. scrolling during command */
            p0 = f->nrunes;
        if(p0 == p1) {
            i = 0;
            r.p1 = r.p2 = p0;
        } else {
            r = rdata(f->rasp, p0, p1-p0);
            i = r.p2-r.p1;
            if(Fchars(f, buf, r.p1, r.p2)!=i)
                panic("Trequest 2");
        }
        buf[i]=0;
        outTslS(Hdata, f->tag, r.p1, tmprstr(buf, i+1));
        break;

    case Torigin:
        s = inshort();
        l = inlong();
        l1 = inlong();
        journaln(0, l1);
        lookorigin(whichfile(s), l, l1);
        break;

    case Tstartfile:
        termlocked++;
        f = whichfile(inshort());
        if(!f->rasp)	/* this might be a duplicate message */
            f->rasp = emalloc(sizeof(List));
        current(f);
        outTsv(Hbindname, f->tag, invlong());	/* for 64-bit pointers */
        outTs(Hcurrent, f->tag);
        journaln(0, f->tag);
        if(f->state == Unread)
            load(f);
        else {
            if(f->nrunes>0) {
                rgrow(f->rasp, 0L, f->nrunes);
                outTsll(Hgrow, f->tag, 0L, f->nrunes);
            }
            outTs(Hcheck0, f->tag);
            moveto(f, f->dot.r);
        }
        break;

    case Tworkfile:
        i = inshort();
        f = whichfile(i);
        current(f);
        f->dot.r.p1 = inlong();
        f->dot.r.p2 = inlong();
        f->tdot = f->dot.r;
        journaln(0, i);
        journaln(0, f->dot.r.p1);
        journaln(0, f->dot.r.p2);
        break;

    case Ttype:
        f = whichfile(inshort());
        p0 = inlong();
        journaln(0, p0);
        journal(0, (char*)inp);
        str = tmpcstr((char*)inp);
        i = str->n;
        Finsert(f, str, p0);
        if(Fupdate(f, FALSE, FALSE))
            modnum++;
        if(f==cmd && p0==f->nrunes-i && i>0 && str->s[i-1]=='\n') {
            freetmpstr(str);
            termlocked++;
            termcommand();
        } else
            freetmpstr(str);
        f->dot.r.p1 = f->dot.r.p2 = p0+i; /* terminal knows this already */
        f->tdot = f->dot.r;
        break;

    case Tcut:
        f = whichfile(inshort());
        p0 = inlong();
        p1 = inlong();
        journaln(0, p0);
        journaln(0, p1);
        Fdelete(f, p0, p1);
        if(Fupdate(f, FALSE, FALSE))
            modnum++;
        f->dot.r.p1 = f->dot.r.p2 = p0;
        f->tdot = f->dot.r;   /* terminal knows the value of dot already */
        break;

    case Tpaste:
        f = whichfile(inshort());
        p0 = inlong();
        journaln(0, p0);
        for(l=0; l<snarfbuf->nrunes; l+=m) {
            m = snarfbuf->nrunes-l;
            if(m>BLOCKSIZE)
                m = BLOCKSIZE;
            Bread(snarfbuf, genbuf, m, l);
            Finsert(f, tmprstr(genbuf, m), p0);
        }
        if(Fupdate(f, FALSE, TRUE))
            modnum++;
        f->dot.r.p1 = p0;
        f->dot.r.p2 = p0+snarfbuf->nrunes;
        f->tdot.p1 = -1; /* force telldot to tell (arguably a BUG) */
        telldot(f);
        outTs(Hunlockfile, f->tag);
        break;

    case Tsnarf:
        i = inshort();
        p0 = inlong();
        p1 = inlong();
        snarf(whichfile(i), p0, p1, snarfbuf, 0);
        break;

    case Tstartnewfile:
        l = invlong();
        Strdupl(&genstr, empty);
        f = newfile();
        f->rasp = emalloc(sizeof(List));
        outTsv(Hbindname, f->tag, l);
        Fsetname(f, &genstr);
        outTs(Hcurrent, f->tag);
        current(f);
        load(f);
        break;

    case Twrite:
        termlocked++;
        i = inshort();
        journaln(0, i);
        f = whichfile(i);
        addr.r.p1 = 0;
        addr.r.p2 = f->nrunes;
        if(f->name.s[0] == 0)
            error(Enoname);
        Strduplstr(&genstr, &f->name);
        writef(f);
        break;

    case Tclose:
        termlocked++;
        i = inshort();
        journaln(0, i);
        f = whichfile(i);
        current(f);
        trytoclose(f);
        /* if trytoclose fails, will error out */
        delete(f);
        break;

    case Tlook:
        f = whichfile(inshort());
        termlocked++;
        p0 = inlong();
        p1 = inlong();
        journaln(0, p0);
        journaln(0, p1);
        setgenstr(f, p0, p1);
        for(l = 0; l<genstr.n; l++) {
            i = genstr.s[l];
            if(utfrune(".*+?(|)\\[]^$", i))
                Strinsert(&genstr, tmpcstr("\\"), l++);
        }
        Straddc(&genstr, '\0');
        nextmatch(f, &genstr, p1, 1);
        moveto(f, sel.p[0]);
        break;

    case Tsearch:
        termlocked++;
        if(curfile == 0)
            error(Enofile);
        if(lastpat.s[0] == 0)
            panic("Tsearch");
        nextmatch(curfile, &lastpat, curfile->dot.r.p2, 1);
        moveto(curfile, sel.p[0]);
        break;

    case Tsend:
        termlocked++;
        inshort();	/* ignored */
        p0 = inlong();
        p1 = inlong();
        setgenstr(cmd, p0, p1);
        Bdelete(snarfbuf, (Posn)0, snarfbuf->nrunes);
        Binsert(snarfbuf, &genstr, (Posn)0);
        outTl(Hsnarflen, genstr.n);
        if(genstr.s[genstr.n-1] != '\n')
            Straddc(&genstr, '\n');
        Finsert(cmd, &genstr, cmd->nrunes);
        Fupdate(cmd, FALSE, TRUE);
        cmd->dot.r.p1 = cmd->dot.r.p2 = cmd->nrunes;
        telldot(cmd);
        termcommand();
        break;

    case Tdclick:
        f = whichfile(inshort());
        p1 = inlong();
        doubleclick(f, p1);
        f->tdot.p1 = f->tdot.p2 = p1;
        telldot(f);
        outTs(Hunlockfile, f->tag);
        break;

    case Tstartsnarf:
        if (snarfbuf->nrunes <= 0) {	/* nothing to export */
            outTs(Hsetsnarf, 0);
            break;
        }
        c = 0;
        i = 0;
        m = snarfbuf->nrunes;
        if(m > 32000) {		/* tmprstr stores len in a short */
            m = 32000;
            dprint("?warning: snarf buffer truncated\n");
        }
        rp = malloc(m*sizeof(Rune));
        if(rp) {
            Bread(snarfbuf, rp, m, 0);
            c = Strtoc(tmprstr(rp, m));
            free(rp);
            i = strlen(c);
        }
        outTs(Hsetsnarf, i);
        if(c) {
            Write(1, c, i);
            free(c);
        } else
            dprint("snarf buffer too long\n");
        break;

    case Tsetsnarf:
        m = inshort();
        if(m > SNARFSIZE)
            error(Etoolong);
        c = malloc(m+1);
        if(c) {
            for(i=0; i<m; i++)
                c[i] = rcvchar();
            c[m] = 0;
            str = tmpcstr(c);
            free(c);
            Bdelete(snarfbuf, (Posn)0, snarfbuf->nrunes);
            Binsert(snarfbuf, str, (Posn)0);
            freetmpstr(str);
            outT0(Hunlock);
        }
        break;

    case Tack:
        waitack = 0;
        break;

    case Texit:
        exits(0);
    }
    return TRUE;
}
Exemplo n.º 17
0
int 
dsa_control (Attr_Sequence as, struct DSError *error, DN dn)
{
	char * str;
	DN dn2;
	Entry theentry;
	extern Entry database_root;
	SFD attempt_restart();

	if ( ! manager(dn) ) {
		error->dse_type = DSE_SECURITYERROR;
		error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
		return (DS_ERROR_REMOTE);
	}

	str = (char *) as->attr_value->avseq_av.av_struct;

#ifndef NO_STATS
	LLOG (log_stat,LLOG_NOTICE,("DSA control: %s",str));
#endif

	switch (*str) {
	case 'd':	/* -dump <directory> */
		str = SkipSpace (++str);
		/*
				directory_dump (str, database_root);
		*/
		return (DS_OK);
	case 't':	/* -tailor <string> */
		str = SkipSpace (++str);
		if (dsa_tai_string (str) == OK) {
			isodexport (NULLCP);
			return (DS_OK);
		}
		break;
	case 'a':	/* -abort */
		LLOG (log_dsap,LLOG_FATAL,("*** abort signal ***"));
		dsa_abort(-1);
		exit(0);
	case 'b':	/* -restart */
		LLOG (log_dsap,LLOG_FATAL,("*** restart signal ***"));
		attempt_restart (NOTOK);
		exit(0);		/* should not be reached */
	case 'r':	/* -refresh <entry> */
		str = SkipSpace (++str);
		if (lexequ (str,"root") == 0)
			dn2= NULLDN;
		else if ((dn2 = str2dn (str)) == NULLDN)
			break;

		if (refresh_from_disk (dn2) == OK)
			return (DS_OK);
		break;
	case 'f':	/* -resync <entry> */
		str = SkipSpace (++str);
		if (lexequ (str,"root") == 0)
			dn2= NULLDN;
		else if ((dn2 = str2dn (str)) == NULLDN)
			break;

		if ((theentry = local_find_entry (dn2,FALSE)) != NULLENTRY)
#ifdef TURBO_DISK
		{
			Entry akid = (Entry) avl_getone(theentry->e_children);
			if (turbo_writeall (akid) == OK)
				return (DS_OK);
		}
#else
		{
			Entry akid = (Entry) avl_getone(theentry->e_children);
			if (journal (akid) == OK)
				return (DS_OK);
		}
#endif
		break;
	case 'l':	/* -lock <entry> */
		str = SkipSpace (++str);
		if (lexequ (str,"root") == 0)
			dn2 = NULLDN;
		else if ((dn2 = str2dn (str)) == NULLDN)
			break;

		if ((theentry = local_find_entry (dn2,FALSE)) != NULLENTRY) {
			theentry->e_lock = TRUE;
			return (DS_OK);
		}
		break;
	case 'u':	/* -unlock <entry> */
		str = SkipSpace (++str);
		if (lexequ (str,"root") == 0)
			dn2 = NULLDN;
		else if ((dn2 = str2dn (str)) == NULLDN)
			break;

		if ((theentry = local_find_entry (dn2,FALSE)) != NULLENTRY) {
			theentry->e_lock = FALSE;
			return (DS_OK);
		}
		break;
	case 's':	/* -slave */
		/*
		 * When we go async return of OK will mean that a getedb
		 * operation has been scheduled, NOT that it has succeeded.
		 */
		str = SkipSpace (++str);
		if (*str == NULL) {
			slave_update();
			return DS_OK;
		}

		if (lexequ (str, "shadow") == 0) {
			shadow_update();
			return DS_OK;
		}

		if (lexequ (str, "root") == 0)
			dn2 = NULLDN;
		else if ((dn2 = str2dn (str)) == NULLDN)
			break;

		if (update_aux (dn2, dn2 == NULLDN) == OK)
			return DS_OK;
		break;
	default:
		break;
	}

	error->dse_type = DSE_SERVICEERROR;
	error->ERR_SERVICE.DSE_sv_problem = DSE_SV_UNWILLINGTOPERFORM;
	return (DS_ERROR_REMOTE);
}
Exemplo n.º 18
0
int 
new_dsa_control (Attr_Sequence as, struct DSError *error, DN dn)
{
	struct dsa_control * item ;
	char * tmp_ptr ;
	DN dn2;
	Entry theentry;
	extern Entry database_root;
	SFD attempt_restart();

	/* Return some silly error to distinguish it from the other dsa_control */
	if ( ! manager(dn) ) {
		error->dse_type = DSE_SECURITYERROR ;
		error->ERR_SECURITY.DSE_sc_problem = DSE_SC_PROTECTIONREQUIRED ;
		return (DS_ERROR_REMOTE) ;
	}

	item = (struct dsa_control *) as->attr_value->avseq_av.av_struct ;

	switch (item->dsa_control_option) {
	case (CONTROL_CHANGETAILOR) : {	/* -tailor <string> */
		tmp_ptr = qb2str(item->un.changeTailor) ;
		if (dsa_tai_string (tmp_ptr) == OK) {
			isodexport (NULLCP);
			return (DS_OK);
		}
		break;
	}
	case(CONTROL_STOPDSA): {	/* -abort */
		LLOG(log_dsap,LLOG_FATAL,("*** abort signal ***")) ;
		stop_listeners() ;
		exit(0) ;
	}
	case (CONTROL_REFRESH): {	/* -refresh <entry> */
		if (item->un.refresh->offset == DN_PRESENT)
			if (refresh_from_disk (item->un.refresh->un.selectedDN) == OK)
				return (DS_OK);
		break;
	}
	case(CONTROL_RESYNCH): {	/* -resync <entry> */
		if (item->un.resynch->offset == DN_PRESENT)
			dn2 = item->un.resynch->un.selectedDN ;
		else
			break ;

		if ((theentry = local_find_entry (dn2, FALSE)) != NULLENTRY)
#ifdef TURBO_DISK
		{
			Entry akid = (Entry) avl_getone(theentry->e_children);
			if (turbo_writeall (akid) == OK)
				return (DS_OK);
		}
#else
		{
			Entry akid = (Entry) avl_getone(theentry->e_children);
			if (journal (akid) == OK)
				return (DS_OK);
		}
#endif
		break;
	}
	case (CONTROL_LOCKDSA): {	/* -lock <entry> */
		if (item->un.resynch->offset == DN_PRESENT)
			dn2 = item->un.resynch->un.selectedDN ;
		else
			break ;

		if ((theentry = local_find_entry (dn2,FALSE)) != NULLENTRY) {
			theentry->e_lock = TRUE;
			return (DS_OK);
		}
		break;
	}
	case (CONTROL_UNLOCK): {	/* -unlock <entry> */
		if (item->un.resynch->offset == DN_PRESENT)
			dn2 = item->un.resynch->un.selectedDN ;
		else
			break ;

		if ((theentry = local_find_entry (dn2,FALSE)) != NULLENTRY) {
			theentry->e_lock = FALSE;
			return (DS_OK);
		}
		break;
	}
	case (CONTROL_SETLOGLEVEL): {	/* Set the Logging Level */
		tmp_ptr = qb2str(item->un.setLogLevel) ;
		/* What kind of stuff is needed here?!! */
		return (DS_OK);
		break;
	}
	case (CONTROL_UPDATESLAVEEDBS): {	/* -slave */
		/*
		 * When we go async return of OK will mean that a getedb
		 * operation has been scheduled, NOT that it has succeeded.
		 */
		tmp_ptr = qb2str(item->un.updateSlaveEDBs) ;

		if (lexequ (tmp_ptr, "all") == 0) {
			slave_update();
			return DS_OK;
		}

		if (lexequ (tmp_ptr, "shadow") == 0) {
			shadow_update();
			return DS_OK;
		}

		if (lexequ (tmp_ptr, "root") == 0) {
			dn2 = NULLDN;
		} else {
			if ((dn2 = str2dn (tmp_ptr)) == NULLDN)
				break;
		}

		if (update_aux (dn2, dn2 == NULLDN) == OK)
			return DS_OK;
		break;
	}
	default:
		break;
	}

	error->dse_type = DSE_SERVICEERROR;
	error->ERR_SERVICE.DSE_sv_problem = DSE_SV_UNWILLINGTOPERFORM;
	return (DS_ERROR_REMOTE);
}
Exemplo n.º 19
0
void handle_menu_choice(eMenu item_hit) {
	std::string dialogToShow;
	sf::Event dummyEvent = {sf::Event::KeyPressed};
	short i, choice;
	
	switch(item_hit) {
		case eMenu::NONE: break;
		case eMenu::FILE_OPEN:
			do_load();
			break;
		case eMenu::FILE_SAVE:
			do_save(0);
			break;
		case eMenu::FILE_SAVE_AS:
			do_save(1);
			break;
		case eMenu::FILE_NEW:
			if(overall_mode != MODE_STARTUP) {
				std::string choice = cChoiceDlog("restart-game",{"okay","cancel"}).show();
				if(choice == "cancel")
					return;
				for(i = 0; i < 6; i++)
					univ.party[i].main_status = eMainStatus::ABSENT;
				party_in_memory = false;
				reload_startup();
				overall_mode = MODE_STARTUP;
				draw_startup(0);
			}
			start_new_game();
			draw_startup(0);
			menu_activate();
			break;
		case eMenu::FILE_ABORT:
			if(overall_mode != MODE_STARTUP) {
				std::string choice = cChoiceDlog("abort-game",{"okay","cancel"}).show();
				if (choice=="cancel") return;
				reload_startup();
				overall_mode = MODE_STARTUP;
			}
			party_in_memory = false;
			draw_startup(0);
			menu_activate();
			break;
		case eMenu::PREFS:
			pick_preferences();
			break;
		case eMenu::QUIT:
			if(overall_mode == MODE_STARTUP) {
				if(party_in_memory) {
					std::string choice = cChoiceDlog("quit-confirm-save", {"save","quit","cancel"}).show();
					if(choice == "cancel") break;
					if(choice == "save") {
						fs::path file = nav_put_party();
						if(!file.empty()) break;
						save_party(file, univ);
					}
				}
				All_Done = true;
				break;
			}
			if(overall_mode > MODE_TOWN) {
				std::string choice = cChoiceDlog("quit-confirm-nosave",{"quit","cancel"}).show();
				if(choice == "cancel")
					return;
			}
			else {
				std::string choice = cChoiceDlog("quit-confirm-save",{"quit","save","cancel"}).show();
				if(choice == "cancel")
					break;
				if(choice == "save") {
					if(univ.file.empty()) {
						univ.file = nav_put_party();
						if(univ.file.empty()) break;
					}
					save_party(univ.file, univ);
				}
			}
			All_Done = true;
			break;
		case eMenu::OPTIONS_PC_GRAPHIC:
			choice = char_select_pc(1,"New graphic for who?");
			if(choice < 6)
				pick_pc_graphic(choice,1,nullptr);
			draw_terrain();
			break;
			
		case eMenu::OPTIONS_DELETE_PC:
			if(!prime_time()) {
				ASB("Finish what you're doing first.");
				print_buf();
			}
			else {
				choice = char_select_pc(1,"Delete who?");
				if(choice < 6) {
					std::string confirm = cChoiceDlog("delete-pc-confirm",{"yes","no"}).show();
					if(confirm == "yes")
						kill_pc(univ.party[choice],eMainStatus::ABSENT);
				}
				draw_terrain();
			}
			break;
			
			
		case eMenu::OPTIONS_RENAME_PC:
			choice = char_select_pc(1,"Rename who?");
			if(choice < 6)
				pick_pc_name(choice,nullptr);
			put_pc_screen();
			put_item_screen(stat_window);
			break;
			
			
		case eMenu::OPTIONS_NEW_PC:
			if(!(is_town())) {
				add_string_to_buf("Add PC: Town mode only.");
				print_buf();
				break;
			}
			for(i = 0; i < 6; i++)
				if(univ.party[i].main_status == eMainStatus::ABSENT)
					i = 20;
			if(i == 6) {
				ASB("Add PC: You already have 6 PCs.");
				print_buf();
				break;
			}
			if(univ.town->has_tavern) {
				give_help(56,0);
				create_pc(6,nullptr);
			} else {
				add_string_to_buf("Add PC: You cannot add new characters in this town. Try in the town you started in.", 2);
			}
			print_buf();
			put_pc_screen();
			put_item_screen(stat_window);
			break;
			
		case eMenu::OPTIONS_JOURNAL:
			journal();
			break;
		case eMenu::OPTIONS_TALK_NOTES:
			if(overall_mode == MODE_TALKING) {
				ASB("Talking notes: Can't read while talking.");
				print_buf();
				return;
			}
			talk_notes();
			break;
		case eMenu::OPTIONS_ENCOUNTER_NOTES:
			adventure_notes();
			break;
		case eMenu::OPTIONS_STATS:
			if(overall_mode != MODE_STARTUP)
				print_party_stats();
			break;
		case eMenu::HELP_OUT:
			dialogToShow = "help-outdoor";
			break;
		case eMenu::HELP_TOWN:
			dialogToShow = "help-town";
			break;
		case eMenu::HELP_COMBAT:
			dialogToShow = "help-combat";
			break;
		case eMenu::HELP_BARRIER:
			dialogToShow = "help-fields";
			break;
		case eMenu::HELP_HINTS:
			dialogToShow = "help-hints";
			break;
		case eMenu::HELP_SPELLS:
			dialogToShow = "help-magic";
			break;
		case eMenu::ABOUT:
			dialogToShow = "about-boe";
			break;
		case eMenu::LIBRARY_MAGE:
			display_spells(eSkill::MAGE_SPELLS,100,0);
			break;
		case eMenu::LIBRARY_PRIEST:
			display_spells(eSkill::PRIEST_SPELLS,100,0);
			break;
		case eMenu::LIBRARY_SKILLS:
			display_skills(eSkill::INVALID,0);
			break;
		case eMenu::LIBRARY_ALCHEMY:
			// TODO: Create a dedicated dialog for alchemy info
			display_alchemy();
			break;
		case eMenu::LIBRARY_TIPS:
			tip_of_day();
			break;
		case eMenu::LIBRARY_INTRO:
			dialogToShow = "welcome";
			break;
		case eMenu::ACTIONS_ALCHEMY:
			dummyEvent.key.code = sf::Keyboard::A;
			dummyEvent.key.shift = true;
			handle_keystroke(dummyEvent);
			break;
		case eMenu::ACTIONS_WAIT:
			dummyEvent.key.code = sf::Keyboard::W;
			handle_keystroke(dummyEvent);
			break;
		case eMenu::ACTIONS_AUTOMAP:
			if(!prime_time()) {
				ASB("Finish what you're doing first.");
				print_buf();
			}
			else {
				give_help(62,0);
				display_map();
			}
			make_cursor_sword();
			break;
		case eMenu::HELP_TOC:
			if(fs::is_directory(progDir/"doc"))
				launchURL("file://" + (progDir/"doc/game/Contents.html").string());
			else launchURL("https://blades.calref.net/doc/game/Contents.html");
			break;
		case eMenu::ABOUT_MAGE:
		case eMenu::ABOUT_PRIEST:
			give_help(209,0);
			break;
		case eMenu::ABOUT_MONSTERS:
			give_help(212,0);
			break;
	}
	if(!dialogToShow.empty()) {
		cChoiceDlog dlog(dialogToShow);
		dlog.show();
	}
}
Exemplo n.º 20
0
Handoff
OverlayImpl::onHandoff (std::unique_ptr <beast::asio::ssl_bundle>&& ssl_bundle,
    beast::http::message&& request,
        endpoint_type remote_endpoint)
{
    auto const id = next_id_++;
    beast::WrappedSink sink (deprecatedLogs()["Peer"], makePrefix(id));
    beast::Journal journal (sink);

    Handoff handoff;
    if (processRequest(request, handoff))
        return handoff;
    if (! isPeerUpgrade(request))
        return handoff;

    handoff.moved = true;

    if (journal.trace) journal.trace <<
        "Peer connection upgrade from " << remote_endpoint;

    error_code ec;
    auto const local_endpoint (ssl_bundle->socket.local_endpoint(ec));
    if (ec)
    {
        if (journal.trace) journal.trace <<
            remote_endpoint << " failed: " << ec.message();
        return handoff;
    }

    auto consumer = m_resourceManager.newInboundEndpoint(
        beast::IPAddressConversion::from_asio(remote_endpoint));
    if (consumer.disconnect())
        return handoff;

    auto const slot = m_peerFinder->new_inbound_slot (
        beast::IPAddressConversion::from_asio(local_endpoint),
            beast::IPAddressConversion::from_asio(remote_endpoint));

    if (slot == nullptr)
    {
        // self-connect, close
        handoff.moved = false;
        return handoff;
    }

    // TODO Validate HTTP request

    {
        auto const types = beast::rfc2616::split_commas(
            request.headers["Connect-As"]);
        if (std::find_if(types.begin(), types.end(),
                [](std::string const& s)
                {
                    return beast::ci_equal(s, "peer");
                }) == types.end())
        {
            handoff.moved = false;
            handoff.response = makeRedirectResponse(slot, request,
                remote_endpoint.address());
            handoff.keep_alive = request.keep_alive();
            return handoff;
        }
    }

    handoff.moved = true;
    bool success = true;

    protocol::TMHello hello;
    std::tie(hello, success) = parseHello (request, journal);
    if(! success)
        return handoff;

    uint256 sharedValue;
    std::tie(sharedValue, success) = makeSharedValue(
        ssl_bundle->stream.native_handle(), journal);
    if(! success)
        return handoff;

    RippleAddress publicKey;
    std::tie(publicKey, success) = verifyHello (hello,
        sharedValue, journal, getApp());
    if(! success)
        return handoff;

    std::string name;
    bool const cluster = getApp().getUNL().nodeInCluster(
        publicKey, name);
    
    auto const result = m_peerFinder->activate (slot,
        publicKey.toPublicKey(), cluster);
    if (result != PeerFinder::Result::success)
    {
        if (journal.trace) journal.trace <<
            "Peer " << remote_endpoint << " redirected, slots full";
        handoff.moved = false;
        handoff.response = makeRedirectResponse(slot, request,
            remote_endpoint.address());
        handoff.keep_alive = request.keep_alive();
        return handoff;
    }

    auto const peer = std::make_shared<PeerImp>(id,
        remote_endpoint, slot, std::move(request), hello, publicKey,
            consumer, std::move(ssl_bundle), *this);
    {
        // As we are not on the strand, run() must be called
        // while holding the lock, otherwise new I/O can be
        // queued after a call to stop().
        std::lock_guard <decltype(mutex_)> lock (mutex_);
        add(peer);
        peer->run();
    }
    handoff.moved = true;
    return handoff;
}
Exemplo n.º 21
0
 /** write the buffer we have built to the journal and fsync it.
     outside of lock as that could be slow.
 */
 static void WRITETOJOURNAL(AlignedBuilder& ab) { 
     journal(ab);
 }
Exemplo n.º 22
0
static void parse_short_options(
	const char *argument, const char *next_arg, int *index, struct argument_flags *flags)
{
	size_t i;

#if DEBUG
	journal("Parsing options in \"-%s\":\n", argument);
#endif /* DEBUG */

	for (i = 0; argument[i]; i++) {
#if DEBUG
		journal("	Parsing flag \"-%c\".\n", argument[i]);
		journal("	flags = {\n");
		journal("		ProgramName: %s\n",	flags->program_name);
		journal("		ConfFile: %s\n",	flags->conf_file);
		journal("		QuotesFile: %s\n",	flags->quotes_file);
		journal("		PidFile: %s\n",		flags->pid_file);
		journal("		JournalFile: %s\n",	flags->journal_file);
		journal("		Daemonize: %s\n",	BOOLSTR2(flags->daemonize));
		journal("		Protocol: %s\n",	\
				name_option_protocol(flags->tproto, flags->iproto));
		journal("	}\n\n");
#endif /* DEBUG */

		switch (argument[i]) {
		case 'f':
			flags->daemonize = false;
			break;
		case 'c':
			if (!next_arg) {
				fprintf(stderr, "You must specify a configuration file.\n");
				cleanup(EXIT_ARGUMENTS, true);
			}

			(*index)++;
			flags->conf_file = next_arg;
			break;
		case 'N':
			flags->conf_file = NULL;
		case 'P':
			if (!next_arg) {
				fprintf(stderr, "You must specify a pid file.\n");
				cleanup(EXIT_ARGUMENTS, true);
			}

			(*index)++;
			flags->pid_file = next_arg;
			break;
		case 's':
			if (!next_arg) {
				fprintf(stderr, "You must specify a quotes file.\n");
				cleanup(EXIT_ARGUMENTS, true);
			}

			(*index)++;
			flags->quotes_file = next_arg;
			break;
		case 'j':
			if (!next_arg) {
				fprintf(stderr, "You must specify a journal file.\n");
				cleanup(EXIT_ARGUMENTS, true);
			}

			(*index)++;
			flags->journal_file = next_arg;
			break;
		case '4':
			if (flags->iproto == PROTOCOL_IPv6) {
				fprintf(stderr, "Conflicting options passed: -4 and -6.\n");
				cleanup(EXIT_ARGUMENTS, true);
			}

			flags->iproto = PROTOCOL_IPv4;
			break;
		case '6':
			if (flags->iproto == PROTOCOL_IPv4) {
				fprintf(stderr, "Conflicting options passed: -4 and -6.\n");
				cleanup(EXIT_ARGUMENTS, true);
			}

			flags->iproto = PROTOCOL_IPv6;
			break;
		case 't':
			if (flags->tproto == PROTOCOL_UDP) {
				fprintf(stderr, "Conflicting options passed: -t and -u.\n");
				cleanup(EXIT_ARGUMENTS, true);
			}

			flags->tproto = PROTOCOL_TCP;
			break;
		case 'u':
			if (flags->tproto == PROTOCOL_TCP) {
				fprintf(stderr, "Conflicting options passed: -t and -u.\n");
				cleanup(EXIT_ARGUMENTS, true);
			}

			flags->tproto = PROTOCOL_UDP;
			break;
		case 'q':
			close_journal();
			break;
		default:
			fprintf(stderr, "Unknown short option: -%c.\n", argument[i]);
			usage_and_exit(flags->program_name);
		}
	}
}
Exemplo n.º 23
0
dsa_init () {
	Attr_Sequence as, get_cacheEDB();
	AttributeType manager;
	DN str2dn();
	struct edb_info * dsainfo;
	AV_Sequence avs;
	Entry newentry;
	Entry my_entry;
	int real_unravel_attribute ();
	int real_check_schema ();
	char loadstate = TRUE;
	struct DSError error;
	Entry akid;

	check_dsa_known_oids ();

	unrav_fn = (IFP) real_unravel_attribute;
	schema_fn = (IFP) real_check_schema;
	restart_fn = (IFP) attempt_restart;

	if (( manager = AttrT_new (MANAGER_OID)) == NULLAttrT)
		fatal (-1,"Manager - unknown attribute - check oid tables");

	LLOG (log_dsap,LLOG_NOTICE,("dsa name %s",mydsaname));

	if ((mydsadn = str2dn (mydsaname)) == NULLDN) {
		fatal (-2,"Invalid dsa name");
	}

	if ((my_entry = load_dsa_cache_entry (mydsadn)) == NULLENTRY) {
		if (parse_status != 0)
			fatal (-3,"Can't load EDB subtree holding my DSA entry");

		if (database_root != NULLENTRY)
			fatal (-4,"Found EDB - but my DSA entry not in it!");

		fatal (-4,"can't locate my DSA entry in local database!");

	} else if (my_entry->e_data == E_TYPE_CACHE_FROM_MASTER)
		shadow_myentry ();

	if (get_entry_passwd (my_entry->e_attributes) == NULLCP)
		/* This is not a fatal error, but some remote operations may fail */
		LLOG(log_dsap,LLOG_EXCEPTIONS,("Can't find my own PASSWORD"));

	if (dsa_real_attr) {
		if (as_cmp (my_entry->e_attributes,dsa_real_attr) != 0) {
			LLOG (log_dsap,LLOG_EXCEPTIONS,
				  ("DSA.real entry inconsistent with EDB -- problem should fix itself later!"));
			as_free (my_entry->e_attributes);
			my_entry->e_attributes = as_cpy (dsa_real_attr);
			if (unravel_attribute (my_entry,&error) != OK)
				fatal (-82,"schema error in DSA entry");
		}
	} else
		dsa_real_attr = as_cpy (my_entry->e_attributes);

	if (my_entry->e_dsainfo != NULLDSA) {
		/* get manager attribute */
		if ((as = entry_find_type(my_entry,manager)) == NULLATTR )
			fatal (-5,"Manager attribute missing in my own entry");
		AttrT_free (manager);
		super_user = avs_cpy ((AV_Sequence)as->attr_value);

		if (quipu_ctx_supported(my_entry) < 5) {
			LLOG(log_dsap,LLOG_EXCEPTIONS,(
					 "Adding QUIPU and/or Internet DSP to application context!!!"));
			set_context (my_entry);
		}

		my_entry->e_dsainfo->dsa_version =
			TidyString (strdup (quipuversion));
		if (as = entry_find_type (my_entry,at_version))
			if ( strcmp (
						(char *) as->attr_value->avseq_av.av_struct,
						my_entry->e_dsainfo->dsa_version) != 0) {

				if (as->attr_value->avseq_av.av_struct)
					free (as->attr_value->avseq_av.av_struct);
				as->attr_value->avseq_av.av_struct =
					(caddr_t) strdup (my_entry->e_dsainfo->dsa_version);

				if (as = as_find_type (dsa_real_attr,at_version)) {
					if (as->attr_value->avseq_av.av_struct)
						free (as->attr_value->avseq_av.av_struct);
					as->attr_value->avseq_av.av_struct =
						(caddr_t) strdup (my_entry->e_dsainfo->dsa_version);
				}

				if (parse_status == 0)
					if (my_entry->e_data == E_DATA_MASTER) {
						if (my_entry->e_parent != NULLENTRY)
							my_entry->e_parent->e_edbversion = new_version();
						LLOG (log_dsap,LLOG_NOTICE,("Updating version number"));
#ifdef TURBO_DISK
						if (turbo_write(my_entry) != OK)
							fatal (-33,"self rewrite failed - check database");
#else
						akid = (Entry) avl_getone(my_entry->e_parent->e_children);
						if (journal (akid) != OK)
							fatal (-33,"self rewrite failed - check database");
#endif
					} else {
						write_dsa_entry(my_entry);
					}
			}

	} else
		fatal (-6,"No edbinfo attribute in my own entry");

	if (parse_status != 0)
		loadstate = FALSE;

	for (avs = my_entry->e_dsainfo->dsa_attr ; avs != NULLAV; avs=avs->avseq_next) {
		if (avs->avseq_av.av_struct == NULL)
			continue;
		dsainfo = (struct edb_info *) avs->avseq_av.av_struct;
		if ((newentry = make_path (dsainfo->edb_name)) == NULLENTRY)
			continue;

		(void) subtree_load (newentry,dsainfo->edb_name);
		if (parse_status != 0)
			loadstate = FALSE;
	}

	if (loadstate == FALSE)
		fatal (-7,"DSA Halted");

	if ((akid = (Entry) avl_getone(database_root->e_children))
			!= NULLENTRY )
		database_root->e_data = akid->e_data;

	/* Load cached EDB files - if any */
	if ((as = get_cacheEDB()) != NULLATTR) {
		(void) time (&timenow);

		for (avs = as -> attr_value; avs != NULLAV; avs = avs -> avseq_next) {
			if ((newentry = make_path ((DN)avs->avseq_av.av_struct)) == NULLENTRY)
				continue;
			newentry = subtree_load (newentry,(DN)avs->avseq_av.av_struct);
			/* Should timestamp using version number ! */
			if (newentry)
				newentry->e_age = timenow;
		}
	}

#ifndef TURBO_DISK
	free_phylinebuf();	/* Large buffer used in loading text database */
#endif

	return (OK);

}
Exemplo n.º 24
0
void parse_args(struct options *const opt, const int argc, const char *const argv[])
{
	struct argument_flags flags;
	int i;

	/* Set override flags */
	flags.program_name = basename((char *)argv[0]);
	flags.conf_file = DEFAULT_CONFIG_FILE;
	flags.quotes_file = NULL;
	flags.pid_file = NULL;
	flags.journal_file = NULL;
	flags.tproto = PROTOCOL_TNONE;
	flags.iproto = PROTOCOL_INONE;
	flags.daemonize = BOOLEAN_UNSET;
	flags.strict = true;

	/* Set default options, defined in options.h */
	opt->port = DEFAULT_PORT;
	opt->tproto = DEFAULT_TRANSPORT_PROTOCOL;
	opt->iproto = DEFAULT_INTERNET_PROTOCOL;
	opt->quotes_file = DEFAULT_QUOTES_FILE;
	opt->linediv = DEFAULT_LINE_DIVIDER;
	opt->pid_file = default_pidfile();
	opt->require_pidfile = DEFAULT_REQUIRE_PIDFILE;
	opt->daemonize = DEFAULT_DAEMONIZE;
	opt->drop_privileges = DEFAULT_DROP_PRIVILEGES;
	opt->is_daily = DEFAULT_IS_DAILY;
	opt->pad_quotes = DEFAULT_PAD_QUOTES;
	opt->allow_big = DEFAULT_ALLOW_BIG;
	opt->chdir_root = DEFAULT_CHDIR_ROOT;

	/* Parse arguments */
	for (i = 1; i < argc; i++) {
		if (!strcmp(argv[i], "--")) {
			break;
		} else if (!strncmp(argv[i], "--", 2)) {
			parse_long_option(argc, argv, &i, &flags);
		} else if (argv[i][0] == '-') {
			const char *next_arg = (i + 1 == argc) ? NULL : argv[i + 1];
			parse_short_options(argv[i] + 1, next_arg, &i, &flags);
		} else {
			printf("Unrecognized option: %s.\n", argv[i]);
			usage_and_exit(flags.program_name);
		}
	}

	/* Override config file options */
	opt->strict = flags.strict;

	if (flags.conf_file) {
		if (flags.conf_file[0] != '/') {
			opt->chdir_root = false;
		}

		parse_config(flags.conf_file, opt);
	}

	if (flags.pid_file) {
		opt->pid_file = strcmp(flags.pid_file, "none") ? flags.pid_file : NULL;
	}

	if (flags.quotes_file) {
		opt->quotes_file = flags.quotes_file;
	}

	if (flags.journal_file && !strcmp(flags.journal_file, "-")) {
		opt->journal_file = flags.journal_file;
	} else {
		opt->journal_file = NULL;
	}

	if (flags.iproto != PROTOCOL_INONE) {
		opt->iproto = flags.iproto;
	}

	if (flags.tproto != PROTOCOL_TNONE) {
		opt->tproto = flags.tproto;
	}

	if (flags.daemonize != BOOLEAN_UNSET) {
		opt->daemonize = flags.daemonize;
	}

#if DEBUG
	journal("\nContents of struct 'opt':\n");
	journal("opt = {\n");
	journal("	QuotesFile: %s\n",		BOOLSTR(opt->quotes_file));
	journal("	PidFile: %s\n",			opt->pid_file);
	journal("	Port: %u\n",			opt->port);
	journal("	QuoteDivider: %s\n",		name_option_quote_divider(opt->linediv));
	journal("	Protocol: %s\n",		name_option_protocol(opt->tproto, opt->iproto));
	journal("	Daemonize: %s\n",		BOOLSTR(opt->daemonize));
	journal("	RequirePidfile: %s\n",	  	BOOLSTR(opt->require_pidfile));
	journal("	DropPrivileges: %s\n",	  	BOOLSTR(opt->drop_privileges));
	journal("	DailyQuotes: %s\n",	  	BOOLSTR(opt->is_daily));
	journal("	AllowBigQuotes: %s\n",	  	BOOLSTR(opt->allow_big));
	journal("	ChdirRoot: %s\n",		BOOLSTR(opt->chdir_root));
	journal("}\n\n");
#endif /* DEBUG */
}
Exemplo n.º 25
0
int main(int argc, char** argv)
{
    DynareParams params(argc, argv);
    if (params.help) {
        params.printHelp();
        return 0;
    }
    if (params.version) {
        printf("Dynare++ v. %s. Copyright (C) 2004-2011, Ondra Kamenik\n",
               DYNVERSION);
        printf("Dynare++ comes with ABSOLUTELY NO WARRANTY and is distributed under\n");
        printf("GPL: modules integ, tl, kord, sylv, src, extern and documentation\n");
        printf("LGPL: modules parser, utils\n");
        printf(" for GPL  see http://www.gnu.org/licenses/gpl.html\n");
        printf(" for LGPL see http://www.gnu.org/licenses/lgpl.html\n");
        return 0;
    }
    THREAD_GROUP::max_parallel_threads = params.num_threads;

    try {
        // make journal name and journal
        std::string jname(params.basename);
        jname += ".jnl";
        Journal journal(jname.c_str());

        // make dynare object
        Dynare dynare(params.modname, params.order, params.ss_tol, journal);
        // make list of shocks for which we will do IRFs
        vector<int> irf_list_ind;
        if (params.do_irfs_all)
            for (int i = 0; i < dynare.nexog(); i++)
                irf_list_ind.push_back(i);
        else
            irf_list_ind = ((const DynareNameList&)dynare.getExogNames()).selectIndices(params.irf_list);

        // write matlab files
        FILE* mfd;
        std::string mfile1(params.basename);
        mfile1 += "_f.m";
        if (NULL == (mfd=fopen(mfile1.c_str(), "w"))) {
            fprintf(stderr, "Couldn't open %s for writing.\n", mfile1.c_str());
            exit(1);
        }
        ogdyn::MatlabSSWriter writer0(dynare.getModel(), params.basename.c_str());
        writer0.write_der0(mfd);
        fclose(mfd);

        std::string mfile2(params.basename);
        mfile2 += "_ff.m";
        if (NULL == (mfd=fopen(mfile2.c_str(), "w"))) {
            fprintf(stderr, "Couldn't open %s for writing.\n", mfile2.c_str());
            exit(1);
        }
        ogdyn::MatlabSSWriter writer1(dynare.getModel(), params.basename.c_str());
        writer1.write_der1(mfd);
        fclose(mfd);

        // open mat file
        std::string matfile(params.basename);
        matfile += ".mat";
        mat_t* matfd = Mat_Create(matfile.c_str(), NULL);
        if (matfd == NULL) {
            fprintf(stderr, "Couldn't open %s for writing.\n", matfile.c_str());
            exit(1);
        }

        // write info about the model (dimensions and variables)
        dynare.writeMat(matfd, params.prefix);
        // write the dump file corresponding to the input
        dynare.writeDump(params.basename);


        system_random_generator.initSeed(params.seed);

        tls.init(dynare.order(),
                 dynare.nstat()+2*dynare.npred()+3*dynare.nboth()+
                 2*dynare.nforw()+dynare.nexog());

        Approximation app(dynare, journal, params.num_steps, params.do_centralize, params.qz_criterium);
        try {
            app.walkStochSteady();
        } catch (const KordException& e) {
            // tell about the exception and continue
            printf("Caught (not yet fatal) Kord exception: ");
            e.print();
            JournalRecord rec(journal);
            rec << "Solution routine not finished (" << e.get_message()
                << "), see what happens" << endrec;
        }

        std::string ss_matrix_name(params.prefix);
        ss_matrix_name += "_steady_states";
        ConstTwoDMatrix(app.getSS()).writeMat(matfd, ss_matrix_name.c_str());

        // check the approximation
        if (params.check_along_path || params.check_along_shocks
                || params.check_on_ellipse) {
            GlobalChecker gcheck(app, THREAD_GROUP::max_parallel_threads, journal);
            if (params.check_along_shocks)
                gcheck.checkAlongShocksAndSave(matfd, params.prefix,
                                               params.getCheckShockPoints(),
                                               params.getCheckShockScale(),
                                               params.check_evals);
            if (params.check_on_ellipse)
                gcheck.checkOnEllipseAndSave(matfd, params.prefix,
                                             params.getCheckEllipsePoints(),
                                             params.getCheckEllipseScale(),
                                             params.check_evals);
            if (params.check_along_path)
                gcheck.checkAlongSimulationAndSave(matfd, params.prefix,
                                                   params.getCheckPathPoints(),
                                                   params.check_evals);
        }

        // write the folded decision rule to the Mat-4 file
        app.getFoldDecisionRule().writeMat(matfd, params.prefix);

        // simulate conditional
        if (params.num_condper > 0 && params.num_condsim > 0) {
            SimResultsDynamicStats rescond(dynare.numeq(), params.num_condper, 0);
            ConstVector det_ss(app.getSS(),0);
            rescond.simulate(params.num_condsim, app.getFoldDecisionRule(), det_ss, dynare.getVcov(), journal);
            rescond.writeMat(matfd, params.prefix);
        }

        // simulate unconditional
        //const DecisionRule& dr = app.getUnfoldDecisionRule();
        const DecisionRule& dr = app.getFoldDecisionRule();
        if (params.num_per > 0 && params.num_sim > 0) {
            SimResultsStats res(dynare.numeq(), params.num_per, params.num_burn);
            res.simulate(params.num_sim, dr, dynare.getSteady(), dynare.getVcov(), journal);
            res.writeMat(matfd, params.prefix);

            // impulse response functions
            if (! irf_list_ind.empty()) {
                IRFResults irf(dynare, dr, res, irf_list_ind, journal);
                irf.writeMat(matfd, params.prefix);
            }
        }

        // simulate with real-time statistics
        if (params.num_rtper > 0 && params.num_rtsim > 0) {
            RTSimResultsStats rtres(dynare.numeq(), params.num_rtper, params.num_burn);
            rtres.simulate(params.num_rtsim, dr, dynare.getSteady(), dynare.getVcov(), journal);
            rtres.writeMat(matfd, params.prefix);
        }

        Mat_Close(matfd);

    } catch (const KordException& e) {
        printf("Caugth Kord exception: ");
        e.print();
        return e.code();
    } catch (const TLException& e) {
        printf("Caugth TL exception: ");
        e.print();
        return 255;
    } catch (SylvException& e) {
        printf("Caught Sylv exception: ");
        e.printMessage();
        return 255;
    } catch (const DynareException& e) {
        printf("Caught Dynare exception: %s\n", e.message());
        return 255;
    } catch (const ogu::Exception& e) {
        printf("Caught ogu::Exception: ");
        e.print();
        return 255;
    } catch (const ogp::ParserException& e) {
        printf("Caught parser exception: %s\n", e.message());
        return 255;
    }

    return 0;
}
Exemplo n.º 26
0
Arquivo: dur.cpp Projeto: rakex/mongo
 static void WRITETOJOURNAL(const BufBuilder& bb) { 
     journal(bb);
 }