|
|
1.1 root 1: #include <stddef.h>
2: #include <stdio.h>
3: #include "../scsi.h"
4: #include "../juke.h"
5:
6: static
7: myread(int drive, long block, struct scsi_return *ret, char *err)
8: {
9: struct scsi_cmd cmd;
10:
11: cmd.bus_id = s_id;
12: set10(cmd, 0x28, drive<<5, block>>24, block>>16, block>>8, block, 0, 0, 1, 0);
13: return(s_io(0, &cmd, 0, ret, 1024, err));
14: }
15:
16: j_rvolid(int drive, char *err)
17: {
18: struct scsi_return ret;
19: long b, lastb;
20: char buf[1024];
21: int debug = 0;
22:
23: err[0] = 0;
24: if(s_start(drive, err) < 0)
25: return(-1);
26: if(myread(drive, 0L, &ret, err) == 0){
27: memset(buf, 0, 1024);
28: if(memcmp(buf, ret.data, 1024)){
29: if(debug)
30: fprintf(stderr, "superblok at 0\n");
31: goto done; /* found a superblock at 0 */
32: }
33: }
34: for(b = 1, lastb = -1;;){
35: hack:
36: if(debug)
37: fprintf(stderr, "read block %d\n", b);
38: if(myread(drive, b, &ret, err))
39: break;
40: lastb = b;
41: b = ((long *)ret.data)[9];
42: }
43: if(lastb < 0){
44: if(b == 1){ /* for disks with a bad block 1 */
45: b = 2;
46: goto hack;
47: }
48: if(debug)
49: fprintf(stderr, "tried for superblock at blocks 1,2\n");
50: sprintf(err, "no superblock");
51: s_stop(drive, buf);
52: return(1);
53: }
54: if(myread(drive, lastb, &ret, err) < 0){
55: s_stop(drive, buf);
56: fprintf(stderr, "read fail on block %d (b=%d)\n", lastb, b);/**/
57: return(-1);
58: }
59: if(debug)
60: fprintf(stderr, "superblock at %d\n", lastb);
61: done:
62: strncpy(err, (char *)&ret.data[42], 128);
63: err[127] = 0;
64: s_stop(drive, buf);
65: return(0);
66: }
67:
68: static
69: mywrite(int drive, long block, struct scsi_cmd *cmd, struct scsi_return *ret, char *err)
70: {
71: set10((*cmd), 0x2A, drive<<5, block>>24, block>>16, block>>8, block, 0, 0, 1, 0);
72: return(s_io(0, cmd, 1024, ret, 0, err));
73: }
74:
75: j_wvolid(int drive, char *vol_id, char *err)
76: {
77: char tmpfile[L_tmpnam];
78: char buf[512];
79: struct scsi_return ret;
80: struct scsi_cmd cmd;
81: FILE *fp;
82: int n;
83:
84: printf("mkfs %s\n", vol_id);
85: /* first get the capacity/size for mkfs to make a valid superblock */
86: tmpnam(tmpfile);
87: if((fp = fopen(tmpfile, "w+r")) == NULL){
88: pperror(err, tmpfile);
89: return(-1);
90: }
91: if(s_start(drive, err) < 0)
92: return(-1);
93: set10(cmd, 0x25, drive<<5, 0, 0, 0, 0, 0, 0, 0, 0);
94: if(n = s_io(0, &cmd, 0, &ret, 8, err))
95: return(n);
96: switch(longat(&ret.data[0]))
97: {
98: case 1637999: /* sony 12in clv single density */
99: sprintf(buf, "worm mkfs -n %d -f %s %s", 1600000, tmpfile, vol_id);
100: break;
101: case 3275999: /* sony 12in clv double density */
102: sprintf(buf, "worm mkfs -n %d -f %s %s", 3250000, tmpfile, vol_id);
103: break;
104: default:
105: fprintf(stderr, "warning: bad capacity %d\n", longat(&ret.data[0]));
106: sprintf(buf, "worm mkfs -f %s %s", tmpfile, vol_id);
107: break;
108: }
109: if(system(buf)){
110: sprintf(err, "%s: error", buf);
111: return(-1);
112: }
113: unlink(tmpfile);
114: fseek(fp, 1024L, 0);
115: if(fread(cmd.data, 1, 1024, fp) == 0){
116: pperror(err, "mkfs read");
117: return(-1);
118: }
119: fclose(fp);
120: if(mywrite(drive, 1L, &cmd, &ret, err))
121: return(-1);
122: unlink(tmpfile);
123: s_stop(drive, err);
124: return(0);
125: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.