void do_resign(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; CHAR_DATA *gch; int found = 0; ROOM_INDEX_DATA *location; char buf[MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; if (ch->in_room != NULL) { if (!IS_SET(ch->in_room->room_flags, ROOM_ARENA)) { send_to_char("Your not in the arena.\n\r",ch); return; } } sprintf(buf,"%s resigns from the arena",ch->name); do_info(ch,buf); if ((location = get_room_index(ROOM_VNUM_ALTAR)) == NULL) return; char_from_room(ch); char_to_room(ch, location); ch->fight_timer = 0; do_restore(ch, "self"); do_call(ch, "all"); ch->pcdata->alosses++; for (victim = char_list; victim != NULL; victim = victim->next) { if (IS_NPC(victim)) continue; if (victim->in_room != NULL && IS_SET(victim->in_room->room_flags, ROOM_ARENA) && victim->pcdata->chobj == NULL) { gch = victim; found++; } } if (found == 1) { sprintf(buf,"#C%s #oemerges victorious from the #Rarena#n",gch->name); gch->pcdata->awins++; do_info(gch,buf); if ((location = get_room_index(ROOM_VNUM_ALTAR)) == NULL) return; char_from_room(gch); char_to_room(gch, location); gch->fight_timer = 0; do_restore(gch, "self"); win_prize(gch); pulse_arena = PULSE_ARENA; } return; }
void do_martyr( CHAR_DATA *ch, char *argument ) { CHAR_DATA *ich; if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_ANGEL)) { send_to_char("Huh?\n\r",ch); return; } if (ch->pcdata->powers[ANGEL_LOVE] < 5) { send_to_char("Your love for mortals are not strong enough.\n\r",ch); return; } if (ch->hit < ch->max_hit) { send_to_char("Your body cannot take the strain.\n\r",ch); return; } if (has_timer(ch)) return; ch->level = 12; act("You call for God to transfer the pain of these mortals to yourself.", ch, NULL, NULL, TO_CHAR); act("$n says '#yLet not these followers of God suffer, let their pain be mine instead#n'.", ch, NULL, NULL, TO_ROOM); for (ich = ch->in_room->people; ich != NULL; ich = ich->next_in_room) if (!IS_NPC(ich)) do_restore(ch,ich->pcdata->switchname); ch->level = 3; ch->hit = 1; ch->move = 1; ch->mana = 1; WAIT_STATE(ch,6); return; }
void do_arenajoin(CHAR_DATA *ch, char *argument) { char buf[MAX_STRING_LENGTH]; int arenapeople=0; DESCRIPTOR_DATA *d; if (IS_NPC(ch)) return; if (ch->fight_timer > 0) { send_to_char("You have a fighttimer.\n\r",ch); return; } if ((get_age(ch) - 17) < 2) { send_to_char("Your still a newbie.\n\r",ch); return; } if (!arenaopen) { send_to_char("The arena is closed.\n\r",ch); return; } if (arena_base && is_upgrade(ch)) { send_to_char("Your an upgrade, not for you this time.\n\r",ch); return; } if (ch->in_room != NULL) { if (IS_SET (ch->in_room->room_flags, ROOM_ARENA)) { send_to_char("Your in the arena.\n\r",ch); return; } } for ( d = descriptor_list; d != NULL; d = d->next ) { if ( d->character != NULL ) { if (!d->connected == CON_PLAYING) continue; if (d->character->in_room != NULL) { if (IS_SET (d->character->in_room->room_flags, ROOM_ARENA)) arenapeople++; } } } if (arenapeople > ARENA_PLAYERS) { send_to_char("The arena is crowded atm.\n\r",ch); return; } char_from_room(ch); char_to_room(ch, get_room_index(next_arena_room)); next_arena_room += (ARENA_HVNUM - ARENA_LVNUM) / ARENA_PLAYERS; sprintf(buf,"%s has joined the arena!",ch->name); do_info(ch,buf); do_restore(ch,"self"); SET_BIT(ch->act, PLR_FREEZE); return; }
void prepare_players(void) { DESCRIPTOR_DATA *d; for(d = descriptor_list; d; d = d->next) { if(d->connected != CON_PLAYING || !d->character) continue; stop_fighting(d->character, TRUE); d->character->position = POS_STANDING; do_restore(d->character, "self"); } do_forceauto(char_list, "call all"); do_autosave(char_list, ""); }
void Monitor::restore() { do_restore(); Platform::reset_cursor_pos(); }
void do_hotreboot(CHAR_DATA * ch, char *argument) { FILE *fp; DESCRIPTOR_DATA *d, *d_next; char buf[100], buf2[100], buf3[100]; fp = fopen(HOTREBOOT_FILE, "w"); if(!fp) { send_to_char("hotreboot file not writeable, aborted.\n\r", ch); fpReserve = fopen(NULL_FILE, "r"); perror("do_hotreboot:fopen"); return; } if(argument && !str_cmp(argument,"INFINITE LOOP!")) { sprintf(buf, "[HotReboot by Godwars - Infinite Loop!]\n\r"); } if(argument && argument[0] != '\0') { sprintf(buf, "[HotReboot by Godwars - Crash!]\n\r"); } else { do_restore(ch, "all"); prepare_players(); write_kingdoms(); sprintf(buf, "[HotReboot by %s - You will automatically reconnect]\n\r", ch->name); } /* For each playing descriptor, save its state */ for(d = descriptor_list; d; d = d_next) { CHAR_DATA *och = CH(d); d_next = d->next; /* We delete from the list , so need to save this */ if(!d->character || d->connected != CON_PLAYING || och->level == 1) /* drop those logging on */ { write_to_descriptor(d->descriptor, "\n\rSorry, we are rebooting. Come back in a few minutes.\n\r", 0); close_socket2(d, FALSE); /* throw'em out */ } else { fprintf(fp, "%li %s %s\n", d->descriptor, och->name, d->host); save_char_obj(och); write_to_descriptor(d->descriptor, buf, 0); } } fprintf(fp, "-1\n\n"); fclose(fp); if((fp = fopen(OLDUPTIME_FILE, "w")) != 0) { fprintf(fp, "%.0f\n", get_uptime()); fclose(fp); } else { unlink(OLDUPTIME_FILE); } fclose(fpReserve); /* exec - descriptors are inherited */ sprintf(buf, "%li", port); sprintf(buf2, "%li", control); sprintf(buf3, "%li", rebootnum); #ifndef WIN32 execl(EXE_FILE, "Merc", buf, "hotreboot", buf2, buf3, (char *) 0); #endif /* Failed - sucessful exec will not return */ perror("do_hotreboot: execl"); send_to_char("hotreboot FAILED!\n\r", ch); /* Here you might want to reopen fpReserve */ fpReserve = fopen(NULL_FILE, "r"); }
/* * This is the engine called by jobq.c:jobq_add() when we were pulled * from the work queue. * At this point, we are running in our own thread and all * necessary resources are allocated -- see jobq.c */ static void *job_thread(void *arg) { JCR *jcr = (JCR *)arg; pthread_detach(pthread_self()); Dsm_check(100); Dmsg0(200, "=====Start Job=========\n"); jcr->setJobStatus(JS_Running); /* this will be set only if no error */ jcr->start_time = time(NULL); /* set the real start time */ jcr->jr.StartTime = jcr->start_time; if (jcr->job->MaxStartDelay != 0 && jcr->job->MaxStartDelay < (utime_t)(jcr->start_time - jcr->sched_time)) { jcr->setJobStatus(JS_Canceled); Jmsg(jcr, M_FATAL, 0, _("Job canceled because max start delay time exceeded.\n")); } if (job_check_maxrunschedtime(jcr)) { jcr->setJobStatus(JS_Canceled); Jmsg(jcr, M_FATAL, 0, _("Job canceled because max run sched time exceeded.\n")); } /* TODO : check if it is used somewhere */ if (jcr->job->RunScripts == NULL) { Dmsg0(200, "Warning, job->RunScripts is empty\n"); jcr->job->RunScripts = New(alist(10, not_owned_by_alist)); } if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); } /* Run any script BeforeJob on dird */ run_scripts(jcr, jcr->job->RunScripts, "BeforeJob"); /* * We re-update the job start record so that the start * time is set after the run before job. This avoids * that any files created by the run before job will * be saved twice. They will be backed up in the current * job, but not in the next one unless they are changed. * Without this, they will be backed up in this job and * in the next job run because in that case, their date * is after the start of this run. */ jcr->start_time = time(NULL); jcr->jr.StartTime = jcr->start_time; if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); } generate_job_event(jcr, "JobRun"); generate_plugin_event(jcr, bDirEventJobRun); switch (jcr->getJobType()) { case JT_BACKUP: if (!job_canceled(jcr) && do_backup(jcr)) { do_autoprune(jcr); } else { backup_cleanup(jcr, JS_ErrorTerminated); } break; case JT_VERIFY: if (!job_canceled(jcr) && do_verify(jcr)) { do_autoprune(jcr); } else { verify_cleanup(jcr, JS_ErrorTerminated); } break; case JT_RESTORE: if (!job_canceled(jcr) && do_restore(jcr)) { do_autoprune(jcr); } else { restore_cleanup(jcr, JS_ErrorTerminated); } break; case JT_ADMIN: if (!job_canceled(jcr) && do_admin(jcr)) { do_autoprune(jcr); } else { admin_cleanup(jcr, JS_ErrorTerminated); } break; case JT_COPY: case JT_MIGRATE: if (!job_canceled(jcr) && do_migration(jcr)) { do_autoprune(jcr); } else { migration_cleanup(jcr, JS_ErrorTerminated); } break; default: Pmsg1(0, _("Unimplemented job type: %d\n"), jcr->getJobType()); break; } run_scripts(jcr, jcr->job->RunScripts, "AfterJob"); /* Send off any queued messages */ if (jcr->msg_queue && jcr->msg_queue->size() > 0) { dequeue_messages(jcr); } generate_daemon_event(jcr, "JobEnd"); generate_plugin_event(jcr, bDirEventJobEnd); Dmsg1(50, "======== End Job stat=%c ==========\n", jcr->JobStatus); Dsm_check(100); return NULL; }
int main(int argc, char **argv) { destor_start(); int job = DESTOR_BACKUP; int revision = -1; int opt = 0; while ((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'r': job = DESTOR_RESTORE; revision = atoi(optarg); break; case 's': destor_stat(); break; case 't': job = DESTOR_MAKE_TRACE; break; case 'h': usage(); break; case 'p': { sds param = sdsnew(optarg); load_config_from_string(param); break; } default: return 0; } } sds path = NULL; switch (job) { case DESTOR_BACKUP: if (argc > optind) { path = sdsnew(argv[optind]); } else { fprintf(stderr, "backup job needs a protected path!\n"); usage(); } do_backup(path); /* * The backup concludes. * GC starts * */ if(destor.backup_retention_time >= 0 && jcr.id >= destor.backup_retention_time){ NOTICE("GC is running!"); do_delete(jcr.id - destor.backup_retention_time); } sdsfree(path); break; case DESTOR_RESTORE: if (revision < 0) { fprintf(stderr, "A job id is required!\n"); usage(); } if (argc > optind) { path = sdsnew(argv[optind]); } else { fprintf(stderr, "A target directory is required!\n"); usage(); } do_restore(revision, path[0] == 0 ? 0 : path); sdsfree(path); break; case DESTOR_MAKE_TRACE: { if (argc > optind) { path = sdsnew(argv[optind]); } else { fprintf(stderr, "A target directory is required!\n"); usage(); } make_trace(path); sdsfree(path); break; } default: fprintf(stderr, "Invalid job type!\n"); usage(); } destor_shutdown(); return 0; }
/* * Entry point of pg_arman command. */ int main(int argc, char *argv[]) { const char *cmd = NULL; const char *range1 = NULL; const char *range2 = NULL; pgBackupRange range; int i; /* do not buffer progress messages */ setvbuf(stdout, 0, _IONBF, 0); /* TODO: remove this */ /* initialize configuration */ catalog_init_config(¤t); /* overwrite configuration with command line arguments */ i = pgut_getopt(argc, argv, options); for (; i < argc; i++) { if (cmd == NULL) cmd = argv[i]; else if (range1 == NULL) range1 = argv[i]; else if (range2 == NULL) range2 = argv[i]; else elog(ERROR, "too many arguments"); } /* command argument (backup/restore/show/...) is required. */ if (cmd == NULL) { help(false); return 1; } /* get object range argument if any */ if (range1 && range2) parse_range(&range, range1, range2); else if (range1) parse_range(&range, range1, ""); else range.begin = range.end = 0; /* Read default configuration from file. */ if (backup_path) { char path[MAXPGPATH]; /* Check if backup_path is directory. */ struct stat stat_buf; int rc = stat(backup_path, &stat_buf); /* If rc == -1, there is no file or directory. So it's OK. */ if (rc != -1 && !S_ISDIR(stat_buf.st_mode)) elog(ERROR, "-B, --backup-path must be a path to directory"); join_path_components(path, backup_path, PG_RMAN_INI_FILE); pgut_readopt(path, options, ERROR); } /* BACKUP_PATH is always required */ if (backup_path == NULL) elog(ERROR, "required parameter not specified: BACKUP_PATH (-B, --backup-path)"); /* path must be absolute */ if (backup_path != NULL && !is_absolute_path(backup_path)) elog(ERROR, "-B, --backup-path must be an absolute path"); if (pgdata != NULL && !is_absolute_path(pgdata)) elog(ERROR, "-D, --pgdata must be an absolute path"); if (arclog_path != NULL && !is_absolute_path(arclog_path)) elog(ERROR, "-A, --arclog-path must be an absolute path"); /* Sanity checks with commands */ if (pg_strcasecmp(cmd, "delete") == 0 && arclog_path == NULL) elog(ERROR, "delete command needs ARCLOG_PATH (-A, --arclog-path) to be set"); /* setup exclusion list for file search */ for (i = 0; pgdata_exclude[i]; i++) /* find first empty slot */ ; if (arclog_path) pgdata_exclude[i++] = arclog_path; /* do actual operation */ if (pg_strcasecmp(cmd, "init") == 0) return do_init(); else if (pg_strcasecmp(cmd, "backup") == 0) { pgBackupOption bkupopt; int res; bkupopt.smooth_checkpoint = smooth_checkpoint; bkupopt.keep_data_generations = keep_data_generations; bkupopt.keep_data_days = keep_data_days; /* Do the backup */ res = do_backup(bkupopt); if (res != 0) return res; /* If validation has been requested, do it */ range.begin = current.start_time; range.end = current.start_time + 1; if (backup_validate) do_validate(&range); } else if (pg_strcasecmp(cmd, "restore") == 0) return do_restore(target_time, target_xid, target_inclusive, target_tli); else if (pg_strcasecmp(cmd, "show") == 0) return do_show(&range, show_all); else if (pg_strcasecmp(cmd, "validate") == 0) return do_validate(&range); else if (pg_strcasecmp(cmd, "delete") == 0) return do_delete(&range); else elog(ERROR, "invalid command \"%s\"", cmd); return 0; }