static void do_print (NCDModuleInst *i, NCDValRef args, int ln) { size_t num_args = NCDVal_ListCount(args); for (size_t j = 0; j < num_args; j++) { NCDValRef arg = NCDVal_ListGet(args, j); ASSERT(NCDVal_IsString(arg)) b_cstring arg_cstr = NCDVal_StringCstring(arg); B_CSTRING_LOOP_RANGE(arg_cstr, 0, arg_cstr.length, pos, chunk_data, chunk_length, { size_t chunk_pos = 0; while (chunk_pos < chunk_length) { ssize_t res = fwrite(chunk_data + chunk_pos, 1, chunk_length - chunk_pos, stdout); if (res <= 0) { goto out; } chunk_pos += res; } }) }
int NCDBProcessOpts_Init2 (NCDBProcessOpts *o, NCDValRef opts_arg, NCDBProcessOpts_func_unknown func_unknown, void *func_unknown_user, NCDModuleInst *i, int blog_channel, int *out_keep_stdout, int *out_keep_stderr) { if (!NCDVal_IsInvalid(opts_arg) && !NCDVal_IsMap(opts_arg)) { NCDModuleInst_Backend_Log(i, blog_channel, BLOG_ERROR, "options must be a map"); goto fail0; } o->username = NULL; o->do_setsid = 0; int keep_stdout = 0; int keep_stderr = 0; if (!NCDVal_IsInvalid(opts_arg)) { for (NCDValMapElem me = NCDVal_MapFirst(opts_arg); !NCDVal_MapElemInvalid(me); me = NCDVal_MapNext(opts_arg, me)) { NCDValRef key = NCDVal_MapElemKey(opts_arg, me); NCDValRef val = NCDVal_MapElemVal(opts_arg, me); if (NCDVal_IsString(key) && NCDVal_StringEquals(key, "keep_stdout")) { keep_stdout = ncd_read_boolean(val); } else if (NCDVal_IsString(key) && NCDVal_StringEquals(key, "keep_stderr")) { keep_stderr = ncd_read_boolean(val); } else if (NCDVal_IsString(key) && NCDVal_StringEquals(key, "do_setsid")) { o->do_setsid = ncd_read_boolean(val); } else if (NCDVal_IsString(key) && NCDVal_StringEquals(key, "username")) { if (!NCDVal_IsStringNoNulls(val)) { NCDModuleInst_Backend_Log(i, blog_channel, BLOG_ERROR, "username must be a string without nulls"); goto fail1; } b_cstring cstr = NCDVal_StringCstring(val); o->username = b_cstring_strdup(cstr, 0, cstr.length); if (!o->username) { NCDModuleInst_Backend_Log(i, blog_channel, BLOG_ERROR, "b_cstring_strdup failed"); goto fail1; } } else { if (!func_unknown || !func_unknown(func_unknown_user, key, val)) { NCDModuleInst_Backend_Log(i, blog_channel, BLOG_ERROR, "unknown option"); goto fail1; } } } } o->nfds = 0; if (keep_stdout) { o->fds[o->nfds] = 1; o->fds_map[o->nfds++] = 1; } if (keep_stderr) { o->fds[o->nfds] = 2; o->fds_map[o->nfds++] = 2; } o->fds[o->nfds] = -1; if (out_keep_stdout) { *out_keep_stdout = keep_stdout; } if (out_keep_stderr) { *out_keep_stderr = keep_stderr; } return 1; fail1: if (o->username) { BFree(o->username); } fail0: return 0; }