aboutsummaryrefslogtreecommitdiffstats
path: root/src/gpt.c
blob: 61feb7a5997d1c1f26d0a7e07c91757859be19be (plain)
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;
}