summaryrefslogtreecommitdiffstats
path: root/disk-utils/setfdprm.c
diff options
context:
space:
mode:
Diffstat (limited to 'disk-utils/setfdprm.c')
-rw-r--r--disk-utils/setfdprm.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/disk-utils/setfdprm.c b/disk-utils/setfdprm.c
new file mode 100644
index 000000000..bd98f5a2f
--- /dev/null
+++ b/disk-utils/setfdprm.c
@@ -0,0 +1,149 @@
+/* setfdprm.c - Sets user-provided floppy disk parameters, re-activates
+ autodetection and switches diagnostic messages. */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <linux/fd.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,'/')) 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);
+}
+
+
+main(int argc,char **argv)
+{
+ int cmd,fd;
+ char *name;
+
+ 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);
+ if (argc == 11) set_params(cmd,fd,&argv[2]);
+ else find_params(cmd,fd,argv[2]);
+}