summaryrefslogtreecommitdiffstats
path: root/meta/recipes-extended/ltp/ltp/0001-testcases-Fix-largefile-support.patch
blob: e9b48c392fbcbd7ad37b8888cb1d02110aacfd77 (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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
From 3cca69b85c88c6eb4f02313b3c6a9e0f6cc0b5d7 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Wed, 14 Dec 2022 18:14:22 -0800
Subject: [PATCH] testcases: Fix largefile support

Use standard functions ( not 64-bit equivalents ) which operate on off_t
and pass -D_FILE_OFFSET_BITS=64 to enable LFS always so off_t is 64bit
for these tests.

This helps making it portable across musl which has removed the 64bit
transition functions from _GNU_SOURCE namespace.

Upstream-Status: Submitted [https://lists.linux.it/pipermail/ltp/2022-December/032310.html]
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 testcases/kernel/io/direct_io/Makefile             |  2 +-
 testcases/kernel/io/direct_io/diotest2.c           |  4 ++--
 testcases/kernel/io/direct_io/diotest5.c           | 10 +++++-----
 testcases/kernel/io/direct_io/diotest6.c           |  4 ++--
 testcases/kernel/syscalls/fcntl/fcntl18.c          |  6 +++---
 testcases/kernel/syscalls/fcntl/fcntl34.c          |  2 +-
 testcases/kernel/syscalls/fcntl/fcntl36.c          |  4 ++--
 testcases/kernel/syscalls/llseek/Makefile          |  2 ++
 testcases/kernel/syscalls/llseek/llseek01.c        | 14 +++++++-------
 testcases/kernel/syscalls/llseek/llseek02.c        | 12 ++++++------
 testcases/kernel/syscalls/llseek/llseek03.c        |  6 +++---
 testcases/kernel/syscalls/open/Makefile            |  2 ++
 testcases/kernel/syscalls/open/open12.c            |  6 +++---
 testcases/kernel/syscalls/openat/Makefile          |  2 ++
 testcases/kernel/syscalls/openat/openat02.c        |  6 +++---
 testcases/kernel/syscalls/sync_file_range/Makefile |  2 ++
 .../syscalls/sync_file_range/sync_file_range01.c   |  4 ++--
 .../syscalls/sync_file_range/sync_file_range02.c   |  6 +++---
 18 files changed, 51 insertions(+), 43 deletions(-)

diff --git a/testcases/kernel/io/direct_io/Makefile b/testcases/kernel/io/direct_io/Makefile
index 777f7b166..7480d7b0d 100644
--- a/testcases/kernel/io/direct_io/Makefile
+++ b/testcases/kernel/io/direct_io/Makefile
@@ -5,7 +5,7 @@ top_srcdir			?= ../../../..
 
 include $(top_srcdir)/include/mk/testcases.mk
 
-CFLAGS				+= -DSHARED_OFILE -D_GNU_SOURCE
+CFLAGS				+= -DSHARED_OFILE -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 
 LDLIBS				+= -lpthread
 
diff --git a/testcases/kernel/io/direct_io/diotest2.c b/testcases/kernel/io/direct_io/diotest2.c
index c407c46ae..db47ee8ef 100644
--- a/testcases/kernel/io/direct_io/diotest2.c
+++ b/testcases/kernel/io/direct_io/diotest2.c
@@ -78,7 +78,7 @@ int bufsize = BUFSIZE;
  *	For each iteration, write data starting at offse+iter*bufsize
  *	location in the file and read from there.
 */
-int runtest(int fd_r, int fd_w, int iter, off64_t offset, int action)
+int runtest(int fd_r, int fd_w, int iter, off_t offset, int action)
 {
 	char *buf1;
 	char *buf2;
@@ -136,7 +136,7 @@ static void cleanup(void);
 int main(int argc, char *argv[])
 {
 	int iter = 100;		/* Iterations. Default 100 */
-	off64_t offset = 0;	/* Offset. Default 0 */
+	off_t offset = 0;	/* Offset. Default 0 */
 	int i, action, fd_r, fd_w;
 	int fail_count = 0, total = 0, failed = 0;
 
diff --git a/testcases/kernel/io/direct_io/diotest5.c b/testcases/kernel/io/direct_io/diotest5.c
index 9bf917c64..ac66f2a04 100644
--- a/testcases/kernel/io/direct_io/diotest5.c
+++ b/testcases/kernel/io/direct_io/diotest5.c
@@ -75,14 +75,14 @@ int TST_TOTAL = 3;		/* Total number of test conditions */
 static int bufsize = BUFSIZE;	/* Buffer size. Default 4k */
 static int iter = 20;		/* Iterations. Default 20 */
 static int nvector = 20;	/* Vector array. Default 20 */
-static off64_t offset = 0;	/* Start offset. Default 0 */
+static off_t offset = 0;	/* Start offset. Default 0 */
 static char filename[LEN];	/* Test data file */
 static int fd1 = -1;
 /*
  * runtest: Write the data in vector array to the file. Read the data
  *	from the file into another vectory array and verify. Repeat the test.
 */
-int runtest(int fd_r, int fd_w, int iter, off64_t offset, int action)
+int runtest(int fd_r, int fd_w, int iter, off_t offset, int action)
 {
 	int i;
 	struct iovec *iov1, *iov2, *iovp;
@@ -218,7 +218,7 @@ int main(int argc, char *argv[])
 		tst_brkm(TBROK, cleanup, "fd_w open failed for %s: %s",
 			 filename, strerror(errno));
 	}
-	if ((fd_r = open64(filename, O_DIRECT | O_RDONLY | O_CREAT, 0666)) < 0) {
+	if ((fd_r = open(filename, O_DIRECT | O_RDONLY | O_CREAT, 0666)) < 0) {
 		tst_brkm(TBROK, cleanup, "fd_r open failed for %s: %s",
 			 filename, strerror(errno));
 	}
@@ -240,7 +240,7 @@ int main(int argc, char *argv[])
 		tst_brkm(TBROK, cleanup, "fd_w open failed for %s: %s",
 			 filename, strerror(errno));
 	}
-	if ((fd_r = open64(filename, O_RDONLY | O_CREAT, 0666)) < 0) {
+	if ((fd_r = open(filename, O_RDONLY | O_CREAT, 0666)) < 0) {
 		tst_brkm(TBROK, cleanup, "fd_r open failed for %s: %s",
 			 filename, strerror(errno));
 	}
@@ -261,7 +261,7 @@ int main(int argc, char *argv[])
 		tst_brkm(TBROK, cleanup, "fd_w open failed for %s: %s",
 			 filename, strerror(errno));
 	}
-	if ((fd_r = open64(filename, O_DIRECT | O_RDONLY | O_CREAT, 0666)) < 0) {
+	if ((fd_r = open(filename, O_DIRECT | O_RDONLY | O_CREAT, 0666)) < 0) {
 		tst_brkm(TBROK, cleanup, "fd_r open failed for %s: %s",
 			 filename, strerror(errno));
 	}
diff --git a/testcases/kernel/io/direct_io/diotest6.c b/testcases/kernel/io/direct_io/diotest6.c
index a06e6b82b..1905380f0 100644
--- a/testcases/kernel/io/direct_io/diotest6.c
+++ b/testcases/kernel/io/direct_io/diotest6.c
@@ -62,7 +62,7 @@ int TST_TOTAL = 3;
 
 static int iter = 100;
 static int bufsize = BUFSIZE;
-static off64_t offset = 0;
+static off_t offset = 0;
 static int nvector = 20;
 static char filename[LEN];
 static int fd1 = -1;
@@ -84,7 +84,7 @@ static void prg_usage(void)
 */
 int runtest(int fd_r, int fd_w, int childnum, int action)
 {
-	off64_t seekoff;
+	off_t seekoff;
 	int i, ret = -1;
 	ssize_t n = 0;
 	struct iovec *iov_r, *iov_w;
diff --git a/testcases/kernel/syscalls/fcntl/fcntl18.c b/testcases/kernel/syscalls/fcntl/fcntl18.c
index 5eefbd128..1105dd393 100644
--- a/testcases/kernel/syscalls/fcntl/fcntl18.c
+++ b/testcases/kernel/syscalls/fcntl/fcntl18.c
@@ -103,11 +103,11 @@ int main(int ac, char **av)
 	tst_resm(TINFO, "Enter block 2");
 	fail = 0;
 	/* Error condition if address is bad */
-	retval = fcntl(fd, F_GETLK64, (struct flock *)INVAL_FLAG);
+	retval = fcntl(fd, F_GETLK, (struct flock *)INVAL_FLAG);
 	if (errno == EFAULT) {
-		tst_resm(TPASS, "Test F_GETLK64: for errno EFAULT PASSED");
+		tst_resm(TPASS, "Test F_GETLK: for errno EFAULT PASSED");
 	} else {
-		tst_resm(TFAIL, "Test F_GETLK64: for errno EFAULT FAILED");
+		tst_resm(TFAIL, "Test F_GETLK: for errno EFAULT FAILED");
 		fail = 1;
 	}
 	if (fail) {
diff --git a/testcases/kernel/syscalls/fcntl/fcntl34.c b/testcases/kernel/syscalls/fcntl/fcntl34.c
index 3442114ff..536dead29 100644
--- a/testcases/kernel/syscalls/fcntl/fcntl34.c
+++ b/testcases/kernel/syscalls/fcntl/fcntl34.c
@@ -54,7 +54,7 @@ void *thread_fn_01(void *arg)
 
 	memset(buf, (intptr_t)arg, write_size);
 
-	struct flock64 lck = {
+	struct flock lck = {
 		.l_whence = SEEK_SET,
 		.l_start  = 0,
 		.l_len    = 1,
diff --git a/testcases/kernel/syscalls/fcntl/fcntl36.c b/testcases/kernel/syscalls/fcntl/fcntl36.c
index d6b07fc41..4e4d48afc 100644
--- a/testcases/kernel/syscalls/fcntl/fcntl36.c
+++ b/testcases/kernel/syscalls/fcntl/fcntl36.c
@@ -72,7 +72,7 @@ static void *fn_ofd_w(void *arg)
 	int fd = SAFE_OPEN(fname, O_RDWR);
 	long wt = pa->cnt;
 
-	struct flock64 lck = {
+	struct flock lck = {
 		.l_whence = SEEK_SET,
 		.l_start  = pa->offset,
 		.l_len    = pa->length,
@@ -151,7 +151,7 @@ static void *fn_ofd_r(void *arg)
 	int i;
 	int fd = SAFE_OPEN(fname, O_RDWR);
 
-	struct flock64 lck = {
+	struct flock lck = {
 		.l_whence = SEEK_SET,
 		.l_start  = pa->offset,
 		.l_len    = pa->length,
diff --git a/testcases/kernel/syscalls/llseek/Makefile b/testcases/kernel/syscalls/llseek/Makefile
index 044619fb8..8a916d0fa 100644
--- a/testcases/kernel/syscalls/llseek/Makefile
+++ b/testcases/kernel/syscalls/llseek/Makefile
@@ -6,3 +6,5 @@ top_srcdir		?= ../../../..
 include $(top_srcdir)/include/mk/testcases.mk
 
 include $(top_srcdir)/include/mk/generic_leaf_target.mk
+
+CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
diff --git a/testcases/kernel/syscalls/llseek/llseek01.c b/testcases/kernel/syscalls/llseek/llseek01.c
index 50f35493d..efb444dc8 100644
--- a/testcases/kernel/syscalls/llseek/llseek01.c
+++ b/testcases/kernel/syscalls/llseek/llseek01.c
@@ -4,7 +4,7 @@
  *   07/2001 Ported by Wayne Boyer
  */
 /*
- * Verify that lseek64() call succeeds to set the file pointer position to an
+ * Verify that lseek() call succeeds to set the file pointer position to an
  * offset larger than file size limit (RLIMIT_FSIZE). Also, verify that any
  * attempt to write to this location fails.
  */
@@ -27,22 +27,22 @@ static int fildes;
 
 static void verify_llseek(void)
 {
-	TEST(lseek64(fildes, (loff_t) (80 * BUFSIZ), SEEK_SET));
+	TEST(lseek(fildes, (loff_t) (80 * BUFSIZ), SEEK_SET));
 	if (TST_RET == (80 * BUFSIZ))
-		tst_res(TPASS, "lseek64() can set file pointer position larger than file size limit");
+		tst_res(TPASS, "lseek() can set file pointer position larger than file size limit");
 	else
-		tst_res(TFAIL, "lseek64() returned wrong value %ld when write past file size", TST_RET);
+		tst_res(TFAIL, "lseek() returned wrong value %ld when write past file size", TST_RET);
 
 	if (write(fildes, write_buff, BUFSIZ) == -1)
 		tst_res(TPASS,"write failed after file size limit");
 	else
 		tst_brk(TFAIL, "write successful after file size limit");
 
-	TEST(lseek64(fildes, (loff_t) BUFSIZ, SEEK_SET));
+	TEST(lseek(fildes, (loff_t) BUFSIZ, SEEK_SET));
 	if (TST_RET == BUFSIZ)
-		tst_res(TPASS,"lseek64() can set file pointer position under filer size limit");
+		tst_res(TPASS,"lseek() can set file pointer position under filer size limit");
 	else
-		tst_brk(TFAIL,"lseek64() returns wrong value %ld when write under file size", TST_RET);
+		tst_brk(TFAIL,"lseek() returns wrong value %ld when write under file size", TST_RET);
 
 	if (write(fildes, write_buff, BUFSIZ) != -1)
 		tst_res(TPASS, "write succcessfully under file size limit");
diff --git a/testcases/kernel/syscalls/llseek/llseek02.c b/testcases/kernel/syscalls/llseek/llseek02.c
index 3d9c21fc9..5431969f9 100644
--- a/testcases/kernel/syscalls/llseek/llseek02.c
+++ b/testcases/kernel/syscalls/llseek/llseek02.c
@@ -5,8 +5,8 @@
  */
 /*
  * Description:
- * 1) lseek64(2) fails and sets errno to EINVAL when whence is invalid.
- * 2) lseek64(2) fails ans sets errno to EBADF when fd is not an open
+ * 1) lseek(2) fails and sets errno to EINVAL when whence is invalid.
+ * 2) lseek(2) fails ans sets errno to EBADF when fd is not an open
  * file descriptor.
  */
 
@@ -39,17 +39,17 @@ static void verify_llseek(unsigned int n)
 {
 	struct tcase *tc = &tcases[n];
 
-	TEST(lseek64(*tc->fd, (loff_t) 1, tc->whence));
+	TEST(lseek(*tc->fd, (loff_t) 1, tc->whence));
 	if (TST_RET != (off_t) -1) {
-		tst_res(TFAIL, "lseek64(%d, 1, %d) succeeded unexpectedly (%ld)",
+		tst_res(TFAIL, "lseek(%d, 1, %d) succeeded unexpectedly (%ld)",
 			*tc->fd, tc->whence, TST_RET);
 		return;
 	}
 	if (TST_ERR == tc->exp_err) {
-		tst_res(TPASS | TTERRNO, "lseek64(%d, 1, %d) failed as expected",
+		tst_res(TPASS | TTERRNO, "lseek(%d, 1, %d) failed as expected",
 			*tc->fd, tc->whence);
 	} else {
-		tst_res(TFAIL | TTERRNO, "lseek64(%d, 1, %d) failed "
+		tst_res(TFAIL | TTERRNO, "lseek(%d, 1, %d) failed "
 		        "unexpectedly, expected %s", *tc->fd, tc->whence,
 		        tst_strerrno(tc->exp_err));
 	}
diff --git a/testcases/kernel/syscalls/llseek/llseek03.c b/testcases/kernel/syscalls/llseek/llseek03.c
index d780f2af6..6c34119e5 100644
--- a/testcases/kernel/syscalls/llseek/llseek03.c
+++ b/testcases/kernel/syscalls/llseek/llseek03.c
@@ -72,7 +72,7 @@ static const char *str_whence(int whence)
 	}
 }
 
-static void verify_lseek64(unsigned int n)
+static void verify_lseek(unsigned int n)
 {
 	struct tcase *tc = &tcases[n];
 	char read_buf[128];
@@ -82,7 +82,7 @@ static void verify_lseek64(unsigned int n)
 
 	SAFE_READ(1, fd, read_buf, 4);
 
-	TEST(lseek64(fd, tc->off, tc->whence));
+	TEST(lseek(fd, tc->off, tc->whence));
 
 	if (TST_RET == -1) {
                 tst_res(TFAIL | TTERRNO, "llseek failed on %s ", TEST_FILE);
@@ -121,6 +121,6 @@ exit:
 static struct tst_test test = {
 	.needs_tmpdir = 1,
 	.setup = setup,
-	.test = verify_lseek64,
+	.test = verify_lseek,
 	.tcnt = ARRAY_SIZE(tcases),
 };
diff --git a/testcases/kernel/syscalls/open/Makefile b/testcases/kernel/syscalls/open/Makefile
index 044619fb8..8a916d0fa 100644
--- a/testcases/kernel/syscalls/open/Makefile
+++ b/testcases/kernel/syscalls/open/Makefile
@@ -6,3 +6,5 @@ top_srcdir		?= ../../../..
 include $(top_srcdir)/include/mk/testcases.mk
 
 include $(top_srcdir)/include/mk/generic_leaf_target.mk
+
+CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
diff --git a/testcases/kernel/syscalls/open/open12.c b/testcases/kernel/syscalls/open/open12.c
index bdf29a9a8..c840de53d 100644
--- a/testcases/kernel/syscalls/open/open12.c
+++ b/testcases/kernel/syscalls/open/open12.c
@@ -233,14 +233,14 @@ static void test_cloexec(void)
 static void test_largefile(void)
 {
 	int fd;
-	off64_t offset;
+	off_t offset;
 
 	fd = SAFE_OPEN(cleanup, LARGE_FILE,
 				O_LARGEFILE | O_RDWR | O_CREAT, 0777);
 
-	offset = lseek64(fd, 4.1*1024*1024*1024, SEEK_SET);
+	offset = lseek(fd, 4.1*1024*1024*1024, SEEK_SET);
 	if (offset == -1)
-		tst_brkm(TBROK | TERRNO, cleanup, "lseek64 failed");
+		tst_brkm(TBROK | TERRNO, cleanup, "lseek failed");
 
 	SAFE_WRITE(cleanup, 1, fd, LARGE_FILE, sizeof(LARGE_FILE));
 
diff --git a/testcases/kernel/syscalls/openat/Makefile b/testcases/kernel/syscalls/openat/Makefile
index 044619fb8..8a916d0fa 100644
--- a/testcases/kernel/syscalls/openat/Makefile
+++ b/testcases/kernel/syscalls/openat/Makefile
@@ -6,3 +6,5 @@ top_srcdir		?= ../../../..
 include $(top_srcdir)/include/mk/testcases.mk
 
 include $(top_srcdir)/include/mk/generic_leaf_target.mk
+
+CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
diff --git a/testcases/kernel/syscalls/openat/openat02.c b/testcases/kernel/syscalls/openat/openat02.c
index 2ce119033..f6113852a 100644
--- a/testcases/kernel/syscalls/openat/openat02.c
+++ b/testcases/kernel/syscalls/openat/openat02.c
@@ -22,7 +22,7 @@
  *   2)openat() succeeds to enable the close-on-exec flag for a
  *     file descriptor, when 'flags' is set to O_CLOEXEC.
  *   3)openat() succeeds to allow files whose sizes cannot be
- *     represented in an off_t but can be represented in an off64_t
+ *     represented in an off_t but can be represented in an off_t
  *     to be opened, when 'flags' is set to O_LARGEFILE.
  *   4)openat() succeeds to not update the file last access time
  *     (st_atime in the inode) when the file is read, when 'flags'
@@ -193,12 +193,12 @@ void testfunc_cloexec(void)
 void testfunc_largefile(void)
 {
 	int fd;
-	off64_t offset;
+	off_t offset;
 
 	fd = SAFE_OPEN(cleanup, LARGE_FILE,
 				O_LARGEFILE | O_RDWR | O_CREAT, 0777);
 
-	offset = lseek64(fd, 4.1*1024*1024*1024, SEEK_SET);
+	offset = lseek(fd, 4.1*1024*1024*1024, SEEK_SET);
 	if (offset == -1)
 		tst_brkm(TBROK | TERRNO, cleanup, "lseek64 failed");
 
diff --git a/testcases/kernel/syscalls/sync_file_range/Makefile b/testcases/kernel/syscalls/sync_file_range/Makefile
index 044619fb8..8a916d0fa 100644
--- a/testcases/kernel/syscalls/sync_file_range/Makefile
+++ b/testcases/kernel/syscalls/sync_file_range/Makefile
@@ -6,3 +6,5 @@ top_srcdir		?= ../../../..
 include $(top_srcdir)/include/mk/testcases.mk
 
 include $(top_srcdir)/include/mk/generic_leaf_target.mk
+
+CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
diff --git a/testcases/kernel/syscalls/sync_file_range/sync_file_range01.c b/testcases/kernel/syscalls/sync_file_range/sync_file_range01.c
index 187ef6071..47188aa48 100644
--- a/testcases/kernel/syscalls/sync_file_range/sync_file_range01.c
+++ b/testcases/kernel/syscalls/sync_file_range/sync_file_range01.c
@@ -44,8 +44,8 @@ static int bfd = -1;
 
 struct test_case {
 	int *fd;
-	off64_t offset;
-	off64_t nbytes;
+	off_t offset;
+	off_t nbytes;
 	unsigned int flags;
 	int error;
 } tcases[] = {
diff --git a/testcases/kernel/syscalls/sync_file_range/sync_file_range02.c b/testcases/kernel/syscalls/sync_file_range/sync_file_range02.c
index 5da751c70..28a8156c8 100644
--- a/testcases/kernel/syscalls/sync_file_range/sync_file_range02.c
+++ b/testcases/kernel/syscalls/sync_file_range/sync_file_range02.c
@@ -31,10 +31,10 @@
 
 struct testcase {
 	char *fname;
-	off64_t sync_off;
-	off64_t sync_size;
+	off_t sync_off;
+	off_t sync_size;
 	size_t exp_sync_size;
-	off64_t write_off;
+	off_t write_off;
 	size_t write_size_mb;
 	const char *desc;
 };