/* vi: set ts=4 sw=4 ai: */ /* * restart.c * * Lotos v1.2.3 : (c) 1999-2003 Pavol Hluchy (Lopo) * last update : 30.1.2003 * email : lotos@losys.sk * homepage : lotos.losys.sk */ #ifndef __RESTART_C__ #define __RESTART_C__ 1 #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include "define.h" #include "prototypes.h" #ifdef NETLINKS #include "obj_nl.h" #endif #include "obj_sys.h" #include "obj_syspp.h" #include "restart.h" int reinit_save_user_malloc(UR_OBJECT user) { FILE *fp; char fname[FNAME_LEN], *p=user->malloc_start; set_crash(); sprintf(fname, "%s/%s.ri_urm", TEMPFILES, user->name); if ((fp=fopen(fname, "w"))==NULL) return 0; while (p!=user->malloc_end) { fputc(p[0], fp); p++; } fclose(fp); return 1; } int reinit_save_user(UR_OBJECT user) { UR_OBJECT u; PL_OBJECT pl; FILE *fp; char fname[FNAME_LEN]; int i; set_crash(); #ifdef NETLINKS if (user->type==REMOTE_TYPE) return 0; #endif if (user->type==CLONE_TYPE) return 0; sprintf(fname, "%s/%s.ri_ur", TEMPFILES, user->name); if ((fp=fopen(fname, "w"))==NULL) { vwrite_user(user, "%s: chyba pri ukladani tvojich detailov\n", syserror); write_syslog(ERRLOG, 1, "REINIT_SAVE_USER: chyba pri ukladani detailov pre %s\n", user->name); return 0; } fprintf(fp, "level %d %d\n", user->level, user->real_level); fprintf(fp, "site %s %s %s\n", user->last_site, user->site, user->ipsite); fprintf(fp, "afk %d %s\n", user->afk, user->afk_mesg); fprintf(fp, "call %s\n", user->call); fprintf(fp, "gcoms "); for (i=0; i<MAX_GCOMS; i++) fprintf(fp, "%d ", user->gcoms[i]); fprintf(fp, "\n"); fprintf(fp, "xcoms "); for (i=0; i<MAX_XCOMS; i++) fprintf(fp, "%d ", user->xcoms[i]); fprintf(fp, "\n"); #ifdef PUEBLO fprintf(fp, "pueblo %d %d\n", user->pueblo, user->pblodetect); #endif fprintf(fp, "alarm %d %d\n", user->atime, user->alarm); fprintf(fp, "ltell %s\n", user->ltell); fprintf(fp, "count %ld %ld\n", user->tcount, user->bcount); fprintf(fp, "auth %lu\n", user->auth_addr); fprintf(fp, "afkbuff\n"); for (i=0; i<REVTELL_LINES; i++) { if (user->afkbuff[i].buff[0]!='\0') fprintf(fp, "%ld %s", (long int)user->afkbuff[i].time, user->afkbuff[i].buff); } fprintf(fp, "/afkbuff\n"); fprintf(fp, "buff %d\n%s\n/buff\n", strlen(user->buff), user->buff); fprintf(fp, "ops %d %d %d %d\n", user->misc_op, user->edit_op, user->set_op, user->set_mode); fprintf(fp, "hwrap %d %d %d %d %d\n", user->hwrap_lev, user->hwrap_id, user->hwrap_same, user->hwrap_func, user->hwrap_pl); fprintf(fp, "page %ld %d %d %s\n", user->pagecnt, user->user_page_pos, user->user_page_lev, user->page_file); fprintf(fp, "pages\n"); for (i=0; i<MAX_PAGES; i++) fprintf(fp, "%d ", user->pages[i]); fprintf(fp, "\n/pages\n"); fprintf(fp, "pos %ld %d\n", user->filepos, user->buffpos); fprintf(fp, "revbuff\n"); for (i=0; i<REVTELL_LINES; i++) { if (user->revbuff[i].buff[0]!='\0') fprintf(fp, "%ld %s", (long int)user->revbuff[i].time, user->revbuff[i].buff); } fprintf(fp, "/revbuff\n"); fprintf(fp, "inpstr %d %s\n", strlen(user->inpstr_old), user->inpstr_old); fprintf(fp, "copyto\n"); for (i=0; i<MAX_COPIES; i++) { if (user->copyto[i][0]!='\0') fprintf(fp, "%s", user->copyto[i]); } fprintf(fp, "/copyto\n"); fprintf(fp, "invite %s\n", user->invite_by); fprintf(fp, "ign_ur\n"); for (i=0; i<MAX_IGNORES; i++) { if (user->ignoreuser[i][0]!='\0') fprintf(fp, "%s\n", user->ignoreuser[i]); } fprintf(fp, "/ign_ur\n"); fprintf(fp, "editbuff\n"); for (i=0; i<REVTELL_LINES; i++) { if (user->editbuff[i].buff[0]!='\0') fprintf(fp, "%ld %s", (long int)user->editbuff[i].time, user->editbuff[i].buff); } fprintf(fp, "/editbuff\n"); fprintf(fp, "samesite %d %d %s\n", user->samesite_all_store, strlen(user->samesite_check_store), user->samesite_check_store); fprintf(fp, "ignall %d %d\n", user->ignore.all, user->ignore.all_store); fprintf(fp, "lines %d %d %d %d\n", user->edit_line, user->editline, user->revline, user->afkline); fprintf(fp, "others %d %d %d %d %d %ld %d %c %d %d\n", user->warned, user->editing, user->charcnt, user->lmail_lev, user->remote_com, (long)user->last_input, user->tmp_int, user->status, user->clone_hear, user->kradnutie); fprintf(fp, "wipe %d %d\n", user->wipe_from, user->wipe_to); fprintf(fp, "restrict %s\n", user->restrict); fprintf(fp, "room %s\n", user->room!=NULL?user->room->name:""); fprintf(fp, "invite_rm %s\n", user->invite_room!=NULL?user->invite_room->name:""); fprintf(fp, "wrap_rm %s\n", user->wrap_room!=NULL?user->wrap_room->name:""); fprintf(fp, "remind %d %d %d %d %s\n", user->temp_remind.day, user->temp_remind.month, user->temp_remind.year, strlen(user->temp_remind.msg), user->temp_remind.msg!='\0'?user->temp_remind.msg:""); fprintf(fp, "p_tmp_ch %s\n", user->p_tmp_ch!=NULL?user->p_tmp_ch:""); fprintf(fp, "follow %s\n", user->follow[0]!='\0'?user->follow:""); fprintf(fp, "clones\n"); for (u=user_first; u!=NULL; u=u->next) { if (u->type!=CLONE_TYPE) continue; if (u->owner==user) fprintf(fp, "%s\n", u->room->name); } fprintf(fp, "/clones\n"); if (user->malloc_start!=NULL) { fprintf(fp, "malloc\n"); reinit_save_user_malloc(user); } fclose(fp); for (pl=plugin_first; pl!=NULL; pl=pl->next) { call_plugin_exec(user, "", pl, -1); } return 1; } int reinit_save_room(RM_OBJECT room) { FILE *fp; char fname[FNAME_LEN]; int i; set_crash(); sprintf(fname, "%s/%s.ri_rm", TEMPFILES, room->name); if ((fp=fopen(fname, "w"))==NULL) { write_syslog(ERRLOG, 1, "REINIT_SAVE_ROOM: chyba pri ukladani detailov pre %s\n", room->name); return 0; } fprintf(fp, "topic %s\n", room->topic); fprintf(fp, "topicprms %d %s\n", room->topiclock, room->topicowner); fprintf(fp, "revbuff\n"); for (i=0; i<REVTELL_LINES; i++) { if (room->revbuff[i].buff[0]!='\0') fprintf(fp, "%ld %s", room->revbuff[i].time, room->revbuff[i].buff); } fprintf(fp, "/revbuff\n"); fprintf(fp, "access %d\n", room->access); fprintf(fp, "revline %d\n", room->revline); fprintf(fp, "mesg_cnt %d\n", room->mesg_cnt); if (room->transp) fprintf(fp, "transport %d %d %d %d %d %d\n", room->transp->place, room->transp->route, room->transp->out, room->transp->go, room->transp->smer, room->transp->time); fclose(fp); return 1; } void restart(UR_OBJECT user) { UR_OBJECT u,wu; RM_OBJECT rm; #ifdef NETLINKS NL_OBJECT nl; #endif FILE *fp; char name[ROOM_NAME_LEN+1]; char *argy[]={progname, confile, "-reinit", NULL }; int p; char uname[USER_NAME_LEN+1]; set_crash(); if (user) strcpy(uname, user->name); else strcpy(uname, "SIGHUP signal"); clear_temps(); write_room_except(NULL, restart_prompt, user); save_counters(); write_syslog(SYSLOG, 1, "%s robi ~OL~FTrestart~RS talkra\n", uname); if ((fp=fopen(RESTARTFILE, "w"))==NULL) { if (user) write_user(user, "Nemozem otvorit subor pre zoznam, nerestartujem ...\n"); write_syslog(ERRLOG, 1, "Nemozem otvorit RESTARTFILE na zapis v restart()\n"); write_syslog(SYSLOG, 1, "Restart zruseny - pozri errlog\n"); return; } #ifdef NETLINKS for (nl=nl_first; nl!=NULL; nl=nl->next) shutdown_netlink(nl); #endif fprintf(fp, "%d %d %d %d\n",port[0], port[1], listen_sock[0],listen_sock[1]); fprintf(fp, "%d\n", (int)amsys->boot_time); for (rm=room_first; rm!=NULL; rm=rm->next) { p=is_personal_room(rm); if (p) { sscanf(rm->name, "(%s", name); name[strlen(name)-1]='\0'; personal_room_store(name, 1, rm); } fprintf(fp, "%s %d\n", rm->name, p); reinit_save_room(rm); } fprintf(fp, "_users\n"); u=user_first; while (u!=NULL) { wu=u->next; if (u->type==CLONE_TYPE || u->login) { u=wu; continue; } fprintf(fp,"%s %d %d %d\n",u->name,u->port,u->socket,u->site_port); reinit_save_user(u); save_user_details(u,1); u=wu; } fclose(fp); u=user_first; while (u!=NULL) { wu=u->next; if (u->login) disconnect_user(u); else destruct_user(u); u=wu; } oss_plugin_dump(); #ifdef NETLINKS close(listen_sock[2]); #endif execvp(progname,argy); exit(12); } int reinit_load_user_malloc(UR_OBJECT user) { FILE *fp; char fname[FNAME_LEN], c; int i=0; set_crash(); sprintf(fname, "%s/%s.ri_urm", TEMPFILES, user->name); if ((fp=fopen(fname, "r"))==NULL) return 0; if ((user->malloc_start=(char *)malloc(MAX_LINES*81))==NULL) return 0; while ((c=fgetc(fp))!=EOF) { user->malloc_start[i]=c; i++; } user->malloc_end=user->malloc_start+i; fclose(fp); #if !defined DEBUG unlink(fname); #endif return 1; } /* stage: 1-main, 2-plugins */ int reinit_load_user(UR_OBJECT user, int stage) { RM_OBJECT rm; UR_OBJECT ur; PL_OBJECT pl; FILE *fp; char fname[FNAME_LEN], line[ARR_SIZE*5], *str, s[50]; char ur_words[10][ARR_SIZE]; int i, wn, wpos, wcnt, op, found, c, damaged=0; char *options[]={ "level", "site", "afk", "call", "gcoms", "xcoms", "pueblo", "alarm", "ltell", "count", "auth", "afkbuff", "buff", "ops", "hwrap", "page", "pages", "pos", "revbuff", "inpstr", "copyto", "invite", "ign_ur", "editbuff", "samesite", "ignall", "lines", "others", "wipe", "restrict", "room", "invite_rm", "wrap_rm", "remind", "p_tmp_ch", "follow", "clones", "malloc", "*"}; set_crash(); if (stage==1) { //main sprintf(fname, "%s/%s.ri_ur", TEMPFILES, user->name); if ((fp=fopen(fname, "r"))==NULL) return 0; fgets(line, (ARR_SIZE*5)-1, fp); line[strlen(line)-1]='\0'; while (!feof(fp)) { wn=0; wpos=0; str=line; do { while (*str<33) if (!*str++) goto RLUOUT; while (*str>32 && wpos<ARR_SIZE) ur_words[wn][wpos++]=*str++; ur_words[wn++][wpos]='\0'; wpos=0; } while (wn<1010); wn--; RLUOUT: wcnt=wn; op=0; found=1; while (strcmp(options[op], ur_words[0])) { if (options[op][0]=='*') { found=0; break; } op++; } if (found) { switch (op) { case 0: /* level */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->level=atoi(ur_words[i]); break; case 2: user->real_level=atoi(ur_words[i]); break; } } break; case 1: /* site */ for (i=1; i<wcnt; i++) { switch (i) { case 1: strcpy(user->last_site, ur_words[i]); break; case 2: strcpy(user->site, ur_words[i]); break; case 3: strcpy(user->ipsite, ur_words[i]); break; } } break; case 2: /* afk */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->afk=atoi(ur_words[i]); break; case 2: strncpy(user->afk_mesg, remove_first(remove_first(line)), AFK_MESG_LEN); break; } } break; case 3: /* call */ if (wcnt>=2) strncpy(user->call, remove_first(line), USER_NAME_LEN); break; case 4: /* gcoms */ for (i=1; i<wcnt; i++) user->gcoms[i-1]=atoi(ur_words[i]); break; case 5: /* xcoms */ for (i=1; i<wcnt; i++) user->xcoms[i-1]=atoi(ur_words[i]); break; case 6: /* pueblo */ #ifdef PUEBLO for (i=1; i<wcnt; i++) { switch (i) { case 1: user->pueblo=atoi(ur_words[i]); break; case 2: user->pblodetect=atoi(ur_words[i]); break; } } #endif break; case 7: /* alarm */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->atime=atoi(ur_words[i]); break; case 2: user->alarm=atoi(ur_words[i]); break; } } break; case 8: /* ltell */ if (wcnt>=2) strncpy(user->ltell, remove_first(line), USER_NAME_LEN); break; case 9: /* count */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->tcount=atol(ur_words[i]); break; case 2: user->bcount=atol(ur_words[i]); break; } } break; case 10: /* auth */ if (wcnt>=2) user->auth_addr=strtoul(remove_first(line), NULL, 10); break; case 11: /* afkbuff */ fgets(line, ARR_SIZE*5-1, fp); c=0; while (strcmp(line, "/afkbuff\n")) { if (c<REVTELL_LINES) { user->afkbuff[c].time=(time_t)strtoul(line, NULL, 10); strncpy(user->afkbuff[c].buff, remove_first(line), REVIEW_LEN+1); } c++; fgets(line, ARR_SIZE*5-1, fp); } break; case 12: /* buff */ c=atoi(ur_words[2]); fgets(line, ARR_SIZE*5-1, fp); i=0; while (strncmp(line, "/buff", 5)) { if (i<BUFSIZE) strncat(user->buff, line, BUFSIZE-strlen(user->buff)-1); i+=strlen(line); fgets(line, ARR_SIZE*5-1, fp); } user->buff[c-1]='\0'; break; case 13: /* ops */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->misc_op=atoi(ur_words[i]); break; case 2: user->edit_op=atoi(ur_words[i]); break; case 3: user->set_op=atoi(ur_words[i]); break; case 4: user->set_mode=atoi(ur_words[i]); break; } } break; case 14: /* hwrap */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->hwrap_lev=atoi(ur_words[i]); break; case 2: user->hwrap_id=atoi(ur_words[i]); break; case 3: user->hwrap_same=atoi(ur_words[i]); break; case 4: user->hwrap_func=atoi(ur_words[i]); break; case 5: user->hwrap_pl=atoi(ur_words[i]); break; } } break; case 15: /* page */ strcpy(line, remove_first(line)); for (i=1; i<(wcnt-1); i++) { strcpy(line, remove_first(line)); switch (i) { case 1: user->pagecnt=atoi(ur_words[i]); break; case 2: user->user_page_pos=atoi(ur_words[i]); break; case 3: user->user_page_lev=atoi(ur_words[i]); break; } } if (wcnt>4) strcpy(user->page_file, line); break; case 16: /* pages */ fscanf(fp, "%s ", s); i=0; while (strcmp(s, "/pages\n") && i<MAX_PAGES) { user->pages[i]=atoi(s); i++; fscanf(fp, "%s ", s); } break; case 17: /* pos */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->filepos=atoi(ur_words[i]); break; case 2: user->buffpos=atoi(ur_words[i]); break; } } break; case 18: /* revbuff */ fgets(line, ARR_SIZE*5-1, fp); c=0; while (strcmp(line, "/revbuff\n")) { if (c<REVTELL_LINES) { user->revbuff[c].time=(time_t)strtoul(line, NULL, 10); strncpy(user->revbuff[c].buff, remove_first(line), REVIEW_LEN+1); } c++; fgets(line, ARR_SIZE*5-1, fp); } break; case 19: /* inpstr */ strncpy(user->inpstr_old, remove_first(remove_first(line)), atoi(ur_words[1])); break; case 20: /* copyto */ fgets(line, ARR_SIZE*5-1, fp); c=0; while (strcmp(line, "/copyto\n")) { if (c<MAX_COPIES) strncpy(user->copyto[c], line, USER_NAME_LEN); c++; fgets(line, ARR_SIZE*5-1, fp); } break; case 21: /* invite */ if (wcnt>=2) strncpy(user->invite_by, remove_first(line), USER_NAME_LEN); break; case 22: /* ign_ur */ fgets(line, ARR_SIZE*5-1, fp); c=0; while (strcmp(line, "/ign_ur\n")) { if (c<MAX_IGNORES) { strncpy(user->ignoreuser[c], line, USER_NAME_LEN); user->ignoreuser[c][strlen(user->ignoreuser[c])-1]='\0'; } c++; fgets(line, ARR_SIZE*5-1, fp); } break; case 23: /* editbuff */ fgets(line, ARR_SIZE*5-1, fp); c=0; while (strcmp(line, "/editbuff\n")) { if (c<REVTELL_LINES) { user->editbuff[c].time=(time_t)strtoul(line, NULL, 10); strncpy(user->editbuff[c].buff, remove_first(line), REVIEW_LEN+1); } c++; fgets(line, ARR_SIZE*5-1, fp); } break; case 24: /* samesite */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->samesite_all_store=atoi(ur_words[i]); break; case 3: strncpy(user->samesite_check_store, ur_words[i], atoi(ur_words[i-1])); break; } } break; case 25: /* ignall */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->ignore.all=atoi(ur_words[i]); break; case 2: user->ignore.all_store=atoi(ur_words[i]); break; } } break; case 26: /* lines */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->edit_line=atoi(ur_words[i]); break; case 2: user->editline=atoi(ur_words[i]); break; case 3: user->revline=atoi(ur_words[i]); break; case 4: user->afkline=atoi(ur_words[i]); break; } } break; case 27: /* others */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->warned=atoi(ur_words[i]); break; case 2: user->editing=atoi(ur_words[i]); break; case 3: user->charcnt=atoi(ur_words[i]); break; case 4: user->lmail_lev=atoi(ur_words[i]); break; case 5: user->remote_com=atoi(ur_words[i]); break; case 6: user->last_input=(time_t)strtoul(ur_words[i], NULL, 10); break; case 7: user->tmp_int=atoi(ur_words[i]); break; case 8: user->status=ur_words[i][0]; break; case 9: user->clone_hear=atoi(ur_words[i]); break; case 10: user->kradnutie=atoi(ur_words[i]); break; } } break; case 28: /* wipe */ for (i=1; i<wcnt; i++) { switch (i) { case 1: user->wipe_from=atoi(ur_words[i]); break; case 2: user->wipe_to=atoi(ur_words[i]); break; } } break; case 29: /* restrict */ if (wcnt>=2) strncpy(user->restrict, remove_first(line), MAX_RESTRICT); break; case 30: /* room */ if (wcnt>=2) { rm=get_room_full(ur_words[1]); if (rm!=NULL) user->room=rm; } break; case 31: /* invite_rm */ if (wcnt>=2) { rm=get_room_full(ur_words[2]); if (rm!=NULL) user->invite_room=rm; } break; case 32: /* wrap_rm */ if (wcnt>=2) { rm=get_room_full(ur_words[2]); if (rm!=NULL) user->wrap_room=rm; } break; case 33: /* remind */ for (i=1; i<(wcnt-1); i++) { strcpy(line, remove_first(line)); switch (i) { case 1: user->temp_remind.day=atoi(ur_words[i]); break; case 2: user->temp_remind.month=atoi(ur_words[i]); break; case 3: user->temp_remind.year=atoi(ur_words[i]); break; case 4: strncpy(user->temp_remind.msg, remove_first(line), atoi(ur_words[i])); break; } strcpy(line, remove_first(line)); } break; case 34: /* p_tmp_ch */ if (wcnt>=2) user->p_tmp_ch=strdup(ur_words[2]); break; case 35: /* follow */ if (wcnt>=2) { ur=get_user(ur_words[2]); if (ur!=NULL) strcpy(user->follow, ur->name); } break; case 36: /* clones */ fgets(line, ARR_SIZE*5-1, fp); while (strcmp(line, "/clones\n")) { line[strlen(line)-1]='\0'; rm=get_room_full(line); if (rm!=NULL) { if ((ur=create_user())!=NULL) { ur->type=CLONE_TYPE; ur->socket=user->socket; ur->room=rm; ur->owner=user; ur->vis=1; strcpy(ur->name, user->name); strcpy(ur->recap, user->name); strcpy(ur->bw_recap, colour_com_strip(ur->recap)); strcpy(ur->desc, clone_desc); } } fgets(line, ARR_SIZE*5-1, fp); } break; case 37: /* malloc */ reinit_load_user_malloc(user); break; } } else damaged++; fgets(line, ARR_SIZE*5-1, fp); line[strlen(line)-1]='\0'; } fclose(fp); #if !defined DEBUG unlink(fname); #endif return 1; } /* stage 1 */ else if (stage==2) { for (pl=plugin_first; pl!=NULL; pl=pl->next) for (ur=user_first; ur!=NULL; ur=ur->next) call_plugin_exec(ur, "", pl, -2); return 1; } /* stage 2 */ else return 0; } int reinit_load_room(RM_OBJECT room) { FILE *fp; char fname[FNAME_LEN], line[ARR_SIZE*5], *str; char rm_words[10][ARR_SIZE]; int i, found, wn, wpos, wcnt, c, op, damaged=0; char *options[]={ "topic", "topicprms", "revbuff", "access", "revline", "mesg_cnt", "transport", "*" }; set_crash(); sprintf(fname, "%s/%s.ri_rm", TEMPFILES, room->name); if ((fp=fopen(fname, "r"))==NULL) return 0; fgets(line, (ARR_SIZE*5)-1, fp); line[strlen(line)-1]='\0'; while (!feof(fp)) { wn=0; wpos=0; str=line; do { while (*str<33) if (!*str++) goto RLROUT; while (*str>32 && wpos<ARR_SIZE) rm_words[wn][wpos++]=*str++; rm_words[wn++][wpos]='\0'; wpos=0; } while (wn<1010); wn--; RLROUT: wcnt=wn; op=0; found=1; while (strcmp(options[op], rm_words[0])) { if (options[op][0]=='*') { found=0; break; } op++; } if (found) { switch (op) { case 0: strcpy(room->topic, remove_first(line)); break; case 1: if (wcnt>=2) room->topiclock=atoi(rm_words[1]); if (wcnt>=3) strncpy(room->topicowner, rm_words[2], 1+USER_NAME_LEN*4); break; case 2: fgets(line, ARR_SIZE*5-1, fp); c=0; while (strcmp(line, "/revbuff\n")) { if (c<REVTELL_LINES) { strncpy(room->revbuff[c].buff, remove_first(line), REVIEW_LEN+1); room->revbuff[c].time=(time_t)strtoul(line, NULL, 10); } c++; fgets(line, ARR_SIZE*5-1, fp); } break; case 3: if (wcnt>=2) room->access=atoi(rm_words[1]); else room->access=PERSONAL_UNLOCKED; break; case 4: if (wcnt>=2) room->revline=atoi(rm_words[1]); break; case 5: if (wcnt>=2) room->mesg_cnt=atoi(rm_words[1]); break; case 6: for (i=1; i<wcnt; i++) { switch (i) { case 1: room->transp->place=atoi(rm_words[i]); break; case 2: room->transp->route=atoi(rm_words[i]); break; case 3: room->transp->out=atoi(rm_words[i]); break; case 4: room->transp->go=atoi(rm_words[i]); break; case 5: room->transp->smer=atoi(rm_words[i]); break; case 6: room->transp->time=atoi(rm_words[i]); break; } } break; } } else damaged++; fgets(line, ARR_SIZE*5-1, fp); line[strlen(line)-1]='\0'; } fclose(fp); #if !defined DEBUG unlink(fname); #endif return 1; } void reinit_sockets(void) { FILE *fp; struct sockaddr_in bind_addr; int i,on=1,size; set_crash(); fp=fopen(RESTARTFILE, "r"); fscanf(fp, "%d %d %d %d", &port[0], &port[1], &listen_sock[0], &listen_sock[1]); fclose(fp); printf("reInitialising sockets on ports: %d a %d\n",port[0],port[1]); size=sizeof(struct sockaddr_in); bind_addr.sin_family=AF_INET; bind_addr.sin_addr.s_addr=INADDR_ANY; for (i=0; i<2; ++i) { setsockopt(listen_sock[i],SOL_SOCKET,SO_REUSEADDR,(char *)&on,sizeof(on)); bind_addr.sin_port=htons(port[i]); if (listen(listen_sock[i],10)==-1) boot_exit(i+8); fcntl(listen_sock[i],F_SETFL,O_NDELAY); } #ifdef NETLINKS printf("Initialising socket on port: %d\n", port[2]); if ((listen_sock[2]=socket(AF_INET,SOCK_STREAM,0))==-1) boot_exit(4); /* allow reboots on port even with TIME_WAITS */ setsockopt(listen_sock[2],SOL_SOCKET,SO_REUSEADDR,(char *)&on,sizeof(on)); /* bind sockets and set up listen queues */ bind_addr.sin_port=htons(port[2]); if (bind(listen_sock[2],(struct sockaddr *)&bind_addr,size)==-1) boot_exit(7); if (listen(listen_sock[2],10)==-1) boot_exit(10); /* Set to non-blocking */ fcntl(listen_sock[2],F_SETFL,O_NDELAY); #endif } void restore_structs(void) { UR_OBJECT u; RM_OBJECT rm; FILE *fp; char meno[USER_NAME_LEN+1], line[200], inps[REVIEW_LEN]; int sock=0, sport, siz, jeholen, mport; set_crash(); if ((fp=fopen(RESTARTFILE, "r"))==NULL) { write_syslog(ERRLOG, 1, "nemozem otvorit RESTARTFILE na citanie v restore_structs()\n"); exit(0); } fgets(line, 199, fp); /* prvy riadok s portami */ fgets(line, 199, fp); amsys->boot_time=(time_t)atoi(line); time(&syspp->reboot_time); fgets(line, 199, fp); while (!feof(fp)) { if (!strcmp(line, "_users\n")) break; sscanf(line, "%s %d\n", meno, &siz); if (siz) { if (amsys->personal_rooms) { if ((rm=create_room())==NULL) write_syslog(ERRLOG, 1, "nemozem vytvorit roomu v restore_structs()\n"); else { strcpy(rm->name, meno); sscanf(meno, "(%s", meno); meno[strlen(meno)-1]='\0'; personal_room_store(meno, 0, rm); reinit_load_room(rm); } } } else { for (rm=room_first; rm!=NULL; rm=rm->next) { if (!strcmp(rm->name, meno)) break; } reinit_load_room(rm); } fgets(line, 199, fp); } siz=sizeof(struct sockaddr_in); fgets(line, 199, fp); while (!feof(fp)) { sscanf(line, "%s %d %d %d %s\n", meno, &mport, &sock, &sport, inps); u=create_user(); strcpy(u->name,meno); load_user_details(u); if (u->level==JAILED) { u->room=get_room_full(default_jail); if (u->room==NULL) u->room=room_first; } else check_start_room(u); u->port=mport; jeholen=1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&jeholen, sizeof(jeholen)); u->socket=sock; u->site_port=sport; syspp->acounter[3]++; syspp->acounter[u->gender]++; reinit_load_user(u, 1); prompt(u); record_last_login(u->name); fgets(line, 199, fp); } fclose(fp); #if !defined DEBUG unlink(RESTARTFILE); #endif /* reload plugins */ for (u=user_first; u!=NULL; u=u->next) reinit_load_user(u, 2); write_room(NULL, restart_ok); } #endif /* __RESTART_C__ */