int OSLShader::find_attribute(KernelGlobals *kg, const ShaderData *sd, uint id, AttributeElement *elem) { /* for OSL, a hash map is used to lookup the attribute by name. */ int object = sd->object*ATTR_PRIM_TYPES; #ifdef __HAIR__ if(sd->type & PRIMITIVE_ALL_CURVE) object += ATTR_PRIM_CURVE; #endif OSLGlobals::AttributeMap &attr_map = kg->osl->attribute_map[object]; ustring stdname(std::string("geom:") + std::string(Attribute::standard_name((AttributeStandard)id))); OSLGlobals::AttributeMap::const_iterator it = attr_map.find(stdname); if (it != attr_map.end()) { const OSLGlobals::Attribute &osl_attr = it->second; *elem = osl_attr.elem; if(sd->prim == PRIM_NONE && (AttributeElement)osl_attr.elem != ATTR_ELEMENT_MESH) return ATTR_STD_NOT_FOUND; /* return result */ return (osl_attr.elem == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : osl_attr.offset; } else return (int)ATTR_STD_NOT_FOUND; }
int mtnexec_fork(MTNSVR *svr, ARG arg) { int f; int pp[3][2]; MTNJOB *job; struct epoll_event ev; if(!(job = mtnexec_wait())){ return(-1); } mtnexec_initjob(job, arg); job->svr = svr; job->argc = cmdargs(job); job->cmd = joinarg(job->argc, " "); job->std = stdname(job); job->echo = (ctx->echo) ? convarg(newstr(ctx->echo), job) : NULL; job->putarg = cpconvarg(ctx->putarg, ctx->conv ? job : NULL); job->getarg = cpconvarg(ctx->getarg, ctx->conv ? job : NULL); if(is_empty(job->cmd)){ jclose(job); return(-1); } if(ctx->dryrun){ mtnexec_dryrun(job); jclose(job); return(0); } if(ctx->verbose){ mtnexec_verbose(job); } pipe(pp[0]); pipe(pp[1]); pipe(pp[2]); gettimeofday(&(job->start), NULL); job->pid = fork(); if(job->pid == -1){ job->pid = 0; close(pp[0][0]); close(pp[0][1]); close(pp[1][0]); close(pp[1][1]); close(pp[2][0]); close(pp[2][1]); mtnlogger(mtn, 0, "[error] %s: %s\n", __func__, strerror(errno)); return(-1); } if(job->pid){ close(pp[0][1]); close(pp[1][1]); close(pp[2][1]); job->ctl = pp[0][0]; job->out = pp[1][0]; job->err = pp[2][0]; job->cct = 1; job->pstat = calloc(1, sizeof(MTNPROCSTAT)); job->pstat[0].pid = job->pid; fcntl(job->ctl, F_SETFD, FD_CLOEXEC); fcntl(job->out, F_SETFD, FD_CLOEXEC); fcntl(job->err, F_SETFD, FD_CLOEXEC); fcntl(job->out, F_SETFL, O_NONBLOCK); fcntl(job->err, F_SETFL, O_NONBLOCK); ev.data.ptr = job; ev.events = EPOLLIN; if(epoll_ctl(ctx->efd, EPOLL_CTL_ADD, job->out, &ev) == -1){ mtnlogger(mtn, 0, "[error] %s: epoll_ctl %s stdout fd=%d\n", __func__, strerror(errno), job->out); } if(epoll_ctl(ctx->efd, EPOLL_CTL_ADD, job->err, &ev) == -1){ mtnlogger(mtn, 0, "[error] %s: epoll_ctl %s stderr fd=%d\n", __func__, strerror(errno), job->err); } char d; while(read(job->ctl,&d,1)); close(job->ctl); job->ctl = 0; return(0); } //===== execute process ===== setpgid(0,0); close(pp[0][0]); close(pp[1][0]); close(pp[2][0]); if(strlen(job->std[0])){ f = open(job->std[0], O_RDONLY); if(f == -1){ mtnlogger(mtn, 0, "[error] %s: %s %s\n", __func__, strerror(errno), job->std[0]); _exit(1); } close(0); dup2(f, 0); close(f); } if(strlen(job->std[1])){ f = open(job->std[1], O_WRONLY | O_TRUNC | O_CREAT, 0660); if(f == -1){ mtnlogger(mtn, 0, "[error] %s: %s %s\n", __func__, strerror(errno), job->std[1]); _exit(1); } close(1); if(dup2(f, 1) == -1){ mtnlogger(mtn, 0, "[error] %s: %s\n", __func__, strerror(errno)); _exit(1); } close(f); }else{ close(1); dup2(pp[1][1], 1); } if(strlen(job->std[2])){ f = open(job->std[2], O_WRONLY | O_TRUNC | O_CREAT, 0660); if(f == -1){ mtnlogger(mtn, 0, "[error] %s: %s %s\n", __func__, strerror(errno), job->std[2]); _exit(1); } close(2); dup2(f, 2); close(f); }else{ close(2); dup2(pp[2][1], 2); } close(pp[1][1]); close(pp[2][1]); job->ctl = pp[0][1]; if(job->svr){ /*===== remote execute process =====*/ mtn_exec(mtn, job); mtnlogger(mtn, 0, "[error] %s: host=%s addr=%s %s '%s'\n", __func__, job->svr->host, inet_ntoa(job->svr->addr.addr.in.sin_addr), strerror(errno), job->cmd); }else{ /*===== local exec process =====*/ close(job->ctl); job->ctl = 0; execl("/bin/sh", "/bin/sh", "-c", job->cmd, NULL); mtnlogger(mtn, 0, "[error] %s: %s '%s'\n", __func__, strerror(errno), job->cmd); } _exit(127); }