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); }
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); }