static int settime(void* context, const char* cmd, Time_t now, int adjust, int network) { char* s; char** argv; char* args[5]; char buf[1024]; if (!adjust && !network) return tmxsettime(now); argv = args; s = "/usr/bin/date"; if (!streq(cmd, s) && (!eaccess(s, X_OK) || !eaccess(s+=4, X_OK))) { *argv++ = s; if (streq(astconf("UNIVERSE", NiL, NiL), "att")) { tmxfmt(buf, sizeof(buf), "%m%d%H" "%M%Y.%S", now); if (adjust) *argv++ = "-a"; } else { tmxfmt(buf, sizeof(buf), "%Y%m%d%H" "%M.%S", now); if (network) *argv++ = "-n"; if (tm_info.flags & TM_UTC) *argv++ = "-u"; } *argv++ = buf; *argv = 0; if (!sh_run(context, argv - args, args)) return 0; } return -1; }
int b_uname(int argc, char** argv, void* context) { register long flags = 0; register int sep = 0; register int n; register char* s; char* t; char* e; char* sethost = 0; int list = 0; struct utsname ut; char buf[257]; cmdinit(argc, argv, context, ERROR_CATALOG, 0); for (;;) { switch (optget(argv, usage)) { case 'a': flags |= OPT_all|((1L<<OPT_ALL)-1); continue; case 'b': flags |= OPT_base; continue; case 'c': flags |= OPT_vendor; continue; case 'd': flags |= OPT_domain; continue; case 'f': list = 1; continue; case 'h': flags |= OPT_hostid; continue; case 'i': flags |= OPT_implementation; continue; case 'm': flags |= OPT_machine; continue; case 'n': flags |= OPT_nodename; continue; case 'o': flags |= OPT_operating_system; continue; case 'p': flags |= OPT_processor; continue; case 'r': flags |= OPT_release; continue; case 's': flags |= OPT_system; continue; case 't': flags |= OPT_machine_type; continue; case 'v': flags |= OPT_version; continue; case 'x': flags |= OPT_extra; continue; case 'A': flags |= OPT_total|((1L<<OPT_TOTAL)-1); continue; case 'R': flags |= OPT_extended_release; continue; case 'S': sethost = opt_info.arg; continue; case ':': s = "/usr/bin/uname"; if (!streq(argv[0], s) && (!eaccess(s, X_OK) || !eaccess(s+=4, X_OK))) { argv[0] = s; return sh_run(context, argc, argv); } error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } break; } argv += opt_info.index; if (error_info.errors || *argv && (flags || sethost) || sethost && flags) error(ERROR_usage(2), "%s", optusage(NiL)); if (sethost) { #if _lib_sethostname if (sethostname(sethost, strlen(sethost) + 1)) #else #ifdef ENOSYS errno = ENOSYS; #else errno = EPERM; #endif #endif error(ERROR_system(1), "%s: cannot set host name", sethost); } else if (list) astconflist(sfstdout, NiL, ASTCONF_base|ASTCONF_defined|ASTCONF_lower|ASTCONF_quote|ASTCONF_matchcall, "CS|SI"); else if (*argv) { e = &buf[sizeof(buf)-1]; while (s = *argv++) { t = buf; *t++ = 'C'; *t++ = 'S'; *t++ = '_'; while (t < e && (n = *s++)) *t++ = islower(n) ? toupper(n) : n; *t = 0; sfprintf(sfstdout, "%s%c", *(t = astconf(buf, NiL, NiL)) ? t : *(t = astconf(buf+3, NiL, NiL)) ? t : "unknown", *argv ? ' ' : '\n'); } } else { s = buf; if (!flags) flags = OPT_system; memzero(&ut, sizeof(ut)); if (uname(&ut) < 0) error(ERROR_usage(2), "information unavailable"); output(OPT_system, ut.sysname, "sysname"); if (flags & OPT_nodename) { #if !_mem_nodeext_utsname && _lib_gethostname if (sizeof(ut.nodename) > 9 || gethostname(s, sizeof(buf))) #endif s = ut.nodename; output(OPT_nodename, s, "nodename"); } output(OPT_release, ut.release, "release"); output(OPT_version, ut.version, "version"); output(OPT_machine, ut.machine, "machine"); if (flags & OPT_processor) { if (!*(s = astconf("ARCHITECTURE", NiL, NiL))) s = ut.machine; output(OPT_processor, s, "processor"); } if (flags & OPT_implementation) { if (!*(s = astconf("PLATFORM", NiL, NiL)) && !*(s = astconf("HW_NAME", NiL, NiL))) { if (t = strchr(hosttype, '.')) t++; else t = (char*)hosttype; strncpy(s = buf, t, sizeof(buf) - 1); } output(OPT_implementation, s, "implementation"); } if (flags & OPT_operating_system) { s = astconf("OPERATING_SYSTEM", NiL, NiL); if (!*s) #ifdef _UNAME_os_DEFAULT s = _UNAME_os_DEFAULT; #else s = ut.sysname; #endif output(OPT_operating_system, s, "operating-system"); } if (flags & OPT_extended_release) { s = astconf("RELEASE", NiL, NiL); output(OPT_extended_release, s, "extended-release"); } #if _mem_idnumber_utsname output(OPT_hostid, ut.idnumber, "hostid"); #else if (flags & OPT_hostid) { if (!*(s = astconf("HW_SERIAL", NiL, NiL))) #if _lib_gethostid sfsprintf(s = buf, sizeof(buf), "%08x", gethostid()); #else /*NOP*/; #endif output(OPT_hostid, s, "hostid"); } #endif if (flags & OPT_vendor) { s = astconf("HW_PROVIDER", NiL, NiL); output(OPT_vendor, s, "vendor"); } if (flags & OPT_domain) { if (!*(s = astconf("SRPC_DOMAIN", NiL, NiL))) #if _lib_getdomainname getdomainname(s, sizeof(buf)); #else /*NOP*/; #endif output(OPT_domain, s, "domain"); } #if _mem_m_type_utsname s = ut.m_type; #else s = astconf("MACHINE", NiL, NiL); #endif output(OPT_machine_type, s, "m_type"); #if _mem_base_rel_utsname s = ut.base_rel; #else s = astconf("BASE", NiL, NiL); #endif output(OPT_base, s, "base_rel"); if (flags & OPT_extra) { char* last = (char*)&ut; extra(sysname); extra(nodename); extra(release); extra(version); extra(machine); #if _mem_idnumber_utsname extra(idnumber); #endif #if _mem_m_type_utsname extra(m_type); #endif #if _mem_base_rel_utsname extra(base_rel); #endif if (last < ((char*)(&ut + 1))) { s = t = last; while (s < (char*)(&ut + 1)) { if (!(n = *s++)) { if ((s - t) > 1) { if (sep) sfputc(sfstdout, ' '); else sep = 1; sfputr(sfstdout, t, -1); } t = s; } else if (!isprint(n)) break; } } } if (sep) sfputc(sfstdout, '\n'); } return error_info.errors; }