void flushd() { char line[20]; const char *path = "var/flushd.pid"; int pidfd = open(path, O_RDWR | O_CREAT, 0660); if (write_lock(pidfd, 0, SEEK_SET, 0) < 0) { bbslog("3error", "flushd had already been started!"); exit(-1); } snprintf(line, sizeof(line), "%ld\n", (long)getpid()); ftruncate(pidfd, 0); write(pidfd, line, strlen(line)); struct sigaction act; atexit(do_exit); bzero(&act, sizeof(act)); act.sa_handler = do_exit_sig; sigaction(SIGTERM, &act, NULL); sigaction(SIGHUP, &act, NULL); sigaction(SIGABRT, &act, NULL); while (1) { sleep(24 * 60 * 60); flushdata(0); }; }
int main(int argc, char *argv[]) { chdir(BBSHOME); setuid(BBSUID); setgid(BBSGID); setreuid(BBSUID, BBSUID); setregid(BBSGID, BBSGID); #ifndef CYGWIN #undef time bbssettime(time(0)); sleep(1); #define time(x) bbstime(x) #endif setpublicshmreadonly(0); #ifndef CYGWIN setpublicshmreadonly(1); #endif init_bbslog(); if (argc > 1) { if (strcasecmp(argv[1], "killuser") == 0) { //Added by Marvel resolve_utmp(); if (resolve_ucache() != 0) return -1; return dokilluser(); } if (strcasecmp(argv[1], "giveup") == 0) { if (resolve_ucache() != 0) return -1; return doupdategiveupuser(); } if (strcasecmp(argv[1], "allboards") == 0) return dokillalldir(); if (strcasecmp(argv[1], "daemon") == 0) return miscd_dodaemon(argv[1], argv[2]); if (strcasecmp(argv[1], "killdir") == 0) return dokilldir(argv[2]); if (strcasecmp(argv[1], "flush") == 0) { if (resolve_ucache() != 0) return -1; resolve_boards(); flushdata(); return 0; } return miscd_dodaemon(NULL, argv[1]); } printf("Usage : %s daemon: to run as a daemon (this is the most common use)\n", argv[0]); printf(" %s killuser: to kill old users\n", argv[0]); printf(" %s giveup: to unlock given-up users\n", argv[0]); printf(" %s killdir <BOARDNAME>: to delete old file in <BOARDNAME>\n", argv[0]); printf(" %s allboards: to delete old files in all boards\n", argv[0]); printf(" %s flush: to synchronize .PASSWDS and .BOARDS to disk\n", argv[0]); printf("That's all, folks. See doc/README.SYSOP for more details\n"); return 0; }
void flushd() { struct sigaction act; atexit(do_exit); bzero(&act, sizeof(act)); act.sa_handler = do_exit_sig; sigaction(SIGTERM, &act, NULL); sigaction(SIGHUP, &act, NULL); sigaction(SIGABRT, &act, NULL); while (1) { sleep(24 * 60 * 60); flushdata(); }; }
static void bus_setup(void) { flushdata(); if (testbus()) { unsigned char config = rconfig(); if (config & CONFIGFLAG_DEV1CLOCK) devices[PS2_KEYBOARD].present = testdevice(PS2_KEYBOARD); if (config & CONFIGFLAG_DEV2CLOCK) devices[PS2_MOUSE].present = testdevice(PS2_MOUSE); } }
uint8_t um6_rwc(uint8_t um6_register, uint8_t batch, uint8_t r_w_c, uint16_t um6_result[], uint8_t data_size) { uint8_t checksum0 = 0; uint8_t checksum1 = 0; uint16_t checksum = 0; uint8_t pt_is_batch = 0; if(batch > 0) { pt_is_batch = PT_IS_BATCH; } if(r_w_c == UM6_DATA_READ) checksum = ('s'+'n'+'p' + (pt_is_batch | batch) + um6_register); else if(r_w_c == UM6_DATA_WRITE) checksum = ('s'+'n'+'p' + (PT_HAS_DATA | pt_is_batch | batch) + um6_register); else if(r_w_c == UM6_DATA_CMD) checksum = ('s'+'n'+'p' + um6_register); checksum1 = checksum >> 8; checksum0 = checksum & 0xff; uart1_putc('s'); uart1_putc('n'); uart1_putc('p'); if(r_w_c == UM6_DATA_READ) uart1_putc(pt_is_batch | batch); //PT else if(r_w_c == UM6_DATA_WRITE) uart1_putc(PT_HAS_DATA | pt_is_batch | batch); else //if(r_w_c == UM6_DATA_CMD) uart1_putc(0); uart1_putc(um6_register); //ADR uart1_putc(checksum1); //Checksum1 uart1_putc(checksum0); //Checksum1 uint8_t data[8] = {0}; uint16_t data_sum = 0; //if((r_w_c == UM6_DATA_CMD) || (r_w_c == UM6_DATA_WRITE)) // _delay_ms(25); //UM6 braucht dann etwas Zeit zum Antworten uint8_t new_dat = uart1_getc(); if(new_dat & UART_NO_DATA) { //no data return 7; } else if(new_dat == 's') { if(uart1_getc() == 'n') { if(uart1_getc() == 'p') { uint8_t r_w_c_batch = uart1_getc(); if( ((r_w_c_batch == (PT_HAS_DATA | pt_is_batch | batch)) && (r_w_c == UM6_DATA_READ)) || ((r_w_c_batch == 0) && (r_w_c == UM6_DATA_WRITE)) || //== 0 wegen COMMAND_COMPLETE ((r_w_c_batch == 0) && (r_w_c == UM6_DATA_CMD))) { if(uart1_getc() == um6_register) { uint8_t i_stop = 0; if(batch > 0) { i_stop = batch; } else { i_stop = 4; //1 Register } for(uint8_t i = 0; i<i_stop; i++) { data[i] = uart1_getc(); data_sum += data[i]; } checksum1 = uart1_getc(); checksum0 = uart1_getc(); checksum = ((checksum1 << 8) | checksum0); if( ((checksum == ('s' + 'n' + 'p' + (PT_HAS_DATA | pt_is_batch | batch) + um6_register + data_sum)) && (r_w_c == UM6_DATA_READ)) || ((checksum == 0) && (r_w_c == UM6_DATA_WRITE)) || ((checksum == 0) && (r_w_c == UM6_DATA_CMD))) { for(uint8_t i = 0; i < data_size; i++) { um6_result[i] = (data[(i*2)+1] | (data[(i*2)]<<8)); } return 0; } else { flushdata(); return 1; } } else { flushdata(); return 2; } } else { flushdata(); return 3; } } else { flushdata(); return 4; } } else { flushdata(); return 5; } } else { flushdata(); return 6; } }
void do_exit() { flushdata(0); }