INLINE BOOL Cartridge::Prepare(eCartridgeSize size) { iType = size; iSize = this->GetCardType(size); const char *p = pFileSystem->GetWriteableDirectory(); ASSERT_MSG(p!=NULL, "You must set a WriteableDirectory!"); MEMSET(strPath, '\0', PC_MAX_PATH); STRLCPY(strPath, p, PC_MAX_PATH); STRLCAT(strPath, "/", PC_MAX_PATH - 1); STRLCAT(strPath, CARTRIDGE_FILENAME, PC_MAX_PATH - strlen(strPath) - 1); this->pData = static_cast<u8 *>(pMemoryManager->Alloc(iSize)); memset(this->pData, 0, iSize); if (!this->Verify(strPath, iSize)) { if (!this->CreateSaveFile()) { Log(TAG "ERROR: trying to create save file!"); return FALSE; } } return TRUE; }
static int proc_vmstat_normalize(_TOPIARY_BASE_T *base) { _TOPIARY_RESULTS_T *results = base->current->results; _TOPIARY_ARRAY_T *array = base->current->array; size_t nrows = array->vector->length; _TOPIARY_DEBUG("Nrows %zd\n", nrows); char ***values = (char ***) array->vector->values; char *key; char *val; int i; char buf[64]; int n1 = 0; STRLCAT(buf, "/", n1, sizeof(buf)); _topiary_results_init(results, nrows); for (i = 0; i < nrows; i++) { char **value1 = (char **) values[i]; key = value1[0]; if (!key) continue; _TOPIARY_DEBUG("%d:key '%s'\n", i, key); val = value1[1]; if (!val) continue; _TOPIARY_DEBUG("%d:Val '%s'\n", i, val); int n2 = n1; STRLCAT(buf, key, n2, sizeof(buf)); _TOPIARY_DEBUG("%d:HashKey '%s'\n", i, buf); _topiary_results_add_unsigned_long(results, buf, strtoul(val, NULL, 0)); } return TOPIARY_OK; }
static int ntp_drift_normalize(_TOPIARY_BASE_T *base) { _TOPIARY_RESULTS_T *results = base->current->results; _TOPIARY_ARRAY_T *array = base->current->array; char **values = (char **) array->vector->values; static const char *titles[] = { "drift", }; size_t ncols = array->vector->length; size_t mincol = ncols > 1 ? 1 : ncols; _topiary_results_init(results, ncols); int i; char buf[64]; int n1 = 0; STRLCAT(buf, "/", n1, sizeof(buf)); for (i = 0; i < mincol; i++) { char *val = values[i]; if (!val) continue; int n2 = n1; STRLCAT(buf, titles[i], n2, sizeof(buf)); _TOPIARY_DEBUG("Key %s, Value %s\n", buf, val); _topiary_results_add_fixed(results, buf, atof(val), 0, 3); } return TOPIARY_OK; }
static int proc_net_dev_normalize(_TOPIARY_BASE_T *base) { _TOPIARY_RESULTS_T *results = base->current->results; _TOPIARY_ARRAY_T *array = base->current->array; _TOPIARY_VECTOR_T *vector = array->vector; _TOPIARY_BASE_DATA_T *pdata = base->previous; _TOPIARY_RESULTS_T *presults = NULL; float tdiff = 0.0; if (pdata && pdata->array) { _topiary_base_timeval_diff(base, &tdiff); presults = pdata->results; _TOPIARY_DEBUG("Previous data is %d at %p\n", pdata->id, pdata); _TOPIARY_DEBUG("Previous results is at %p\n", presults); } _TOPIARY_DEBUG("Time difference = %f secs\n", tdiff); size_t nrows = vector->length; _TOPIARY_DEBUG("Nrows %zd\n", nrows); char ***values = (char ***) vector->values; char *val; char *rowkey; int i, j; _topiary_results_init(results, nrows); char **maintitles = values[0]; #ifdef DEBUG size_t nmain = vector->children[0]->length; _TOPIARY_DEBUG("Nmain %zd\n", nmain); for (i = 0; i < nmain; i++) { _TOPIARY_DEBUG("maintitle[%d] '%s'\n", i, maintitles[i]); } #endif char **coltitles = values[1]; size_t ncol = vector->children[1]->length; #ifdef DEBUG _TOPIARY_DEBUG("Ncol %zd\n", ncol); for (i = 0; i < ncol; i++) { _TOPIARY_DEBUG("coltitle[%d] '%s'\n", i, coltitles[i]); } #endif int transmit = 0; char *firsttitle = coltitles[1]; _TOPIARY_DEBUG("firsttitle '%s'\n", firsttitle); for (i = 2; i < ncol; i++) { if (!strcmp(firsttitle, coltitles[i])) { transmit = i; break; } } _TOPIARY_DEBUG("Transmit %d\n", transmit); char buf[64]; int n1 = 0; STRLCAT(buf, "/", n1, sizeof(buf)); for (i = 2; i < nrows; i++) { char **value1 = (char **) values[i]; size_t ncols = vector->children[i]->length; _TOPIARY_DEBUG("%d:Ncols %zd\n", i, ncols); rowkey = value1[0]; if (!rowkey) continue; _TOPIARY_DEBUG("%d:rowkey '%s'\n", i, rowkey); int n2 = n1; STRLCAT(buf, rowkey, n2, sizeof(buf)); STRLCAT(buf, "/", n2, sizeof(buf)); for (j = 1; j < ncols; j++) { val = value1[j]; if (!val) continue; _TOPIARY_DEBUG("%d,%d:Val '%s'\n", i, j, val); int n3 = n2; if (j < transmit) { STRLCAT(buf, maintitles[1], n3, sizeof(buf)); } else { STRLCAT(buf, maintitles[2], n3, sizeof(buf)); } STRLCAT(buf, "/", n3, sizeof(buf)); STRLCAT(buf, coltitles[j], n3, sizeof(buf)); _TOPIARY_DEBUG("%d,%d:hashkey '%s'\n", i, j, buf); unsigned long current = atoi(val); _topiary_results_add_unsigned_long(results, buf, current); if (tdiff > 0.0) { _TOPIARY_RESULTS_TABLE_T *pentry = NULL; int ret = _topiary_results_fetch(presults, buf, &pentry); if (ret) continue; _TOPIARY_DEBUG("%d,%d:previous value for %s is %lu\n", i, j, buf, pentry->value.ul); float rate = (current - pentry->value.ul) / tdiff; _TOPIARY_DEBUG("%d,%d:rate = %f\n", i, j, rate); STRLCAT(buf, "-s", n3, sizeof(buf)); _TOPIARY_DEBUG("%d,%d:hashkey '%s'\n", i, j, buf); _topiary_results_add_fixed(results, buf, rate, 0, 1); } } } return TOPIARY_OK; }
static int proc_pid_statm_normalize(_TOPIARY_BASE_T *base) { _TOPIARY_BASE_DATA_T *data = base->current; _TOPIARY_RESULTS_T *results = data->results; _TOPIARY_ARRAY_T *array = data->array; size_t nrows = array->vector->length; _TOPIARY_DEBUG("Current data is %d at %p\n", data->id, data); _TOPIARY_DEBUG("Current results is at %p\n", results); _TOPIARY_DEBUG("Nrows %zd\n", nrows); char ***values = (char ***) array->vector->values; int i, j; static const char *colkey[] = { "size", "resident", "share", "test", "lib", "data", "dt", }; char key[64]; int n1 = 0; STRLCAT(key, "/", n1, sizeof(key)); _topiary_results_init(results, nrows); for (i = 0; i < nrows; i++) { char **value1 = (char **) values[i]; char *rowkey = value1[0]; if (!rowkey) continue; size_t ncols = array->vector->children[i]->length; _TOPIARY_DEBUG("%d:ncols %zd\n", i, ncols); _TOPIARY_DEBUG("%d:Rowkey value %s\n", i, rowkey); int n2 = n1; STRLCAT(key, rowkey, n2, sizeof(key)); STRLCAT(key, "/", n2, sizeof(key)); for (j = 1; j < ncols; j++) { char *val = value1[j]; if (!val) continue; int n3 = n2; STRLCAT(key, colkey[j - 1], n3, sizeof(key)); unsigned long value = strtoul(val, NULL, 0) * results->page_size; _TOPIARY_DEBUG("%d,%d:%s value %s int %lu\n", i, j, key, val, value); _topiary_results_add_unsigned_long(results, key, value); } } return TOPIARY_OK; }
bool CContactInfo::SetMultiValue(AECHAR **pwsValue, char *pszXml, char *pszMultiTag, char *pszSingleTag) { FREEIF(*pwsValue); char *pszData=NULL; if ( !SetValue(&pszData, pszXml, pszMultiTag)) return false; //<emls><eml>[email protected]</eml><eml>[email protected]</eml></emls> if ( NULL!=pszData ) { //create a temporary buffer char *pszTmp = (char*)MALLOC(STRLEN(pszData));//need to change this 100 add. we r adding null characters at the end of each if ( NULL==pszTmp ) return false; char pszT[20]; SPRINTF(pszT, "<%s>", pszSingleTag); AECHAR pwzNewTag[]=NEW_FIELD; char pszNewtag[10]; SPRINTF(pszNewtag, "%S", pwzNewTag); char *pszFound=NULL; char *pszNext = pszData; bool bCount=false; int nBufLen=0; while ( NULL != (pszFound=STRSTR(pszNext, pszT))) { if ( bCount ) { //add null charachter at the end //STRCAT(pszTmp, "\0"); //add new tag STRCAT(pszTmp, pszNewtag); } bCount = true; //find the end position SPRINTF(pszT, "</%s>", pszSingleTag); char *pszEndTag=NULL; pszEndTag=STRSTR(pszFound, pszT); if ( NULL==pszEndTag ) return false; int nLen=0; SPRINTF(pszT, "<%s>", pszSingleTag); int nTagLen = STRLEN(pszT); nLen = STRLEN(pszFound)-STRLEN(pszEndTag)-nTagLen; // len of <id>3 nBufLen = STRLEN(pszTmp); STRLCAT(pszTmp+nBufLen, pszFound+nTagLen, nLen+1); nBufLen = STRLEN(pszTmp); pszNext = pszFound+1; } DBGPRINTF(pszTmp); nBufLen = STRLEN(pszTmp); //convert and copy to return buffer *pwsValue = (AECHAR*)MALLOC((nBufLen+1)*sizeof(AECHAR)); if ( NULL==(*pwsValue) ) { FREEIF(pszData); FREEIF(pszTmp); return false; } STRTOWSTR(pszTmp, *pwsValue, (nBufLen+1)*sizeof(AECHAR)); FREEIF(pszData); FREEIF(pszTmp); } return true; }
static int proc_buddyinfo_normalize(_TOPIARY_BASE_T *base) { _TOPIARY_RESULTS_T *results = base->current->results; _TOPIARY_ARRAY_T *array = base->current->array; size_t nrows = array->vector->length; _TOPIARY_DEBUG("Nrows %zd\n", nrows); char ***values = (char ***) array->vector->values; char *val; int i, j; char buf[64]; int n1 = 0; STRLCAT(buf, "/", n1, sizeof(buf)); _topiary_results_init(results, nrows); for (i = 0; i < nrows; i++) { char **value1 = (char **) values[i]; size_t ncols = array->vector->children[i]->length; _TOPIARY_DEBUG("%d:Ncols %zd\n", i, ncols); char *rowkey = value1[0]; if (!rowkey) continue; _TOPIARY_DEBUG("%d:Rowkey %s\n", i, rowkey); char *rownum = value1[1]; if (!rownum) continue; _TOPIARY_DEBUG("%d:Rownum %s\n", i, rownum); char *zone = value1[3]; if (!rownum) continue; _TOPIARY_DEBUG("%d:Zone %s\n", i, zone); int n2 = n1; STRLCAT(buf, rowkey, n2, sizeof(buf)); STRLCAT(buf, rownum, n2, sizeof(buf)); STRLCAT(buf, "/", n2, sizeof(buf)); STRLCAT(buf, zone, n2, sizeof(buf)); STRLCAT(buf, "/", n2, sizeof(buf)); _TOPIARY_DEBUG("%d:base key %s\n", i, buf); for (j = 4; j < ncols; j++) { int k = j - 4; val = value1[j]; if (!val || !val[0]) continue; int n3 = n2; INTCAT(buf, k, n3, sizeof(buf)); _TOPIARY_DEBUG("%d:key %s\n", i, buf); _TOPIARY_DEBUG("%d,%d:value %s\n", i, j, val); int myval = (1 << k) * results->page_size * atoi(val); _topiary_results_add_int(results, buf, myval); } } return TOPIARY_OK; }
/*VARARGS1*/ int exec(int type, ...) { va_list args; int i; int procuid; int procgid; int ret; int fr_flg; char *cp; char *infile; char *outfile; char *errfile; char *sep; char **listp; char **file_list; char *printerName; char *printerNameToShow; static char nameBuf[100]; char *clean_title; PSTATUS *printer; RSTATUS *request; FSTATUS *form; EXEC *ep; PWSTATUS *pwheel; time_t now; struct passwd *pwp; #ifdef LP_USE_PAPI_ATTR struct stat tmpBuf; char tmpName[BUFSIZ]; char *path = NULL; #endif char *av[ARG_MAX]; char **envp = NULL; int ac = 0; char *mail_zonename = NULL; char *slabel = NULL; syslog(LOG_DEBUG, "exec(%s)", _exec_name(type)); memset(av, 0, sizeof (*av)); va_start (args, type); switch (type) { case EX_INTERF: printer = va_arg(args, PSTATUS *); request = printer->request; ep = printer->exec; break; case EX_FAULT_MESSAGE: printer = va_arg(args, PSTATUS *); request = va_arg(args, RSTATUS *); if (! ( printer->status & (PS_FORM_FAULT | PS_SHOW_FAULT))) { return(0); } ep = printer->fault_exec; printerName = (printer->printer && printer->printer->name ? printer->printer->name : "??"); snprintf(nameBuf, sizeof (nameBuf), "%s (on %s)\n", printerName, Local_System); printerNameToShow = nameBuf; (void) time(&now); (void) strftime(time_buf, sizeof (time_buf), NULL, localtime(&now)); break; case EX_SLOWF: request = va_arg(args, RSTATUS *); ep = request->exec; break; case EX_NOTIFY: request = va_arg(args, RSTATUS *); if (request->request->actions & ACT_NOTIFY) { errno = EINVAL; return (-1); } ep = request->exec; break; case EX_ALERT: printer = va_arg(args, PSTATUS *); if (!(printer->printer->fault_alert.shcmd)) { errno = EINVAL; return(-1); } ep = printer->alert->exec; break; case EX_PALERT: pwheel = va_arg(args, PWSTATUS *); ep = pwheel->alert->exec; break; case EX_FORM_MESSAGE: (void) time(&now); (void) strftime(time_buf, sizeof (time_buf), NULL, localtime(&now)); /*FALLTHRU*/ case EX_FALERT: form = va_arg(args, FSTATUS *); ep = form->alert->exec; break; default: errno = EINVAL; return(-1); } va_end (args); if (!ep || (ep->pid > 0)) { errno = EBUSY; return(-1); } ep->flags = 0; key = ep->key = getkey(); switch ((ep->pid = Fork1(ep))) { case -1: relock (); return(-1); case 0: /* * We want to be able to tell our parent how we died. */ lp_alloc_fail_handler = child_mallocfail; break; default: switch(type) { case EX_INTERF: request->request->outcome |= RS_PRINTING; break; case EX_NOTIFY: request->request->outcome |= RS_NOTIFYING; break; case EX_SLOWF: request->request->outcome |= RS_FILTERING; request->request->outcome &= ~RS_REFILTER; break; } return(0); } for (i = 0; i < NSIG; i++) (void)signal (i, SIG_DFL); (void)signal (SIGALRM, SIG_IGN); (void)signal (SIGTERM, sigtrap); closelog(); for (i = 0; i < OpenMax; i++) if (i != ChildMd->writefd) Close (i); openlog("lpsched", LOG_PID|LOG_NDELAY|LOG_NOWAIT, LOG_LPR); setpgrp(); /* Set a default path */ addenv (&envp, "PATH", "/usr/lib/lp/bin:/usr/bin:/bin:/usr/sbin:/sbin"); /* copy locale related variables */ addenv (&envp, "TZ", getenv("TZ")); addenv (&envp, "LANG", getenv("LANG")); addenv (&envp, "LC_ALL", getenv("LC_ALL")); addenv (&envp, "LC_COLLATE", getenv("LC_COLLATE")); addenv (&envp, "LC_CTYPE", getenv("LC_CTYPE")); addenv (&envp, "LC_MESSAGES", getenv("LC_MESSAGES")); addenv (&envp, "LC_MONETARY", getenv("LC_MONETARY")); addenv (&envp, "LC_NUMERIC", getenv("LC_NUMERIC")); addenv (&envp, "LC_TIME", getenv("LC_TIME")); sprintf ((cp = BIGGEST_NUMBER_S), "%ld", key); addenv (&envp, "SPOOLER_KEY", cp); #if defined(DEBUG) addenv (&envp, "LPDEBUG", (debug? "1" : "0")); #endif /* * Open the standard input, standard output, and standard error. */ switch (type) { case EX_SLOWF: case EX_INTERF: /* * stdin: /dev/null * stdout: /dev/null (EX_SLOWF), printer port (EX_INTERF) * stderr: req# */ infile = 0; outfile = 0; errfile = makereqerr(request); break; case EX_NOTIFY: /* * stdin: req# * stdout: /dev/null * stderr: /dev/null */ infile = makereqerr(request); outfile = 0; errfile = 0; break; case EX_ALERT: case EX_FALERT: case EX_PALERT: case EX_FAULT_MESSAGE: case EX_FORM_MESSAGE: /* * stdin: /dev/null * stdout: /dev/null * stderr: /dev/null */ infile = 0; outfile = 0; errfile = 0; break; } if (infile) { if (Open(infile, O_RDONLY) == -1) Done (EXEC_EXIT_NOPEN, errno); } else { if (Open("/dev/null", O_RDONLY) == -1) Done (EXEC_EXIT_NOPEN, errno); } if (outfile) { if (Open(outfile, O_CREAT|O_TRUNC|O_WRONLY, 0600) == -1) Done (EXEC_EXIT_NOPEN, errno); } else { /* * If EX_INTERF, this is still needed to cause the * standard error channel to be #2. */ if (Open("/dev/null", O_WRONLY) == -1) Done (EXEC_EXIT_NOPEN, errno); } if (errfile) { if (Open(errfile, O_CREAT|O_TRUNC|O_WRONLY, 0600) == -1) Done (EXEC_EXIT_NOPEN, errno); } else { if (Open("/dev/null", O_WRONLY) == -1) Done (EXEC_EXIT_NOPEN, errno); } switch (type) { case EX_INTERF: /* * Opening a ``port'' can be dangerous to our health: * * - Hangups can occur if the line is dropped. * - The printer may send an interrupt. * - A FIFO may be closed, generating SIGPIPE. * * We catch these so we can complain nicely. */ trap_fault_signals (); (void)Close (1); if (strchr (request->request->user, '@')) { procuid = Lp_Uid; procgid = Lp_Gid; } else { procuid = request->secure->uid; procgid = request->secure->gid; } if (printer->printer->dial_info) { ret = open_dialup(request->printer_type, printer->printer); if (ret == 0) do_undial = 1; } else { ret = open_direct(request->printer_type, printer->printer); do_undial = 0; /* this is a URI */ if (is_printer_uri(printer->printer->device) == 0) addenv(&envp, "DEVICE_URI", printer->printer->device); } addenv(&envp, "DEVICE_URI", printer->printer->device); if (ret != 0) Done (ret, errno); if (!(request->request->outcome & RS_FILTERED)) file_list = request->request->file_list; else { register int count = 0; register char * num = BIGGEST_REQID_S; register char * prefix; prefix = makestr( Lp_Temp, "/F", getreqno(request->secure->req_id), "-", (char *)0 ); file_list = (char **)Malloc( (lenlist(request->request->file_list) + 1) * sizeof(char *) ); for ( listp = request->request->file_list; *listp; listp++ ) { sprintf (num, "%d", count + 1); file_list[count] = makestr( prefix, num, (char *)0 ); count++; } file_list[count] = 0; } #ifdef LP_USE_PAPI_ATTR /* * Check if the PAPI job attribute file exists, if it does * pass the file's pathname to the printer interface script * in an environment variable. This file is created when * print jobs are submitted via the PAPI interface. */ snprintf(tmpName, sizeof (tmpName), "%s-%s", getreqno(request->secure->req_id), LP_PAPIATTRNAME); path = makepath(Lp_Temp, tmpName, (char *)0); if ((path != NULL) && (stat(path, &tmpBuf) == 0)) { /* * IPP job attribute file exists for this job so * set the environment variable */ addenv(&envp, "ATTRPATH", path); } Free(path); /* * now set environment variable for the printer's PostScript * Printer Description (PPD) file, this is used by the filter * when forming the print data for this printer. */ if ((request->printer != NULL) && (request->printer->printer != NULL) && (request->printer->printer->name != NULL)) { snprintf(tmpName, sizeof (tmpName), "%s.ppd", request->printer->printer->name); path = makepath(ETCDIR, "ppd", tmpName, (char *)0); if ((path != NULL) && (stat(path, &tmpBuf) == 0)) { addenv(&envp, "PPD", path); } Free(path); } #endif if (request->printer_type) addenv(&envp, "TERM", request->printer_type); if (!(printer->printer->daisy)) { register char * chset = 0; register char * csp; if ( request->form && request->form->form->chset && request->form->form->mandatory && !STREQU(NAME_ANY, request->form->form->chset) ) chset = request->form->form->chset; else if ( request->request->charset && !STREQU(NAME_ANY, request->request->charset) ) chset = request->request->charset; if (chset) { csp = search_cslist( chset, printer->printer->char_sets ); /* * The "strtok()" below wrecks the string * for future use, but this is a child * process where it won't be needed again. */ addenv (&envp, "CHARSET", (csp? strtok(csp, "=") : chset) ); } } if (request->fast) addenv(&envp, "FILTER", request->fast); /* * Add the sensitivity label to the environment for * banner page and header/footer processing */ if (is_system_labeled() && request->secure->slabel != NULL) addenv(&envp, "SLABEL", request->secure->slabel); /* * Add the system name to the user name (ala system!user) * unless it is already there. RFS users may have trouble * here, sorry! */ cp = strchr(request->secure->user, '@'); allTraysWithForm(printer, request->form); /* * Fix for 4137389 * Remove double quotes from title string. */ fr_flg = 1; clean_title = strdup(NB(request->request->title)); if (clean_title == NULL) { /* * strdup failed. We're probably hosed * but try setting clean_title * to original title and continuing. */ clean_title = NB(request->request->title); fr_flg = 0; } else if (strcmp(clean_title, "") != 0) { char *ct_p; for (ct_p = clean_title; *ct_p != NULL; ct_p++) { if (*ct_p == '"') *ct_p = ' '; } } av[ac++] = arg_string(TRUSTED, "%s/%s", Lp_A_Interfaces, printer->printer->name); av[ac++] = arg_string(TRUSTED, "%s", request->secure->req_id); av[ac++] = arg_string(UNTRUSTED, "%s", request->request->user); av[ac++] = arg_string(TRUSTED, "%s", clean_title); av[ac++] = arg_string(TRUSTED, "%d", request->copies); if (fr_flg) free (clean_title); sep = ""; /* * Do the administrator defined key=value pair options */ argbuf[0] = '\0'; if (printer->printer->options) { char **tmp = printer->printer->options; while(*tmp != NULL) { STRLCAT(argbuf, sep, sizeof (argbuf)); sep = " "; STRLCAT(argbuf, *tmp++, sizeof (argbuf)); } } /* * Do the administrator defined ``stty'' stuff before * the user's -o options, to allow the user to override. */ if (printer->printer->stty) { STRLCAT (argbuf, sep, sizeof (argbuf)); sep = " "; STRLCAT (argbuf, "stty='", sizeof (argbuf)); STRLCAT (argbuf, printer->printer->stty, sizeof (argbuf)); STRLCAT (argbuf, "'", sizeof (argbuf)); } /* * Do all of the user's options except the cpi/lpi/etc. * stuff, which is done separately. */ if (request->request->options) { listp = dashos(request->request->options); while (*listp) { if ( !STRNEQU(*listp, "cpi=", 4) && !STRNEQU(*listp, "lpi=", 4) && !STRNEQU(*listp, "width=", 6) && !STRNEQU(*listp, "length=", 7) ) { STRLCAT (argbuf, sep, sizeof (argbuf)); sep = " "; STRLCAT (argbuf, *listp, sizeof (argbuf)); } listp++; } } /* * The "pickfilter()" routine (from "validate()") * stored the cpi/lpi/etc. stuff that should be * used for this request. It chose form over user, * and user over printer. */ if (request->cpi) { STRLCAT (argbuf, sep, sizeof (argbuf)); sep = " "; STRLCAT (argbuf, "cpi=", sizeof (argbuf)); STRLCAT (argbuf, request->cpi, sizeof (argbuf)); } if (request->lpi) { STRLCAT (argbuf, sep, sizeof (argbuf)); sep = " "; STRLCAT (argbuf, "lpi=", sizeof (argbuf)); STRLCAT (argbuf, request->lpi, sizeof (argbuf)); } if (request->pwid) { STRLCAT (argbuf, sep, sizeof (argbuf)); sep = " "; STRLCAT (argbuf, "width=", sizeof (argbuf)); STRLCAT (argbuf, request->pwid, sizeof (argbuf)); } if (request->plen) { STRLCAT (argbuf, sep, sizeof (argbuf)); sep = " "; STRLCAT (argbuf, "length=", sizeof (argbuf)); STRLCAT (argbuf, request->plen, sizeof (argbuf)); } /* * Do the ``raw'' bit last, to ensure it gets * done. If the user doesn't want this, then he or * she can do the correct thing using -o stty= * and leaving out the -r option. */ if (request->request->actions & ACT_RAW) { STRLCAT (argbuf, sep, sizeof (argbuf)); sep = " "; STRLCAT (argbuf, "stty=-opost", sizeof (argbuf)); } /* the "options" */ av[ac++] = arg_string(UNTRUSTED, "%s", argbuf); for (listp = file_list; *listp; listp++) av[ac++] = arg_string(TRUSTED, "%s", *listp); (void)chfiles (file_list, procuid, procgid); break; case EX_SLOWF: if (request->slow) addenv(&envp, "FILTER", request->slow); if (strchr (request->request->user, '@')) { procuid = Lp_Uid; procgid = Lp_Gid; } else { procuid = request->secure->uid; procgid = request->secure->gid; } cp = _alloc_files( lenlist(request->request->file_list), getreqno(request->secure->req_id), procuid, procgid); av[ac++] = arg_string(TRUSTED, "%s", Lp_Slow_Filter); av[ac++] = arg_string(TRUSTED, "%s/%s", Lp_Temp, cp); for (listp = request->request->file_list; *listp; listp++) av[ac++] = arg_string(TRUSTED, "%s", *listp); (void)chfiles (request->request->file_list, procuid, procgid); #ifdef LP_USE_PAPI_ATTR /* * Check if the PAPI job attribute file exists, if it does * pass the file's pathname to the slow-filters in an * environment variable. Note: this file is created when * print jobs are submitted via the PAPI interface. */ snprintf(tmpName, sizeof (tmpName), "%s-%s", getreqno(request->secure->req_id), LP_PAPIATTRNAME); path = makepath(Lp_Temp, tmpName, (char *)0); if ((path != NULL) && (stat(path, &tmpBuf) == 0)) { /* * IPP job attribute file exists for this job so * set the environment variable */ addenv(&envp, "ATTRPATH", path); } Free(path); /* * now set environment variable for the printer's PostScript * Printer Description (PPD) file, this is used by the filter * when forming the print data for this printer. */ if ((request->printer != NULL) && (request->printer->printer != NULL) && (request->printer->printer->name != NULL)) { snprintf(tmpName, sizeof (tmpName), "%s.ppd", request->printer->printer->name); path = makepath(ETCDIR, "ppd", tmpName, (char *)0); if ((path != NULL) && (stat(path, &tmpBuf) == 0)) { addenv(&envp, "PPD", path); } Free(path); } #endif break; case EX_ALERT: procuid = Lp_Uid; procgid = Lp_Gid; (void)Chown (printer->alert->msgfile, procuid, procgid); av[ac++] = arg_string(TRUSTED, "%s/%s/%s", Lp_A_Printers, printer->printer->name, ALERTSHFILE); av[ac++] = arg_string(TRUSTED, "%s", printer->alert->msgfile); break; case EX_PALERT: procuid = Lp_Uid; procgid = Lp_Gid; (void)Chown (pwheel->alert->msgfile, procuid, procgid); av[ac++] = arg_string(TRUSTED, "%s/%s/%s", Lp_A_PrintWheels, pwheel->pwheel->name, ALERTSHFILE); av[ac++] = arg_string(TRUSTED, "%s", printer->alert->msgfile); break; case EX_FALERT: procuid = Lp_Uid; procgid = Lp_Gid; (void)Chown (form->alert->msgfile, procuid, procgid); av[ac++] = arg_string(TRUSTED, "%s/%s/%s", Lp_A_Forms, form->form->name, ALERTSHFILE); av[ac++] = arg_string(TRUSTED, "%s", printer->alert->msgfile); break; case EX_FORM_MESSAGE: procuid = Lp_Uid; procgid = Lp_Gid; av[ac++] = arg_string(TRUSTED, "%s/form", Lp_A_Faults); av[ac++] = arg_string(TRUSTED, "%s", form->form->name); av[ac++] = arg_string(TRUSTED, "%s", time_buf); av[ac++] = arg_string(TRUSTED, "%s/%s/%s", Lp_A_Forms, form->form->name, FORMMESSAGEFILE); break; case EX_FAULT_MESSAGE: procuid = Lp_Uid; procgid = Lp_Gid; av[ac++] = arg_string(TRUSTED, "%s/printer", Lp_A_Faults); av[ac++] = arg_string(TRUSTED, "%s", printerNameToShow); av[ac++] = arg_string(TRUSTED, "%s", time_buf); av[ac++] = arg_string(TRUSTED, "%s/%s/%s", Lp_A_Printers, printerName, FAULTMESSAGEFILE); break; case EX_NOTIFY: if (request->request->alert) { if (strchr(request->request->user, '@')) { procuid = Lp_Uid; procgid = Lp_Gid; } else { procuid = request->secure->uid; procgid = request->secure->gid; } av[ac++] = arg_string(TRUSTED, "%s", request->request->alert); } else { char *user = strdup(request->request->user); clean_string(user); slabel = request->secure->slabel; if (request->request->actions & ACT_WRITE) { av[ac++] = arg_string(TRUSTED, "%s", BINWRITE); snprintf(argbuf, sizeof (argbuf), "%s %s || %s %s", BINWRITE, user, BINMAIL, user ); av[ac++] = arg_string(TRUSTED, "/bin/sh"); av[ac++] = arg_string(TRUSTED, "-c"); av[ac++] = arg_string(TRUSTED, "%s", argbuf); } else if ((getzoneid() == GLOBAL_ZONEID) && is_system_labeled() && (slabel != NULL)) { /* * If in the global zone and the system is * labeled, mail is handled via a local * labeled zone that is the same label as * the request. */ if ((mail_zonename = get_labeled_zonename(slabel)) == (char *)-1) { /* * Cannot find labeled zone, just * return 0. */ return(0); } } if (mail_zonename == NULL) { procuid = Lp_Uid; procgid = Lp_Gid; av[ac++] = arg_string(TRUSTED, "%s", BINMAIL); av[ac++] = arg_string(UNTRUSTED, "%s", user); } else { procuid = getuid(); procgid = getgid(); av[ac++] = arg_string(TRUSTED, "%s", "/usr/sbin/zlogin"); av[ac++] = arg_string(TRUSTED, "%s", mail_zonename); av[ac++] = arg_string(TRUSTED, "%s", BINMAIL); av[ac++] = arg_string(UNTRUSTED, "%s", user); Free(mail_zonename); } free(user); } break; } av[ac++] = NULL; Fork2 (); /* only the child returns */ /* * Correctly set up the supplemental group list * for proper file access (before execl the interface program) */ pwp = getpwuid(procuid); if (pwp == NULL) { note("getpwuid(%d) call failed\n", procuid); } else if (initgroups(pwp->pw_name, procgid) < 0) { note("initgroups() call failed %d\n", errno); } setgid (procgid); setuid (procuid); /* * The shell doesn't allow the "trap" builtin to set a trap * for a signal ignored when the shell is started. Thus, don't * turn off signals in the last child! */ #ifdef DEBUG for (i = 0; av[i] != NULL; i++) note("exec(%s): av[%d] = %s", _exec_name(type), i, av[i]); for (i = 0; envp[i] != NULL; i++) note("exec(%s): envp[%d] = %s", _exec_name(type), i, envp[i]); #endif execvpe(av[0], av, envp); Done (EXEC_EXIT_NEXEC, errno); /*NOTREACHED*/ return (0); }
void OS_get_table() { kvm_t *kd; char errbuf[_POSIX2_LINE_MAX]; struct kinfo_proc *procs; int count; int i, argcount; int ttynum; long start; char *ttydev; char cmndline[ARG_MAX+1]; char **pargv; /* for bless_into_proc */ static char format[F_LASTFIELD + 2]; char state[20]; /* open the kvm interface */ if ((kd = kvm_open(NULL, NULL, NULL, KVM_NO_FILES, errbuf)) == NULL) { ppt_croak("kvm_open: %s", errbuf); } /* get processes */ if ((procs = kvm_getprocs(kd, KERN_PROC_ALL, 0, sizeof(*procs), &count)) == NULL) { kvm_close(kd); ppt_croak("kvm_getprocs: %s", kvm_geterr(kd)); } /* bless_into_proc each process's information */ for (i=0; i < count; i++) { STRLCPY(1,format,Defaultformat); /* get ttydev */ ttynum=procs[i].p_tdev; ttydev=devname(ttynum, S_IFCHR); if (ttydev == NULL) ttydev = "??"; /* process state */ switch (procs[i].p_stat) { case SIDL: STRLCPY(2,state,"IDLE"); break; case SRUN: STRLCPY(3,state,"RUN"); break; case SSLEEP: STRLCPY(4,state,"SLEEP"); break; case SSTOP: STRLCPY(5,state,"STOP"); break; case SZOMB: STRLCPY(6,state,"ZOMBIE"); break; default: STRLCPY(7,state,"UNKNOWN"); break; } /* arguments */ cmndline[0] = '\0'; pargv = kvm_getargv(kd, (const struct kinfo_proc *) &(procs[i]), 0); if (pargv) { argcount = 0; while (pargv[argcount] && strlen(cmndline)+strlen(pargv[argcount])+1 <= ARG_MAX) { STRLCAT(1,cmndline,pargv[argcount]); if (pargv[argcount+1]) { STRLCAT(2,cmndline," "); } argcount++; } } /* everything else is straightforward, bless the lot */ bless_into_proc( format, Fields, ttynum, procs[i].p_ruid, procs[i].p_rgid, procs[i].p_uid, procs[i].p_gid, procs[i].p_pid, procs[i].p_ppid, procs[i].p__pgid, procs[i].p_sid, procs[i].p_rtime_sec, procs[i].p_uutime_sec, procs[i].p_ustime_sec, procs[i].p_ustart_sec, procs[i].p_comm, state, ttydev, cmndline ); } if (kd) { kvm_close(kd); } }