void zprimitive ( strnumber s , halfword c , halfword o ) { poolpointer k ; smallnumber j ; smallnumber l ; k = strstart [s ]; l = strstart [s + 1 ]- k ; {register integer for_end; j = 0 ;for_end = l - 1 ; if ( j <= for_end) do buffer [j ]= strpool [k + j ]; while ( j++ < for_end ) ;} cursym = idlookup ( 0 , l ) ; if ( s >= 256 ) { flushstring ( strptr - 1 ) ; hash [cursym ].v.RH = s ; } eqtb [cursym ].lhfield = c ; eqtb [cursym ].v.RH = o ; }
/* Add tag data * Args: Interface pointer, buffer for tags * Returns: Length of tag buffer on success */ size_t gettag(iface_t *ifa, char *buf, senblk_t *sptr) { char *ptr=buf; char *nameptr; int first=1; struct timeval tv; unsigned char cksum; size_t len; *ptr++='\\'; if (ifa->tagflags & TAG_SRC){ first=0; memcpy(ptr,"s:",2); ptr+=2; if (ifa->tagflags & TAG_ISRC) { if ((nameptr=idlookup(sptr->src))==NULL) nameptr=DEFSRCNAME; } else nameptr=(ifa->name)?ifa->name:DEFSRCNAME; for (len=0;*nameptr && len < 15; len++) *ptr++=*nameptr++; } if (ifa->tagflags & TAG_TS) { if (!first) *ptr++=','; memcpy(ptr,"c:",2); ptr+=2; (void) gettimeofday(&tv,NULL); ptr+=sprintf(ptr,"%010u",(unsigned) tv.tv_sec); if (ifa->tagflags & TAG_MS) ptr += sprintf(ptr,"%03u",((unsigned) tv.tv_usec+500)/1000); } /* Don't include initial '/' */ cksum=calcsum(buf+1,(len=ptr-buf)-1); len+=sprintf(ptr,"*%02X\\",cksum); return(len); }
void sfsconst_init (bool lite_mode) { if (const_set) return; const_set = true; { char *p = safegetenv ("SFS_RELEASE"); if (!p || !convertint (p, &sfs_release)) { str rel (strbuf () << "SFS_RELEASE=" << sfs_release); xputenv (const_cast<char*>(rel.cstr())); } } #ifdef MAINTAINER if (char *p = safegetenv ("SFS_RUNINPLACE")) { runinplace = true; builddir = p; buildtmpdir = builddir << "/runinplace"; } if (char *p = safegetenv ("SFS_ROOT")) if (*p == '/') sfsroot = p; #endif /* MAINTAINER */ sfsdevdb = strbuf ("%s/.devdb", sfsroot); #ifdef MAINTAINER if (runinplace) { sfsdir = buildtmpdir; sfssockdir = sfsdir; etc3dir = etc1dir; etc1dir = sfsdir.cstr(); etc2dir = xstrdup (str (builddir << "/etc")); } #endif /* MAINTAINER */ if (char *ps = safegetenv ("SFS_PORT")) if (int pv = atoi (ps)) sfs_defport = pv; str sfs_config = safegetenv ("SFS_CONFIG"); if (sfs_config && sfs_config[0] == '/') { if (!parseconfig (NULL, sfs_config)) fatal << sfs_config << ": " << strerror (errno) << "\n"; } else { if (!parseconfig (etc3dir, sfs_config)) { parseconfig (etc3dir, "sfs_config"); if (!parseconfig (etc2dir, sfs_config)) { parseconfig (etc2dir, "sfs_config"); if (!parseconfig (etc1dir, sfs_config)) parseconfig (etc1dir, "sfs_config"); } } } if (!lite_mode) { if (!sfs_uid) idlookup (NULL, NULL); } if (char *p = getenv ("SFS_HASHCOST")) { sfs_hashcost = strtoi64 (p); if (sfs_hashcost > sfs_maxhashcost) sfs_hashcost = sfs_maxhashcost; } if (!getuid () && !runinplace) { mksfsdir (sfsdir, 0755); mksfsdir (sfssockdir, 0750); } else if (runinplace && access (sfsdir, 0) < 0) { struct stat sb; if (!stat (builddir, &sb)) { mode_t m = umask (0); if (!getuid ()) { if (pid_t pid = fork ()) waitpid (pid, NULL, 0); else { umask (0); setgid (sfs_gid); setuid (sb.st_uid); if (mkdir (sfsdir, 02770) >= 0) rc_ignore (chown (sfsdir, (uid_t) -1, sfs_gid)); _exit (0); } } else mkdir (sfsdir, 0777); umask (m); } } }
static bool parseconfig (const char *dir, const char *file) { str cf; if (!file) return false; if (file[0] == '/') cf = file; else if (!dir) return false; else cf = strbuf ("%s/%s", dir, file); if (access (cf, F_OK) < 0) { if (errno != ENOENT) warn << cf << ": " << strerror (errno) << "\n"; return false; } conftab ct; bool dirset = false; ct.add ("RSASize", &sfs_rsasize, sfs_minrsasize, sfs_maxrsasize) .add ("DLogSize", &sfs_dlogsize, sfs_mindlogsize, sfs_maxdlogsize) .add ("PwdCost", &sfs_pwdcost, 0, 32) .add ("LogPriority", &syslog_priority) .add ("sfsdir", wrap (&got_sfsdir, &dirset)); str uid, gid, nuid, ngid, resvgidlow, resvgidhigh; bool errors = false; parseargs pa (cf); int line; vec<str> av; while (pa.getline (&av, &line)) { if (!strcasecmp (av[0], "sfsuser")) { if (uid) { errors = true; warn << cf << ":" << line << ": Duplicate sfsuser directive\n"; } else if (av.size () == 2) uid = gid = av[1]; else if (av.size () == 3) { uid = av[1]; gid = av[2]; } else { errors = true; warn << cf << ":" << line << ": usage: sfsuser user [group]\n"; } } else if (!strcasecmp (av[0], "anonuser")) { if (nuid) { errors = true; warn << cf << ":" << line << ": Duplicate anonuser directive\n"; } else if (av.size () == 2) nuid = av[1]; else if (av.size () == 3) { nuid = av[1]; ngid = av[2]; } else { errors = true; warn << cf << ":" << line << ": usage: anonuser user [group]\n"; continue; } gid_t g; if (ngid) { if (!convertint (ngid, &g)) { if (struct group *gr = getgrnam (ngid)) g = gr->gr_gid; else { errors = true; warn << cf << ":" << line << ": no group " << ngid << "\n"; ngid = NULL; } } } uid_t u; if (!convertint (nuid, &u)) { struct passwd *pw = getpwnam (nuid); if (!pw) { errors = true; warn << cf << ":" << line << ": no user " << nuid << "\n"; continue; } nobody_uid = pw->pw_uid; if (ngid) nobody_gid = g; else nobody_gid = pw->pw_gid; } else if (ngid) { nobody_uid = u; nobody_gid = g; } else { errors = true; warn << cf << ":" << line << ": Must specify gid with numeric uid"; continue; } } else if (!strcasecmp (av[0], "resvgids")) { if (resvgidhigh) { errors = true; warn << cf << ":" << line << ": Duplicate resvgids directive\n"; } else if (av.size () != 3) { errors = true; warn << cf << ":" << line << ": usage: resvgids lower upper\n"; } else { resvgidlow = av[1]; resvgidhigh = av[2]; } } else if (!ct.match (av, cf, line, &errors)) { warn << cf << ":" << line << ": Unknown directive '" << av[0] << "'\n"; } } if (errors) warn << "errors in " << cf << "\n"; if (uid) idlookup (uid, gid); resvgidset (resvgidlow, resvgidhigh); return true; }