/* setfdprm.c - Sets user-provided floppy disk parameters, re-activates autodetection and switches diagnostic messages. */ /* 1999-02-22 Arkadiusz Mi¶kiewicz * - added Native Language Support */ #include #include #include #include #include #include #include #include #include #include "nls.h" #define FDPRMFILE "/etc/fdprm" #define MAXLINE 200 static int convert(char *arg) { long result; char *end; result = strtol(arg,&end,0); if (!*end) return (int) result; fprintf(stderr,_("Invalid number: %s\n"),arg); exit(1); } static void cmd_without_param(int cmd,int fd) { if (ioctl(fd,cmd,NULL) >= 0) exit(0); perror("ioctl"); exit(1); } static void set_params(int cmd,int fd,char **params) { struct floppy_struct ft; ft.size = convert(params[0]); ft.sect = convert(params[1]); ft.head = convert(params[2]); ft.track = convert(params[3]); ft.stretch = convert(params[4]); ft.gap = convert(params[5]); ft.rate = convert(params[6]); ft.spec1 = convert(params[7]); ft.fmt_gap = convert(params[8]); ft.name = NULL; if (ioctl(fd,cmd,&ft) >= 0) exit(0); perror("ioctl"); exit(1); } static void find_params(int cmd,int fd,char *name) { FILE *file; char line[MAXLINE+2],this[MAXLINE+2],param[9][MAXLINE+2]; char *params[9],*start; int count; if ((file = fopen(FDPRMFILE,"r")) == NULL) { perror(FDPRMFILE); exit(1); } while (fgets(line,MAXLINE,file)) { for (start = line; *start == ' ' || *start == '\t'; start++); if (*start && *start != '\n' && *start != '#') { if (sscanf(start,"%s %s %s %s %s %s %s %s %s %s",this,param[0], param[1],param[2],param[3],param[4],param[5],param[6],param[7], param[8]) != 10) { fprintf(stderr,_("Syntax error: '%s'\n"),line); exit(1); } if (!strcmp(this,name)) { for (count = 0; count < 9; count++) params[count] = param[count]; set_params(cmd,fd,params); } } } fprintf(stderr,_("No such parameter set: '%s'\n"),name); exit(1); } static void usage(char *name) { char *this; if ((this = strrchr(name,'/')) != NULL) name = this+1; fprintf(stderr,_("usage: %s [ -p ] dev name\n"),name); fprintf(stderr,_(" %s [ -p ] dev size sect heads tracks stretch \ gap rate spec1 fmt_gap\n"),name); #ifdef FDMEDCNG fprintf(stderr,_(" %s [ -c | -y | -n | -d ] dev\n"),name); #else fprintf(stderr,_(" %s [ -c | -y | -n ] dev\n"),name); #endif exit(1); } int main(int argc,char **argv) { int fd; unsigned int cmd; char *name; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); name = argv[0]; if (argc < 3) usage(name); cmd = FDSETPRM; if (*argv[1] == '-') { switch (argv[1][1]) { case 'c': cmd = FDCLRPRM; break; case 'p': cmd = FDDEFPRM; break; case 'y': cmd = FDMSGON; break; case 'n': cmd = FDMSGOFF; break; #ifdef FDMEDCNG case 'd': cmd = FDMEDCNG; break; #endif default: usage(name); } argc--; argv++; } if ((fd = open(argv[1],3)) < 0) { /* 3 == no access at all */ perror(argv[1]); exit(1); } if (cmd != FDSETPRM && cmd != FDDEFPRM) { if (argc != 2) usage(name); cmd_without_param(cmd,fd); } if (argc != 11 && argc != 3) usage(name); else if (argc == 11) set_params(cmd,fd,&argv[2]); else find_params(cmd,fd,argv[2]); /* not reached */ return 0; }