int dogetproject(const char **list) { struct project proj; struct project *pproj; projid_t projid; void *buf[PROJECT_BUFSZ]; int rc = EXC_SUCCESS; char *ptr; if (list == NULL || *list == NULL) { setprojent(); while ((pproj = getprojent(&proj, buf, PROJECT_BUFSZ)) != NULL) (void) putprojent(pproj, stdout); endprojent(); } else { for (; *list != NULL; list++) { projid = strtol(*list, &ptr, 10); if (ptr == *list) pproj = getprojbyname(*list, &proj, buf, PROJECT_BUFSZ); else pproj = getprojbyid(projid, &proj, buf, PROJECT_BUFSZ); if (pproj == NULL) rc = EXC_NAME_NOT_FOUND; else (void) putprojent(pproj, stdout); } } return (rc); }
void set_project(struct passwd *pw) { struct project proj; char buf[PROJECT_BUFSZ]; int errval; debug_decl(set_project, SUDO_DEBUG_UTIL) /* * Collect the default project for the user and settaskid */ setprojent(); if (getdefaultproj(pw->pw_name, &proj, buf, sizeof(buf)) != NULL) { errval = setproject(proj.pj_name, pw->pw_name, TASK_NORMAL); switch(errval) { case 0: break; case SETPROJ_ERR_TASK: switch (errno) { case EAGAIN: sudo_warnx(U_("resource control limit has been reached")); break; case ESRCH: sudo_warnx(U_("user \"%s\" is not a member of project \"%s\""), pw->pw_name, proj.pj_name); break; case EACCES: sudo_warnx(U_("the invoking task is final")); break; default: sudo_warnx(U_("could not join project \"%s\""), proj.pj_name); } case SETPROJ_ERR_POOL: switch (errno) { case EACCES: sudo_warnx(U_("no resource pool accepting default bindings " "exists for project \"%s\""), proj.pj_name); break; case ESRCH: sudo_warnx(U_("specified resource pool does not exist for " "project \"%s\""), proj.pj_name); break; default: sudo_warnx(U_("could not bind to default resource pool for " "project \"%s\""), proj.pj_name); } break; default: if (errval <= 0) { sudo_warnx(U_("setproject failed for project \"%s\""), proj.pj_name); } else { sudo_warnx(U_("warning, resource control assignment failed for " "project \"%s\""), proj.pj_name); } } } else { sudo_warn("getdefaultproj"); } endprojent(); debug_return; }