int hd_open(minor_t minor) { devstatus_t dev_status = hd_getstatus(minor); if (dev_status == DEV_STATUS_NOT_FOUND) { errno = ENODEV; return EXIT_FAILURE; } #ifdef DEBUG_HD_DRIVER debug_printf("hd(%u,%u): status = %d\r\n", HARD_DISK_DRIVER, minor, dev_status); #endif // reset disk if (dev_status == DEV_STATUS_UNKNOWN) { #ifdef DEBUG_HD_DRIVER debug_printf("hd(%u,%u): attempt to reset disk ", HARD_DISK_DRIVER, minor, dev_status); #endif if (disk_reset(BIOS_HD_DRIVE_BASE_NB + minor) == EXIT_FAILURE) { #ifdef DEBUG_HD_DRIVER debug_printf("[NOK]\r\n"); #endif errno = ENODEV; return EXIT_FAILURE; } hd_setstatus(minor, DEV_STATUS_INITIALIZED); #ifdef DEBUG_HD_DRIVER debug_printf("[OK]\r\n"); #endif } // set info chs_disk_geometry_t* dev_info = (chs_disk_geometry_t*) hd_getinfo(minor); if (dev_info == NULL) { #ifdef DEBUG_HD_DRIVER debug_printf("hd(%u,%u): get disk geometry ", HARD_DISK_DRIVER, minor, dev_status); #endif chs_disk_geometry_t* geometry = malloc(sizeof(chs_disk_geometry_t)); assert(geometry != NULL); if (disk_geometry(BIOS_HD_DRIVE_BASE_NB + minor, geometry) == EXIT_FAILURE) { #ifdef DEBUG_HD_DRIVER debug_printf("[NOK]\r\n"); #endif free(geometry); } else { #ifdef DEBUG_HD_DRIVER debug_printf("[OK]\r\n"); #endif chs_disk_geometry_print(geometry); hd_setinfo(minor, geometry); } } return EXIT_SUCCESS; }
void OnUnMount(nwazetMessageContext_t* nmc){ // Ensure that all files are closed before unmounting the file system CloseAllOpenFiles(); // Unmount the file system uint8_t res = fsCheckSuccess(__func__, "f_mount(null)", f_mount(0, 0), 0); // low-level disk reset disk_reset(); // Reset file object mappings fsCommandHandlerReset(); // return a response to the caller StartResponse(nmc, res, true); }
int main(void) { printstr("OK\n"); if (init_video()) { return(1); } printstr(" Resetting disk..."); if (print_error(disk_reset(loader_setup.boot_drive), disk_errors, N_DISK_ERRORS, TRUE)) { return(1); } printstr(" Getting disk info..."); if (print_error(disk_info_standard(loader_setup.boot_drive, &disk_geometry.cylinder, &disk_geometry.head, &disk_geometry.sector), disk_errors, N_DISK_ERRORS, TRUE)) { return(1); } printstr("...OK\n"); printstr("Loading HIKernel ("); putl(loader_setup.kernel_sectors, 10); printstr(" sectors)...\n"); if (print_error(read_kernel(), disk_errors, N_DISK_ERRORS, TRUE)) { return(1); } printstr("Killing floppy motor...\n"); stop_floppy(); printstr("Starting the BOSS..."); engage(); update_cursor(); printstr("\nBack in the aMOS loader\n"); printstr("Can't play that funky music, giving it up\n"); printstr("Let down and hanging around\n"); for (;;) {} return(0); }
void fsCommandHandlerReset(){ PrintNeutralMessage("File system reset"); // SD card state reset disk_reset(); // Setup the file objects fileObject0.file = &file0; fileObject0.filenameHash = 0; fileObject0.id = INVALID_OBJECT_ID; fileObject1.file = &file1; fileObject1.filenameHash = 0; fileObject1.id = INVALID_OBJECT_ID; fileObject2.file = &file2; fileObject2.filenameHash = 0; fileObject2.id = INVALID_OBJECT_ID; fileObject3.file = &file3; fileObject3.filenameHash = 0; fileObject3.id = INVALID_OBJECT_ID; fileObject4.file = &file4; fileObject4.filenameHash = 0; fileObject4.id = INVALID_OBJECT_ID; // Setup the directory objects dirObject0.dir = &dir0; dirObject0.dirnameHash = 0; dirObject0.id = INVALID_OBJECT_ID; dirObject1.dir = &dir1; dirObject1.dirnameHash = 0; dirObject1.id = INVALID_OBJECT_ID; dirObject2.dir = &dir2; dirObject2.dirnameHash = 0; dirObject2.id = INVALID_OBJECT_ID; dirObject3.dir = &dir3; dirObject3.dirnameHash = 0; dirObject3.id = INVALID_OBJECT_ID; dirObject4.dir = &dir4; dirObject4.dirnameHash = 0; dirObject4.id = INVALID_OBJECT_ID; PrintSuccessMessage("File system reset ok"); }
void CloseMGroup(int force) { char fin[PATH_MAX], fout[PATH_MAX]; FILE *fi, *fo; st_list *mgr = NULL, *tmp; free(gedgrps); snprintf(fin, PATH_MAX, "%s/etc/mgroups.data", getenv("MBSE_ROOT")); snprintf(fout, PATH_MAX, "%s/etc/mgroups.temp", getenv("MBSE_ROOT")); if (MGrpUpdated == 1) { if (force || (yes_no((char *)"Database is changed, save changes") == 1)) { working(1, 0, 0); fi = fopen(fout, "r"); fo = fopen(fin, "w"); fread(&mgrouphdr, mgrouphdr.hdrsize, 1, fi); fwrite(&mgrouphdr, mgrouphdr.hdrsize, 1, fo); while (fread(&mgroup, mgrouphdr.recsize, 1, fi) == 1) if (!mgroup.Deleted) fill_stlist(&mgr, mgroup.Name, ftell(fi) - mgrouphdr.recsize); sort_stlist(&mgr); for (tmp = mgr; tmp; tmp = tmp->next) { fseek(fi, tmp->pos, SEEK_SET); fread(&mgroup, mgrouphdr.recsize, 1, fi); fwrite(&mgroup, mgrouphdr.recsize, 1, fo); } tidy_stlist(&mgr); fclose(fi); fclose(fo); unlink(fout); chmod(fin, 0660); disk_reset(); Syslog('+', "Updated \"mgroups.data\""); if (!force) working(6, 0, 0); exp_golded = TRUE; return; } } chmod(fin, 0660); working(1, 0, 0); unlink(fout); }
void CloseMagics(int force) { char fin[PATH_MAX], fout[PATH_MAX]; FILE *fi, *fo; st_list *mag = NULL, *tmp; snprintf(fin, PATH_MAX, "%s/etc/magic.data", getenv("FTND_ROOT")); snprintf(fout, PATH_MAX, "%s/etc/magic.temp", getenv("FTND_ROOT")); if (MagicUpdated == 1) { if (force || (yes_no((char *)"Database is changed, save changes") == 1)) { working(1, 0, 0); fi = fopen(fout, "r"); fo = fopen(fin, "w"); fread(&magichdr, magichdr.hdrsize, 1, fi); fwrite(&magichdr, magichdr.hdrsize, 1, fo); while (fread(&magic, magichdr.recsize, 1, fi) == 1) if (!magic.Deleted) fill_stlist(&mag, magic.Mask, ftell(fi) - magichdr.recsize); sort_stlist(&mag); for (tmp = mag; tmp; tmp = tmp->next) { fseek(fi, tmp->pos, SEEK_SET); fread(&magic, magichdr.recsize, 1, fi); fwrite(&magic, magichdr.recsize, 1, fo); } fclose(fi); fclose(fo); tidy_stlist(&mag); unlink(fout); chmod(fin, 0640); disk_reset(); Syslog('+', "Updated \"magic.data\""); if (!force) working(6, 0, 0); return; } } chmod(fin, 0640); working(1, 0, 0); unlink(fout); }
void CloseHatch(int force) { char fin[PATH_MAX], fout[PATH_MAX]; FILE *fi, *fo; st_list *hat = NULL, *tmp; snprintf(fin, PATH_MAX, "%s/etc/hatch.data", getenv("MBSE_ROOT")); snprintf(fout, PATH_MAX, "%s/etc/hatch.temp", getenv("MBSE_ROOT")); if (HatchUpdated == 1) { if (force || (yes_no((char *)"Database is changed, save changes") == 1)) { working(1, 0, 0); fi = fopen(fout, "r"); fo = fopen(fin, "w"); fread(&hatchhdr, hatchhdr.hdrsize, 1, fi); fwrite(&hatchhdr, hatchhdr.hdrsize, 1, fo); while (fread(&hatch, hatchhdr.recsize, 1, fi) == 1) if (!hatch.Deleted) fill_stlist(&hat, hatch.Spec, ftell(fi) - hatchhdr.recsize); sort_stlist(&hat); for (tmp = hat; tmp; tmp = tmp->next) { fseek(fi, tmp->pos, SEEK_SET); fread(&hatch, hatchhdr.recsize, 1, fi); fwrite(&hatch, hatchhdr.recsize, 1, fo); } tidy_stlist(&hat); fclose(fi); fclose(fo); unlink(fout); chmod(fin, 0640); disk_reset(); Syslog('+', "Updated \"hatch.data\""); if (!force) working(6, 0, 0); return; } } chmod(fin, 0640); working(1, 0, 0); unlink(fout); }
char *exe_cmd(char *in) { static char obuf[SS_BUFSIZE]; static char ibuf[SS_BUFSIZE]; static char cmd[4]; static char token[SS_BUFSIZE]; static char ebuf[19]; static char var1[16]; int result; char *buf; strncpy(ibuf, in, SS_BUFSIZE); strncpy(cmd, ibuf, 4); strncpy(ebuf, "200:1,Syntax error;", 19); /* * Split the commandline after the colon so we can give the * options directly to the actual functions. Also set a default * and most used answer. */ strncpy(token, &ibuf[5], SS_BUFSIZE); strncpy(obuf, "100:0;", SS_BUFSIZE); /* * The A(counting) commands. * * AINI:5,pid,tty,user,program,city; * 100:1,linenr; * 200:1,Syntax Error; */ if (strncmp(cmd, "AINI", 4) == 0) { if ((result = reg_newcon(token)) != -1) { snprintf(obuf, SS_BUFSIZE, "100:1,%d;", result); return obuf; } else { stat_inc_serr(); return ebuf; } } /* * ACLO:1,pid; * 107:0; * 200:1,Syntax Error; */ if (strncmp(cmd ,"ACLO", 4) == 0) { if (reg_closecon(token) == 0) { strcpy(obuf, "107:0;"); return obuf; } else { stat_inc_serr(); return ebuf; } } /* * ADOI:2,pid,doing; * 100:0; * 200:1,Syntax Error; */ if (strncmp(cmd, "ADOI", 4) == 0) { if (reg_doing(token) == 0) return obuf; else { stat_inc_serr(); return ebuf; } } /* * ATCP:1,pid; * 100:0; * 200:1,Syntax Error; */ if (strncmp(cmd, "ATCP", 4) == 0) { if (reg_ip(token) == 0) return obuf; else { stat_inc_serr(); return ebuf; } } /* * ATTY:2,pid,tty; * 100:0; * 200:1,Syntax Error; */ if (strncmp(cmd, "ATTY", 4) == 0) { if (reg_tty(token) == 0) return obuf; else { stat_inc_serr(); return ebuf; } } /* * ALOG:5,file,program,pid,grade,text; * 100:0; * 201:1,errno; */ if (strncmp(cmd, "ALOG", 4) == 0) { if (userlog(token) != 0) snprintf(obuf, SS_BUFSIZE, "201:1,%d;", oserr); return obuf; } /* * AUSR:3,pid,user,city; * 100:0; * 200:1,Syntax Error; */ if (strncmp(cmd, "AUSR", 4) == 0) { if (reg_user(token) == 0) return obuf; else { stat_inc_serr(); return ebuf; } } /* * ADIS:2,pid,flag; (set Do Not Disturb). * 100:0; * 200:1,Syntax Error; */ if (strncmp(cmd, "ADIS", 4) == 0) { if (reg_silent(token) == 0) return obuf; else { stat_inc_serr(); return ebuf; } } /* * ATIM:2,pid,seconds; * 100:0; * 200:1,Syntax Error; */ if (strncmp(cmd, "ATIM", 4) == 0) { if (reg_timer(TRUE, token) == 0) return obuf; else { stat_inc_serr(); return ebuf; } } /* * ADEF:1,pid; * 100:0; */ if (strncmp(cmd, "ADEF", 4) == 0) { if (reg_timer(FALSE, token) == 0) return obuf; else { stat_inc_serr(); return ebuf; } } /* * Check for personal message * * CIPM:1,pid; (Is personal message present) * 100:2,fromname,message; * 100:0; */ if (strncmp(cmd, "CIPM", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); reg_ipm_r(token, buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * CSPM:3,fromuser,touser,text; (Send personal message). * 100:1,n; n: 1=donotdisturb 2=buffer full 3=error * 100:0; */ if (strncmp(cmd, "CSPM", 4) == 0) { if ((result = reg_spm(token))) snprintf(obuf, SS_BUFSIZE, "100:1,%d;", result); return obuf; } /* * CSYS:2,pid,1; Sysop available for chat (from mbmon) * CSYS:2,pid,0; Sysop goes away (from mbmon) * 100:0; Allways Ok. */ if (strncmp(cmd, "CSYS", 4) == 0) { reg_sysop(token); return obuf; } /* * CPAG:2,pid,reason; Page sysop for a chat * 100:1,n; 1=busy, 2=sysop not available, 3=error * 100:0; Ok */ if (strncmp(cmd, "CPAG", 4) == 0) { if ((result = reg_page(token))) { snprintf(obuf, SS_BUFSIZE, "100:1,%d;", result); } return obuf; } /* * CCAN:1,pid; Cancel sysop page * 100:0; Always Ok */ if (strncmp(cmd, "CCAN", 4) == 0) { reg_cancel(token); return obuf; } /* * Check for sysop page (from mbmon) * * CCKP:0; * 100:3,pid,1,reason; Page is active * 100:3,pid,0,reason; Page is canceled, but user still online * 100:0; No page active */ if (strncmp(cmd, "CCKP", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); reg_checkpage_r(token, buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * Check for sysop in chatmode for forced sysop chat * * CISC:1,pid; * 100:1,1; Yes (and drop into chatmode) * 100:1,0; No */ if (strncmp(cmd, "CISC", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); chat_checksysop_r(token, buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * Connect to chatserver * * CCON:4,pid,username,unixname,n; Connect to chatserver with username, n=1 user is the sysop * 100:1,error; If error * 100:0; Ok */ if (strncmp(cmd, "CCON", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); chat_connect_r(token, buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * Close chat session * * CCLO:1,pid; Leave chatserver * 100:1,error; Error * 100:0; Ok */ if (strncmp(cmd, "CCLO", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); chat_close_r(token, buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * Put message on server * * CPUT:2,pid,message; Put message on server * 100:2,0,error; Error, not fatal and continue chat * 100:2,1,error; Error, fatal and disconnect * 100:0; Ok */ if (strncmp(cmd, "CPUT", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); chat_put_r(token, buf); strncpy(obuf, buf, SS_BUFSIZE); free(buf); return obuf; } /* * Get message from server * * CGET:1,pid; Get message from server * 100:2,0,message; If message present * 100:2,1,error; Error and disconnect * 100:0; No message */ if (strncmp(cmd, "CGET", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); chat_get_r(token, buf); strncpy(obuf, buf, SS_BUFSIZE); free(buf); return obuf; } /* * The D(isk) commands. */ /* * DRES:0; Reset and reread disk tables. * 100:0; Always Ok. */ if (strncmp(cmd, "DRES", 4) == 0) { return disk_reset(); } /* * DSPC:1,n; Check free space in MBytes * 100:2,0,n; No, n = lowest size in MBytes * 100:2,1,n; Yes, n = lowest size in MBytes * 100:1,2; Unknown * 100:1,3; Error */ if (strncmp(cmd, "DSPC", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); disk_check_r(token, buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * DGFS:0; Get filesystem status. * 100:n,data1,..,data10; */ if (strncmp(cmd, "DGFS", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); disk_getfs_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * The G(lobal) commands. * * GNOP:1,pid; * 100:0; */ if (strncmp(cmd ,"GNOP", 4) == 0) { reg_nop(token); return obuf; } /* * GPNG:n,data; * 100:n,data; */ if (strncmp(cmd, "GPNG", 4) == 0) { snprintf(obuf, SS_BUFSIZE, "100:%s", token); return obuf; } /* * GVER:0; * 100:1,Version ...; */ if (strncmp(cmd, "GVER", 4) == 0) { snprintf(obuf, SS_BUFSIZE, "100:1,Version %s;", VERSION); return obuf; } /* * GSTA:0; * 100:19,start,laststart,daily,startups,clients,tot_clients,tot_peak,tot_syntax,tot_comerr, * today_clients,today_peak,today_syntax,today_comerr,!BBSopen,ZMH,internet,Processing,Load,sequence; * 201:1,16; */ if (strncmp(cmd, "GSTA", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); stat_status_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * GMON:1,n; n=1 First time * 100:7,pid,tty,user,program,city,isdoing,starttime; * 100:0; */ if (strncmp(cmd, "GMON", 4) == 0) { strtok(token, ","); strcpy(var1, strtok(NULL, ";")); buf = calloc(SS_BUFSIZE, sizeof(char)); get_reginfo_r(atoi(var1), buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * GSYS:0; * 100:7,calls,pots_calls,isdn_calls,network_calls,local_calls,startdate,last_caller; * 201:1,16; */ if (strncmp(cmd, "GSYS", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); get_sysinfo_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * GLCC:0; * 100:1,n; */ if (strncmp(cmd, "GLCC", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); get_lastcallercount_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * GLCR:1,recno; * 100:9,user,location,level,device,time,mins,calls,speed,actions; * 201:1,16; */ if (strncmp(cmd, "GLCR", 4) == 0) { strtok(token, ","); strcpy(var1, strtok(NULL, ";")); buf = calloc(SS_BUFSIZE, sizeof(char)); get_lastcallerrec_r(atoi(var1), buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * The (M)IB commands, SNMP counters. */ /* * MIB Set Mailer Session * * MSMS:6,kbrcvd,kbsent,direction,state,freqs; * 100:0; * * kbrcvd Kbytes received * kbsent KBytes sent * direction 0=inbount, 1=outbound * state 0=secure, 1=unsecure, 2=bad session * type 0=unknown, 1=ftsc, 2=yoohoo, 3=emsi, 4=binkp * freqs nr of file requests */ if (strncmp(cmd, "MSMS", 4) == 0) { mib_set_mailer(token); return obuf; } /* * MIB Get Mailer Session * * MGMS:0; * 100:12,kbrcvd,kbsent,sessin,sessout,sess_sec,sess_unseq,sess_bad,ftsc,yoohoo,emsi,binkp,freqs; */ if (strncmp(cmd, "MGMS", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); mib_get_mailer_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * MIB Set Tosser Netmail * * MSTN:3,in,out,bad; * 100:0; */ if (strncmp(cmd, "MSTN", 4) == 0) { mib_set_netmail(token); return obuf; } /* * MIB Get Tosser Netmail * * MGTN:0; * 100:3,in,out,bad; */ if (strncmp(cmd, "MGTN", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); mib_get_netmail_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * MIB Set Tosser Internet-email * * MSTI:3,in,out,bad; * 100:0; */ if (strncmp(cmd, "MSTI", 4) == 0) { mib_set_email(token); return obuf; } /* * MIB Get Tosser Internet-email * * MGTI:0; * 100:3,in,out,bad; */ if (strncmp(cmd, "MGTI", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); mib_get_email_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * MIB Set Tosser Echomail * * MSTE:4,in,out,bad,dupe; * 100:0; */ if (strncmp(cmd, "MSTE", 4) == 0) { mib_set_echo(token); return obuf; } /* * MIB Get Tosser Echomail * * MGTE:0; * 100:4,in,out,bad,dupe; */ if (strncmp(cmd, "MGTE", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); mib_get_echo_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * MIB Set Tosser RFC-news * * MSTR:4,in,out,bad,dupe; * 100:0; */ if (strncmp(cmd, "MSTR", 4) == 0) { mib_set_news(token); return obuf; } /* * MIB Get Tosser RFC-news * * MGTR:0; * 100:4,in,out,bad,dupe; */ if (strncmp(cmd, "MGTR", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); mib_get_news_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * MIB Get Tosser Totals * * MGTT:0; * 100:4,in,out,bad,dupe; */ if (strncmp(cmd, "MGTT", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); mib_get_tosser_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * MIB Set Tosser Files * * MSFF:6,in,out,bad,dupe,magics,hatched; * 100:0; */ if (strncmp(cmd, "MSTF", 4) == 0) { mib_set_files(token); return obuf; } /* * MIB Get Tosser Files * * MGFF:0; * 100:6,in,out,bad,dupe,magics,hatched; */ if (strncmp(cmd, "MGTF", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); mib_get_files_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * MIB Set BBS * * MSBB:9,sessions,minutes,posted,uploads,kbupload,downloads,kbdownload,chats,chatminutes; * 100:0; */ if (strncmp(cmd, "MSBB", 4) == 0) { mib_set_bbs(token); return obuf; } /* * MIB Get BBS * * MGBB:0; * 100:9,sessions,minutes,posted,uploads,kbupload,downloads,kbdownload,chats,chatminutes; */ if (strncmp(cmd, "MGBB", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); mib_get_bbs_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * MIB Get Outbound Size * * MGOB:0; * 100:1,size; */ if (strncmp(cmd, "MGOB", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); mib_get_outsize_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * The (S)tatus commands. * * SBBS:0; * 100:2,n,status message; */ if (strncmp(cmd, "SBBS", 4) == 0) { switch(stat_bbs_stat()) { case 0: snprintf(obuf, SS_BUFSIZE, "100:2,0,The system is open for use;"); break; case 1: snprintf(obuf, SS_BUFSIZE, "100:2,1,The system is closed right now!;"); break; case 2: snprintf(obuf, SS_BUFSIZE, "100:2,2,The system is closed for Zone Mail Hour!;"); break; } return obuf; } /* * SOPE:0; * 100:0; */ if (strncmp(cmd, "SOPE", 4) == 0) { stat_set_open(1); return obuf; } /* * SCLO:0; * 100:0; */ if (strncmp(cmd, "SCLO", 4) == 0) { stat_set_open(0); return obuf; } /* * SFRE:0; * 100:1,Running utilities: n Active users: n; * 100:0; * 201:1,16; */ if (strncmp(cmd, "SFRE", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); reg_fre_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * SSEQ:0; * 100:1,number; * 200:1,16; */ if (strncmp(cmd, "SSEQ", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); getseq_r(buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * SEST:1,semafore; Get status of semafore * 100:1,n; 1 = set, 0 = not set * 200:1,16; */ if (strncmp(cmd, "SEST", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); sem_status_r(token, buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * SECR:1,semafore; Set semafore * 100:0; * 200:1,16; */ if (strncmp(cmd, "SECR", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); sem_create_r(token, buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * SERM:1,semafore; Remove semafore * 100:0; * 200:1,16; */ if (strncmp(cmd, "SERM", 4) == 0) { buf = calloc(SS_BUFSIZE, sizeof(char)); sem_remove_r(token, buf); snprintf(obuf, SS_BUFSIZE, "%s", buf); free(buf); return obuf; } /* * If we got this far, there must be an error. */ stat_inc_serr(); Syslog('!', "Comm systax error: \"%s:%s\"", cmd, printable(token, 0)); return ebuf; }
int main(int argc, char **argv) { int fd,i; char *buffer; size_t bufsz; int tracks,sectors,heads; #if defined __WATCOMC__ || defined __GNUC__ setvbuf(stdout,NULL,_IONBF,0); /* flush stdout every printf */ #endif Reset = 0; Zero = 0; Keep = 0; Last = 0; Verify = 0; MaxTrack = MaxHead = -1; Bytes = 0; Disk = File = ToDisk = -1; SysOnly = 0; NoAsk = 0; options(argc,argv); if ((i = disk_get_physical(Disk,&tracks,§ors,&heads)) != DISK_OK) die("BIOS error: ",disk_error(i),0); if ((buffer = malloc(bufsz = sectors * 512)) == NULL) die("Not enough memory found!"," (%u)",bufsz); printf("\n"); if (Reset) { printf("Reseting controller..."); disk_reset(Disk); printf(" Homing disk..."); if ((i = disk_read_p(Disk,0,1,0,buffer,1)) != DISK_OK) die("BIOS error: ",disk_error(i),0); printf(" OK.\n"); } printf("Drive %c: has %u tracks and %u sides.\n",Disk+'A',tracks+1,heads+1); if (Last) setlast(Disk,&MaxTrack,&MaxHead,0); if (SysOnly) setlast(Disk,&MaxTrack,&MaxHead,1); if (ToDisk == 1) printf("\nWrite file \"%s\" to disk in %c:",argv[File],Disk+'A'); else printf("\nWrite disk in %c: to file \"%s\"",Disk+'A',argv[File]); if (!NoAsk && ask(NULL) == 0) return 1; if (ToDisk == 2) /* writing file */ { if ((fd = _open(argv[File],_O_RDONLY)) != -1) { _close(fd); printf("File \"%s\" exists",argv[File]); if (ask("; overwrite?") == 0) return 1; } fd = _open(argv[File],O_CREAT|O_RDWR|O_BINARY|O_TRUNC,S_IREAD|S_IWRITE); } else { fd = _open(argv[File],O_RDWR|O_BINARY); } if (fd == -1) die("file error: ",strerror(errno),errno); errno = 0; putchar('\n'); /* on error we get back here with setjmp() returning non-zero */ if (setjmp(Jmpbuf) == 0) { /* now that everything is verified and prepared, this is the meat */ if (ToDisk == 1) i = file2disk(fd,Disk,tracks,heads,sectors,bufsz,buffer); else i = disk2file(fd,Disk,tracks,heads,sectors,bufsz,buffer); if (i == DISK_OK) printf("\nDone. \n"); /* that's not hard is it... */ } else { puts("\n\nStopped. \n"); getch(); /* eat key from kbhit() */ } _close(fd); #ifdef _WIN32 if (i) #else if ((i = disk_status(Disk)) != 0) #endif die("BIOS error: ",disk_error(i),0); if (errno) die("File error: ",strerror(errno),errno); if (Reset) { printf("\nReseting controller..."); disk_reset(Disk); printf(" Homing disk...\n"); disk_read_p(Disk,0,1,0,buffer,1); } printf("\n%ld bytes written\n",Bytes); return 0; }