/* ** QIO_CREATE.C Hein van den Heuvel, July 2013 ** ** Just a quick example... */ #include atrdef /* ** libr/extr=fatdef/out=fatdef.h sys$library:sys$lib_c.tlb */ #include "fatdef.h" #include fibdef #include iodef #include rms #include stdio #include stdlib #include string int sys$assign(), sys$qiow(), lib$stop(), sys$parse(), sys$search(); main(argc,argv) int argc; char *argv[]; { static struct fibdef fib; static struct atrdef atr[2]; static FAT attributes; struct FAB fab; struct NAM nam; struct { int len; char *addr; } dev_desc; struct { int len; char *addr; } name_desc; struct { int len; char *addr; } result_desc; struct { short status; char not_used[6]; } iosb; struct { short count; short not_used; void *address; } fibdes; char esa[256], result_name[256]; int status, channel = 0; if (argc < 3) return 16; /* Use SYS$PARSE + SYS$SEARCH to get DEV and DID */ fab = cc$rms_fab; fab.fab$l_fna = argv[1]; fab.fab$b_fns = strlen (argv[1]); fab.fab$l_nam = &nam; nam = cc$rms_nam; nam.nam$l_esa = esa; nam.nam$b_ess = sizeof (esa) - 1; status = sys$parse(&fab); if (status & 1) status = sys$search(&fab); if ((status & 1) || status == RMS$_FNF) { dev_desc.addr = nam.nam$l_dev; dev_desc.len = nam.nam$b_dev; status = sys$assign(&dev_desc,&channel,0,0,0); } if (!(status & 1)) return status; printf ("DID=(%d,%d,%d)\n", nam.nam$w_did[0], nam.nam$w_did[1], nam.nam$w_did[2]); if (! nam.nam$w_did[0]) return 16; fib.fib$w_did[0] = nam.nam$w_did[0]; fib.fib$w_did[1] = nam.nam$w_did[1]; fib.fib$w_did[2] = nam.nam$w_did[2]; name_desc.addr = nam.nam$l_name; name_desc.len = nam.nam$b_name + nam.nam$b_type + nam.nam$b_ver; attributes.fat$l_gbc32 = atoi(argv[2]); result_desc.addr = result_name; result_desc.len = 256; fibdes.count = sizeof(fib); fibdes.address = &fib; atr[0].atr$w_type = ATR$C_RECATTR; atr[0].atr$w_size = ATR$S_RECATTR; atr[0].atr$l_addr = &attributes; atr[1].atr$w_type = 0; atr[1].atr$w_size = 0; status = sys$qiow(0,channel,IO$_CREATE|IO$M_CREATE, &iosb, 0, 0, &fibdes, &name_desc, &result_desc, &result_desc, &atr, 0); if (status & 1) status = iosb.status; if (!(status & 1)) return status; result_desc.addr[result_desc.len] = 0; printf ("Resulting name = %s\n", result_name); }