Example #1
0
File: assm.c Project: BigEd/pyldin
void assemble(char *outname)
{
  char *aline;
  int dataoffset, stringsoffset, linkisoffset;
  int datalen, stringslen, linkislen, oldlineno;
  struct export *e, *eo;

  numfuncs = 0;
  numlinkis = 0;
  temptype = -2;
  if(src == NULL)
    return;
  if(verbose)
    fprintf(stderr, "\n%s: Assembling file `%s'\n", progname, src->filename);
  errors = 0;
  makearea(&oheaders);
  makearea(&ostrings);
  makearea(&odata);
  makearea(&olinkis);

  PARENTO = addonestrtoarea(outname);

  /* build header */
  addinttoarea(&oheaders, 0x6a624f51);	/* "QObj" */
  addinttoarea(&oheaders, -1);		/* creator string */
  addinttoarea(&oheaders, -1);		/* num funcs */
  addinttoarea(&oheaders, 60);		/* address func headers */
  addinttoarea(&oheaders, -1);		/* procos */
  addinttoarea(&oheaders, 0);		/* reserved */
  addinttoarea(&oheaders, 2);		/* obj format version */
  addinttoarea(&oheaders, 0);		/* address code/data */
  addinttoarea(&oheaders, 0);		/* length code/data */
  addinttoarea(&oheaders, 0);		/* address strings */
  addinttoarea(&oheaders, 0);		/* length strings */
  addinttoarea(&oheaders, 0);		/* address linkis */
  addinttoarea(&oheaders, 0);		/* length linkis */
  addinttoarea(&oheaders, 0);		/* address debug info */
  addinttoarea(&oheaders, 0);		/* length debug info */
  strcpy(creator, "qas RISC OS ARM Assembler vsn "VERS" © Stu Smith ["__DATE__"]");
  strcpy(procos, "ARM/RISCOS");

  funcheadsoff = oheaders.used;

  /* assemble line-by-line */
  parseinit();
  clearvalues(&llabels);
  clearvalues(&rns);
  clearvalues(&fns);
  clearvalues(&cns);
  clearvalues(&sets);

  while(src) {
    aline = getline();
    decomment(aline);
    stripw(aline);
    if(*aline) {
      assmline(aline);
    }
  }
  endprevfunc();
  placeint(&oheaders, addonestrtoarea(creator), 4);
  placeint(&oheaders, addonestrtoarea(procos), 16);
  placeint(&oheaders, numfuncs, 8);

  /* concat headers-data-strings */
  alignarea(&oheaders);
  alignarea(&odata);
  alignarea(&ostrings);
  dataoffset = addtoarea(&oheaders, odata.mem, odata.used);
  datalen = odata.used;
  droparea(&odata);
  alignarea(&oheaders);
  linkisoffset = addtoarea(&oheaders, olinkis.mem, olinkis.used);
  linkislen = olinkis.used;
  droparea(&olinkis);
  alignarea(&oheaders);
  stringsoffset = addtoarea(&oheaders, ostrings.mem, ostrings.used);
  stringslen = ostrings.used;
  droparea(&ostrings);
  alignarea(&oheaders);

  if(numfuncs == 0)
    error("No symbols defined");

  placeint(&oheaders, dataoffset,    28);
  placeint(&oheaders, datalen,       32);
  placeint(&oheaders, stringsoffset, 36);
  placeint(&oheaders, stringslen,    40);
  placeint(&oheaders, linkisoffset,  44);
  placeint(&oheaders, linkislen,     48);
  placeint(&oheaders, 0,             52);
  placeint(&oheaders, 0,             56);

  e = exportlist;
  while(e) {
    oldlineno = lineno;
    lineno = e->line;
    error("Can't export symbol `%s': not defined", e->symname);
    lineno = oldlineno;
    freemem(e->symname);
    eo = e->next;
    freemem(e);
    e = eo;
  }
  exportlist = NULL;

  /* save object file */
#ifndef DEBUG
  if(errors == 0)
#endif
    saveblock(outname, oheaders.mem, oheaders.used);
  droparea(&oheaders);
}
Example #2
0
void
main(int argc, char **argv)
{
	char *netdir;
	char buf[1024];

	netdir = nil;
	quotefmtinstall();
	fmtinstall('I', eipfmt);
	starttime = time(0);
	ARGBEGIN{
	case 'a':
		authenticate = 1;
		break;
	case 'c':
		tlscert = EARGF(usage());
		break;
	case 'D':
		Dflag++;
		break;
	case 'd':
		debug++;
		break;
	case 'f':				/* disallow relaying */
		fflag = 1;
		break;
	case 'g':
		gflag = 1;
		break;
	case 'h':				/* default domain name */
		dom = EARGF(usage());
		break;
	case 'k':				/* prohibited ip address */
		addbadguy(EARGF(usage()));
		break;
	case 'm':				/* set mail command */
		mailer = mailerpath(EARGF(usage()));
		break;
	case 'n':				/* log peer ip address */
		netdir = EARGF(usage());
		break;
	case 'p':
		passwordinclear = 1;
		break;
	case 'r':
		rflag = 1;			/* verify sender's domain */
		break;
	case 's':				/* save blocked messages */
		sflag = 1;
		break;
	case 't':
		fprint(2, "%s: the -t option is no longer supported, see -c\n",
			argv0);
		tlscert = "/sys/lib/ssl/smtpd-cert.pem";
		break;
	default:
		usage();
	}ARGEND;

	nci = getnetconninfo(netdir, 0);
	if(nci == nil)
		sysfatal("can't get remote system's address: %r");
	parseip(rsysip, nci->rsys);

	if(mailer == nil)
		mailer = mailerpath("send");

	if(debug){
		snprint(buf, sizeof buf, "%s/smtpdb/%ld", UPASLOG, time(0));
		close(2);
		if (create(buf, OWRITE | OEXCL, 0662) >= 0) {
			seek(2, 0, 2);
			fprint(2, "%d smtpd %s\n", getpid(), thedate());
		} else
			debug = 0;
	}
	getconf();
	if (isbadguy())
		exits("banned");
	Binit(&bin, 0, OREAD);

	if (chdir(UPASLOG) < 0)
		syslog(0, "smtpd", "no %s: %r", UPASLOG);
	me = sysname_read();
	if(dom == 0 || dom[0] == 0)
		dom = domainname_read();
	if(dom == 0 || dom[0] == 0)
		dom = me;
	parseinit();
	sayhi();

	/* allow 45 minutes to parse the header */
	atnotify(catchalarm, 1);
	alarm(45*60*1000);
	zzparse();
	exits(0);
}