1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
/*
* gpt.c:
*
* Copyright (c) 2007 James McKenzie <james@fishsoup.dhs.org>,
* All rights reserved.
*
*/
static char rcsid[] = "$Id: gpt.c,v 1.6 2007/09/10 11:23:08 root Exp $";
/*
* $Log: gpt.c,v $
* Revision 1.6 2007/09/10 11:23:08 root
* *** empty log message ***
*
* Revision 1.4 2007/09/09 22:30:05 root
* *** empty log message ***
*
* Revision 1.3 2007/09/09 22:29:50 root
* *** empty log message ***
*
* Revision 1.2 2007/09/08 18:21:23 root
* *** empty log message ***
*
* Revision 1.1 2007/09/08 16:49:37 root
* *** empty log message ***
*
*/
#include "project.h"
void usage(void)
{
fprintf(stderr,
"Usage:\n"
"gpt -h show help\n"
"gpt -d disk-device -l list partitions\n"
"gpt -d disk-device -s print the address of frist usable sector\n"
" on the disk\n"
" the last usable sector on the disk\n"
"gpt -d disk-device -e print the address of the sector after the\n"
" the last usable sector on the disk\n"
"gpt -d disk-device -f n print the lba of sector immediately after\n"
" the end of parition n\n"
"gpt -d disk-device -n write a new blank parition table to the disk\n"
" the end of parition n\n"
"gpt -d disk-device -a n name type start end\n"
" set partiton n, type can either be a named\n"
" type or a hexadecimal GUID\n"
);
exit(1);
}
int
main (int argc, char *argv[])
{
DISK *d=NULL;
GPT_headers h;
GPT_entry e;
int c;
int n;
int aflag=0;
uint64_t start_lba,end_lba;
extern char *optarg;
extern int optind;
while ((c=getopt(argc,argv,"d:hlsef:na"))!=EOF) {
switch(c) {
case 'd':
d=disk_open(optarg);
if (!d) {
fprintf(stderr,"failed to open disk %s\n",optarg);
perror("open");
return -1;
}
break;
case 'e':
if (!d) usage();
printf("%lld\n",(long long) disk_lbas(d));
return 0;
case 's':
if (!d) usage();
h=headers_get(d);
printf("%lld\n",(long long) h.header.first_usable_lba);
return 0;
case 'f':
h=headers_get(d);
n=atoi(optarg);
e=entry_read(d,&h.header,n);
printf("%lld\n",e.end);
return 0;
case 'n':
new(d);
return 0;
case 'a':
aflag++;
break;
case 'l':
show(d);
return 0;
default:
usage();
}
}
if (!aflag) usage();
if (!d) usage();
if ((argc-optind)!=5) usage();
start_lba=strtoll(argv[optind+3],NULL,0);
end_lba=strtoll(argv[optind+4],NULL,0);
//printf("%lld %lld\n",(long long)start_lba,(long long) end_lba);
n=atoi(argv[optind]);
modify(d,n,argv[optind+1] ,argv[optind+2],start_lba,end_lba);
show(d);
return 0;
}
|