source: MondoRescue/branches/3.3/mindi-busybox/util-linux/fdformat.c@ 3625

Last change on this file since 3625 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 3.7 KB
Line 
1/* vi: set sw=4 ts=4: */
2/* fdformat.c - Low-level formats a floppy disk - Werner Almesberger
3 * 5 July 2003 -- modified for Busybox by Erik Andersen
4 *
5 * Licensed under GPLv2, see file LICENSE in this source tree.
6 */
7
8//usage:#define fdformat_trivial_usage
9//usage: "[-n] DEVICE"
10//usage:#define fdformat_full_usage "\n\n"
11//usage: "Format floppy disk\n"
12//usage: "\n -n Don't verify after format"
13
14#include "libbb.h"
15
16
17/* Stuff extracted from linux/fd.h */
18struct floppy_struct {
19 unsigned int size, /* nr of sectors total */
20 sect, /* sectors per track */
21 head, /* nr of heads */
22 track, /* nr of tracks */
23 stretch; /* !=0 means double track steps */
24#define FD_STRETCH 1
25#define FD_SWAPSIDES 2
26
27 unsigned char gap, /* gap1 size */
28
29 rate, /* data rate. |= 0x40 for perpendicular */
30#define FD_2M 0x4
31#define FD_SIZECODEMASK 0x38
32#define FD_SIZECODE(floppy) (((((floppy)->rate&FD_SIZECODEMASK)>> 3)+ 2) %8)
33#define FD_SECTSIZE(floppy) ( (floppy)->rate & FD_2M ? \
34 512 : 128 << FD_SIZECODE(floppy) )
35#define FD_PERP 0x40
36
37 spec1, /* stepping rate, head unload time */
38 fmt_gap; /* gap2 size */
39 const char * name; /* used only for predefined formats */
40};
41struct format_descr {
42 unsigned int device,head,track;
43};
44#define FDFMTBEG _IO(2,0x47)
45#define FDFMTTRK _IOW(2,0x48, struct format_descr)
46#define FDFMTEND _IO(2,0x49)
47#define FDGETPRM _IOR(2, 0x04, struct floppy_struct)
48#define FD_FILL_BYTE 0xF6 /* format fill byte. */
49
50int fdformat_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
51int fdformat_main(int argc UNUSED_PARAM, char **argv)
52{
53 int fd, n, cyl, read_bytes, verify;
54 unsigned char *data;
55 struct stat st;
56 struct floppy_struct param;
57 struct format_descr descr;
58
59 opt_complementary = "=1"; /* must have 1 param */
60 verify = !getopt32(argv, "n");
61 argv += optind;
62
63 xstat(*argv, &st);
64 if (!S_ISBLK(st.st_mode)) {
65 bb_error_msg_and_die("%s: not a block device", *argv);
66 /* do not test major - perhaps this was an USB floppy */
67 }
68
69 /* O_RDWR for formatting and verifying */
70 fd = xopen(*argv, O_RDWR);
71
72 /* original message was: "Could not determine current format type" */
73 xioctl(fd, FDGETPRM, &param);
74
75 printf("%s-sided, %u tracks, %u sec/track. Total capacity %d kB\n",
76 (param.head == 2) ? "Double" : "Single",
77 param.track, param.sect, param.size >> 1);
78
79 /* FORMAT */
80 printf("Formatting... ");
81 xioctl(fd, FDFMTBEG, NULL);
82
83 /* n == track */
84 for (n = 0; n < param.track; n++) {
85 descr.head = 0;
86 descr.track = n;
87 xioctl(fd, FDFMTTRK, &descr);
88 printf("%3d\b\b\b", n);
89 if (param.head == 2) {
90 descr.head = 1;
91 xioctl(fd, FDFMTTRK, &descr);
92 }
93 }
94
95 xioctl(fd, FDFMTEND, NULL);
96 puts("Done");
97
98 /* VERIFY */
99 if (verify) {
100 /* n == cyl_size */
101 n = param.sect*param.head*512;
102
103 data = xmalloc(n);
104 printf("Verifying... ");
105 for (cyl = 0; cyl < param.track; cyl++) {
106 printf("%3d\b\b\b", cyl);
107 read_bytes = safe_read(fd, data, n);
108 if (read_bytes != n) {
109 if (read_bytes < 0) {
110 bb_perror_msg(bb_msg_read_error);
111 }
112 bb_error_msg_and_die("problem reading cylinder %d, "
113 "expected %d, read %d", cyl, n, read_bytes);
114 // FIXME: maybe better seek & continue??
115 }
116 /* Check backwards so we don't need a counter */
117 while (--read_bytes >= 0) {
118 if (data[read_bytes] != FD_FILL_BYTE) {
119 printf("bad data in cyl %d\nContinuing... ", cyl);
120 }
121 }
122 }
123 /* There is no point in freeing blocks at the end of a program, because
124 all of the program's space is given back to the system when the process
125 terminates.*/
126
127 if (ENABLE_FEATURE_CLEAN_UP) free(data);
128
129 puts("Done");
130 }
131
132 if (ENABLE_FEATURE_CLEAN_UP) close(fd);
133
134 /* Don't bother closing. Exit does
135 * that, so we can save a few bytes */
136 return EXIT_SUCCESS;
137}
Note: See TracBrowser for help on using the repository browser.