int revm_create_new_workspace(char *ws_name) { revmjob_t *job; char logbuf[BUFSIZ]; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); if (!revm_valid_workspace(ws_name)) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Incorrect workspace name", -1); job = hash_get(&world.jobs, ws_name); if (job == NULL) { /* create a new workspace */ job = revm_clone_job(strdup(ws_name), world.curjob); hash_add(&world.jobs, ws_name, job); if (revm_own_job(job)) { /* switch */ snprintf(logbuf, BUFSIZ - 1, "\n [+] Workspace : %s \n\n", ws_name); revm_output(logbuf); revm_prompt_log(); /* Switch to the new job */ revm_switch_job(job); /* Update the screen */ revm_screen_update(TRUE, 0); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); } } else if (job->ws.active) { snprintf(logbuf, BUFSIZ - 1, "\n [+] Already in workspace : %s\n\n", ws_name); revm_output(logbuf); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); } PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Incorrect workspace name", -1); }
/** * Switch to the next workspace * */ int revm_workspace_next() { u_int index, entrie; char **keys; int keynbr; revmjob_t *curjob; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); keys = hash_get_keys(&world.jobs, &keynbr); if (keynbr <= 1) PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); /* Search the current index */ for (index = 0; index < keynbr; index++) { curjob = hash_get(&world.jobs, keys[index]); if (revm_own_job(curjob) && curjob == world.curjob) { entrie = index; break; } } /* Search the next entrie */ for (entrie = (entrie+1) % keynbr; entrie < keynbr; entrie = (entrie+1) % keynbr) { curjob = hash_get(&world.jobs, keys[entrie]); if (revm_own_job(curjob)) { /* If we found the current job, we made a loop, so we break */ if (curjob == world.curjob) break; revm_switch_job(curjob); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 1); } } PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Unable to find workspace to switch on", -1); }