1: # include   <pv.h>
   2: # include   <ingres.h>
   3: # include   <access.h>
   4: # include   <aux.h>
   5: # include   <catalog.h>
   6: # include   <symbol.h>
   7: # include   <func.h>
   8: # include   <sccs.h>
   9: # include   <errors.h>
  10: 
  11: SCCSID(@(#)rmqm.c	8.3	2/8/85)
  12: 
  13: /*
  14: **  RMQM -- DBU to delete protection and integrity constraints
  15: **
  16: **	Trace Flags:
  17: **		43
  18: */
  19: 
  20: 
  21: extern  short   tTdbu[];
  22: extern  int dest_const();
  23: extern  int null_fn();
  24: 
  25: struct fn_def RmqmFn =
  26: {
  27:     "RMQM",
  28:     dest_const,
  29:     null_fn,
  30:     null_fn,
  31:     NULL,
  32:     0,
  33:     tTdbu,
  34:     100,
  35:     'Z',
  36:     0
  37: };
  38: /*
  39: **  DEST_CONST -- destroy constraints
  40: **
  41: **	Parameters:
  42: **		pc -- number of parameters in pv
  43: **		pv -- pv [0] == DESTPROT destroy permission
  44: **			         == DESTINTEG destroy integrity constraint
  45: **		        pv [1]    relation from which to destroy constraint
  46: **		        pv [2] == if (pc != 2) relation from which to delete
  47: **				     	constraints
  48: **		        pv[3] ... pv[pc - 1] == id of constraint
  49: **
  50: **	Returns:
  51: **		0
  52: **
  53: **	Side Effects:
  54: **		destroys constraints. Involves activity on catalogs 'relation',
  55: **		protect, integrities, and tree.
  56: **
  57: **	Trace Flags:
  58: **		43, 0
  59: */
  60: 
  61: dest_const(pc, pv)
  62: int pc;
  63: PARM    pv[];
  64: {
  65:     DESC            d;
  66:     register int        i;
  67:     int         mode;
  68:     extern struct admin Admin;
  69: 
  70: #	ifdef xZTR1
  71:     if (tTf(43, 0))
  72:     {
  73:         printf("dest_const: ");
  74:         prvect(pc, pv);
  75:     }
  76: #	endif
  77: 
  78:     if (!(Admin.adhdr.adflags & A_QRYMOD))
  79:         return (0);
  80:     i = openr(&d, OR_RELTID, pv[1].pv_val.pv_str);
  81:     if (i < 0)
  82:         syserr("dest_const: openr(%s) %d", pv[1].pv_val.pv_str, i);
  83: 
  84:     if (i == 1 || !bequal(Usercode, d.reldum.relowner, UCODE_SZ))
  85:     {
  86:         error(RELNOEXIST, pv[1].pv_val.pv_str, 0);
  87:         return (0);
  88:     }
  89: 
  90:     mode = atoi(pv[0].pv_val.pv_str);
  91:     if (mode == DESTPROT)
  92:         dest_prot(&d, &pv[2]);
  93:     else if (mode == DESTINTEG)
  94:         dest_integ(&d, &pv[2]);
  95:     else
  96:         syserr("dest_const: bad mode %d", mode);
  97:     return (0);
  98: }
  99: /*
 100: **  DEST_INTEG -- directs destruction of integrity constraints
 101: **
 102: **	Parameters:
 103: **		desc -- descriptor for relation
 104: **		intv -- PV_EOF terminated list of id strings, if first element
 105: **		        is PV_EOF means "all"
 106: **
 107: **	Returns:
 108: **		none
 109: **
 110: **	Side Effects:
 111: **		deletes integrity constraint. Activity on 'relation', integrities,
 112: **		and tree.
 113: */
 114: 
 115: dest_integ(d, intv)
 116: register DESC   *d;
 117: PARM        intv[];
 118: {
 119:     extern DESC     Intdes;
 120:     struct integrity    tuple, key;
 121:     struct tree     tkey;
 122:     register        i, j;
 123:     int         tree_const();
 124:     int         int_inttree();
 125: 
 126: #	ifdef xZTR1
 127:     if (tTf(43, 1))
 128:         printf("dest_integ((%s, %s)...)\n", d->reldum.relid, d->reldum.relowner);
 129: #	endif
 130: 
 131:     i_cat("integrities", &Intdes, &key, d->reldum.relid, INTRELID,
 132:     d->reldum.relowner, INTRELOWNER, mdINTEG, &tkey);
 133: 
 134:     if (intv[0].pv_type == PV_EOF)
 135:     {
 136:         /* destroy integrity 'relation' ALL */
 137:         if (!(d->reldum.relstat & S_INTEG))
 138:             return (0);
 139:         del_all(d, &Intdes, &key, &tuple, &tkey, S_INTEG,
 140:         tree_const, int_inttree);
 141:         return (0);
 142:     }
 143:     /* destroy integrity 'relation' int {, int} */
 144:     for (i = 0; intv[i].pv_type != PV_EOF; i++)
 145:         del_int(&Intdes, &key, &tuple, &tkey, intv[i].pv_val.pv_str, INTTREE,
 146:         tree_const, int_inttree);
 147: 
 148:     /* rescan to output error messages */
 149:     for (j = 0; j < i; j++)
 150:         if (*(intv[j].pv_val.pv_str))
 151:             error(BADINTEG, intv[j].pv_val.pv_str, 0);
 152: 
 153:     /* finally, check that there are still integrity constraints
 154: 	** on the relation, if not must reset the S_INTEG bit in the relation
 155: 	** relation tuple for that relation.
 156: 	*/
 157:     chk_const(d, &Intdes, &key, &tuple, d->reldum.relid, INTRELID, d->reldum.relowner,
 158:     INTRELOWNER, S_INTEG);
 159: }
 160: /*
 161: **  DEST_PROT -- directs destruction of protection constraints
 162: **
 163: **	Parameters:
 164: **		desc -- descriptor for relation
 165: **		intv -- PV_EOF terminated list of id strings, if first element
 166: **		        is PV_EOF means "all"
 167: **
 168: **	Returns:
 169: **		none
 170: **
 171: **	Side Effects:
 172: **		deletes protection constraint. Activity on 'relation',
 173: **		protect, and tree.
 174: **
 175: **	Trace Flags:
 176: **		43, 2
 177: */
 178: 
 179: 
 180: dest_prot(d, intv)
 181: register DESC   *d;
 182: PARM        intv[];
 183: {
 184:     extern DESC Prodes;
 185:     struct protect  tuple, key;
 186:     struct tree tkey;
 187:     register    i, j;
 188:     int     propermid;
 189:     int     prot_protree();
 190:     int     tree_prot();
 191: 
 192: #	ifdef xZTR1
 193:     if (tTf(43, 2))
 194:         printf("dest_prot((%s, %s)...)\n", d->reldum.relid, d->reldum.relowner);
 195: #	endif
 196: 
 197:     i_cat("protect", &Prodes, &key, d->reldum.relid, PRORELID, d->reldum.relowner,
 198:     PRORELOWN, mdPROT, &tkey);
 199: 
 200:     if (intv[0].pv_type == PV_EOF)
 201:     {
 202:         /* destroy permit 'relation' ALL */
 203:         if (!(d->reldum.relstat & S_PROTRET) || !(d->reldum.relstat & S_PROTALL))
 204:             r_relstat(d, S_PROTRET | S_PROTALL, 1);
 205:         if (!(d->reldum.relstat & S_PROTUPS))
 206:             return (0);
 207:         del_all(d, &Prodes, &key, &tuple, &tkey, S_PROTUPS,
 208:         tree_prot, prot_protree);
 209:         return (0);
 210:     }
 211:     /* destroy permit 'relation' int {, int} */
 212:     for (i = 0; intv[i].pv_type != PV_EOF; i++)
 213:     {
 214:         propermid = atoi(intv[i].pv_val.pv_str);
 215:         if (propermid == 0)
 216:         {
 217:             if (!(d->reldum.relstat & S_PROTALL))
 218:             {
 219:                 r_relstat(d, S_PROTALL, 1);
 220:                 intv[i].pv_val.pv_str = 0;
 221:             }
 222:             continue;
 223:         }
 224:         else if (propermid == 1)
 225:         {
 226:             if (!(d->reldum.relstat & S_PROTRET))
 227:             {
 228:                 r_relstat(d, S_PROTRET, 1);
 229:                 intv[i].pv_val.pv_str = 0;
 230:             }
 231:             continue;
 232:         }
 233:         del_int(&Prodes, &key, &tuple, &tkey, intv[i].pv_val.pv_str, PROPERMID,
 234:         tree_prot, prot_protree);
 235:     }
 236:     /* rescan to output error messages */
 237:     for (j = 0; j < i; j++)
 238:         if (intv[j].pv_val.pv_str && intv[j].pv_val.pv_str[0] )
 239:             error(BADPROT, intv[j].pv_val.pv_str, 0);
 240: 
 241:     /* finally, check that there are still permissions
 242: 	** on the relation, if not must reset the S_PROTUPS bit in the relation
 243: 	** relation tuple for that relation's relstat.
 244: 	*/
 245:     chk_const(d, &Prodes, &key, &tuple, d->reldum.relid, PRORELID,
 246:     d->reldum.relowner, PRORELOWN, S_PROTUPS);
 247: }
 248: /*
 249: **  I_CAT -- prepare catalogs for deletin of constraint
 250: **
 251: **	Initializes treerelid, treeowner, and treetype fields
 252: **	of tree key. Also relation id and owner fields of
 253: **	appropriate catalog c_desc, with key 'key'.
 254: **
 255: **	Parameters:
 256: **		c_name -- name of catalog for opencatalog
 257: **		c_desc -- descriptor of catalog
 258: **		key -- key for catalog
 259: **		relid -- relation.relid for relation to be de-constrained
 260: **		id_attno -- attno of relid in constraint catalog c_desc
 261: **		relowner -- relation.relowner for rel to be de-constrained
 262: **		own_attno -- attno of owner in constrain catalog
 263: **		type -- treetype for tree tuple (depends on catalog)
 264: **		tkey -- key for tree catalog
 265: **
 266: **	Returns:
 267: **		none
 268: **
 269: **	Side Effects:
 270: **		opencatalogs the constraint catalog c_desc, and the "tree" rel
 271: **		for READ/WRITE. Sets keys.
 272: **
 273: **	Trace Flags:
 274: **		43, 3
 275: */
 276: 
 277: i_cat(c_name, c_desc, key, relid, id_attno, relowner, own_attno, type, tkey)
 278: char        *c_name;
 279: DESC        *c_desc;
 280: char        *key;
 281: char        *relid;
 282: int     id_attno;
 283: char        *relowner;
 284: int     own_attno;
 285: int     type;
 286: struct tree *tkey;
 287: {
 288:     extern DESC Treedes;
 289:     char        realtype;
 290: 
 291: #	ifdef xZTR1
 292:     if (tTf(43, 3))
 293:         printf("i_cat(c_name \"%s\", relid %s id_attno %d relowner %s own_attno %d type %d)\n",
 294:         c_name, relid, id_attno, relowner, own_attno, type);
 295: #	endif
 296: 
 297:     realtype = type;
 298:     opencatalog("tree", OR_WRITE);
 299:     setkey(&Treedes, tkey, relid, TREERELID);
 300:     setkey(&Treedes, tkey, relowner, TREEOWNER);
 301:     setkey(&Treedes, tkey, &realtype, TREETYPE);
 302:     opencatalog(c_name, OR_WRITE);
 303:     clearkeys(c_desc);
 304:     setkey(c_desc, key, relid, id_attno);
 305:     setkey(c_desc, key, relowner, own_attno);
 306: }
 307: /*
 308: **  DEL_ALL -- delete all constraints for a given relation
 309: **
 310: **	Deletes all constraints of a given type given by a constraint
 311: **	catalog 'c_desc'. Note that Protection constraints 0 & 1, given
 312: **	by relation.relstat field are not deleted here.
 313: **
 314: **	Parameters:
 315: **		r_desc -- descriptor for relation to de-constrain (for
 316: **			r_relstat)
 317: **		c_desc -- constraint catalog descriptor
 318: **		key -- c_desc's key
 319: **		tuple -- c_desc's tuple (needed because sizeof tuple is not
 320: **			known here, so must be allocated beforehand)
 321: **		tkey -- tree key with TREERELID and TREERELOWNER setkeyed
 322: **		bit -- bits in relstat to reset after deleting all constraints
 323: **		tree_pred -- called with constraint tuple to determine
 324: **			wether a tree tuple is present or not (as can happen
 325: **			for protect catalog)
 326: **		tree_field -- should return the treeid from tuple
 327: **
 328: **	Returns:
 329: **		none
 330: **
 331: **	Side Effects:
 332: **		tree and constraint catalog activity
 333: **
 334: **	Requires:
 335: **		del_tree()
 336: **		r_relstat()
 337: **
 338: **	Called By:
 339: **		dest_????
 340: **
 341: **	Trace Flags:
 342: **		43, 4
 343: **
 344: **	Syserrs:
 345: **		bad find, get, delete, flush_rel
 346: **
 347: **	History:
 348: **		1/10/79 -- (marc) written
 349: */
 350: 
 351: del_all(r_desc, c_desc, key, tuple, tkey, bit, tree_pred, tree_field)
 352: DESC        *r_desc;
 353: DESC        *c_desc;
 354: char        *key;
 355: char        *tuple;
 356: struct tree *tkey;
 357: int     bit;
 358: int     (*tree_pred)();
 359: int     (*tree_field)();
 360: {
 361:     TID     lotid, hitid;
 362:     register int    i;
 363: 
 364: #	ifdef xZTR1
 365:     if (tTf(43, 4))
 366:         printf("del_all(bit=0%o)\n", bit);
 367: #	endif
 368: 
 369:     if (i = find(c_desc, EXACTKEY, &lotid, &hitid, key))
 370:         syserr("del_all: find %d", i);
 371:     while (!(i = get(c_desc, &lotid, &hitid, tuple, TRUE)))
 372:     {
 373:         if (!kcompare(c_desc, tuple, key))
 374:         {
 375:             /* for each constraint of for a relation */
 376:             if (i = delete(c_desc, &lotid))
 377:                 syserr("del_all: delete %d", i);
 378:             /* for crash recovery */
 379:             if (i = flush_rel(c_desc, FALSE))
 380:                 syserr("del_all: flush_rel %d", i);
 381:             /* if there is a tree tuple, destroy it */
 382:             if ((*tree_pred)(tuple))
 383:                 del_tree(tkey, (*tree_field)(tuple));
 384:         }
 385:     }
 386:     if (i != 1)
 387:         syserr("del_all: get %d", i);
 388:     /* turn off bit in relstat field */
 389:     r_relstat(r_desc, bit, 0);
 390: }
 391: /*
 392: **  DEL_INT -- delete from a constraint catalog a constraint
 393: **
 394: **	Parameters:
 395: **		c_desc -- catalog descriptor
 396: **		key -- catalog key
 397: **		tuple -- catalog tuple (needed because tuple size unknown here)
 398: **		tkey -- tree key with TREERELID and TREERELOWNER setkeyed
 399: **		constid -- integer constraint id in string form
 400: **		constattno -- attno of comstraint number in c_desc
 401: **		tree_pred -- predicate on existence of tree tuple
 402: **		tree_field -- returns treeid from constrain tuple
 403: **
 404: **	Returns:
 405: **		none
 406: **
 407: **	Side Effects:
 408: **		constraint and tree catalog activity.
 409: **		*constid set to 0 if constraint id exists.
 410: **
 411: **	Requires:
 412: **		del_tree()
 413: **
 414: **	Called By:
 415: **		dest_????
 416: **
 417: **	Trace Flags:
 418: **		43, 5
 419: **
 420: **	Syserrs:
 421: **		bad atoi (parser error), getequal, delete, flush_rel
 422: **
 423: **	History:
 424: **		1/10/79 -- (marc) written
 425: */
 426: 
 427: del_int(c_desc, key, tuple, tkey, constid, constattno, tree_pred, tree_field)
 428: DESC        *c_desc;
 429: char        *key;
 430: char        *tuple;
 431: struct tree *tkey;
 432: char        *constid;
 433: int     constattno;
 434: int     (*tree_pred)();
 435: int     (*tree_field)();
 436: {
 437:     TID     tid;
 438:     register int    i;
 439:     short       constnum;
 440: 
 441: #	ifdef xZTR1
 442:     if (tTf(43, 5))
 443:         printf("del_int(constid=%s, constattno=%d)\n",
 444:         constid, constattno);
 445: #	endif
 446: 
 447:     constnum = atoi(constid);
 448:     setkey(c_desc, key, &constnum, constattno);
 449:     if (!(i = getequal(c_desc, key, tuple, &tid)))
 450:     {
 451:         if (i = delete(c_desc, &tid))
 452:             syserr("del_int(%d) %d", constid, i);
 453:         if ((*tree_pred)(tuple))
 454:             del_tree(tkey, (*tree_field)(tuple));
 455:         *constid = '\0';
 456:         return;
 457:     }
 458:     else if (i != 1)
 459:         syserr("dest_int: getequal %d", i);
 460:     /* bad constnum */
 461: }
 462: /*
 463: **  DEST_TREE -- destroy a tree tuple with for a given treeid
 464: **
 465: **	Deletes all tuples from tree with 'treeid' and previously set
 466: **	keys.
 467: **
 468: **	Parameters:
 469: **		key -- tre key
 470: **		treeid -- integer treeid
 471: **
 472: **	Returns:
 473: **		none
 474: **
 475: **	Side Effects:
 476: **		tree activity
 477: **
 478: **	Trace Flags:
 479: **		43, 6
 480: */
 481: 
 482: del_tree(key, treeid)
 483: struct tree *key;
 484: int     treeid;
 485: {
 486:     struct tree tuple;
 487:     TID     lotid, hitid;
 488:     register int    i;
 489:     register int    flag;
 490:     short       realid;
 491:     extern DESC Treedes;
 492: 
 493: #	ifdef xZTR1
 494:     if (tTf(43, 6))
 495:         printf("del_tree(treeid=%d)\n", treeid);
 496: #	endif
 497: 
 498:     realid = treeid;
 499:     setkey(&Treedes, key, &realid, TREEID);
 500:     if (i = find(&Treedes, EXACTKEY, &lotid, &hitid, key))
 501:         syserr("del_tree: bad find %d treeid %d", i, treeid);
 502:     flag = 0;
 503:     while (!(i = get(&Treedes, &lotid, &hitid, &tuple, TRUE)))
 504:     {
 505:         if (!kcompare(&Treedes, &tuple, key))
 506:         {
 507:             if (i = delete(&Treedes, &lotid))
 508:                 syserr("del_tree: delete treeid %d %d", treeid, i);
 509:             if (!flag)
 510:                 flag++;
 511:         }
 512:     }
 513:     if (i != 1)
 514:         syserr("del_tree: bad get %d", i);
 515:     if (!flag)
 516:         syserr("del_tree: no tuples qualified treeid %d", treeid);
 517:     if (i = flush_rel(&Treedes, FALSE))
 518:         syserr("del_tree: flush_rel(&Treedes) %d", i);
 519: }
 520: /*
 521: **  CHK_CONST -- check constraint catlg for tuples for a rel, and reset relatin.relstat
 522: **
 523: **	Parameters:
 524: **		r_desc -- reon desc for de-constrained relation
 525: **		c_desc -- catalog desc
 526: **		key -- catalog key (here unknown size)
 527: **		tuple -- " tuple space " " " " "
 528: **		relid -- relation name
 529: **		id_attno -- attno of relid
 530: **		relowner -- relation owner
 531: **		own_attno -- relowner attno
 532: **		bit -- bits to reset in relstat if there are no constraints left
 533: **
 534: **	Returns:
 535: **		none
 536: **
 537: **	Side Effects:
 538: **		reads catalog, maybe changes relstat field of relation
 539: **		relations's r_desc tuple
 540: **
 541: **	Trace Flags:
 542: **		43, 7
 543: */
 544: 
 545: chk_const(r_desc, c_desc, key, tuple, relid, id_attno, relowner, own_attno, bit)
 546: DESC    *r_desc;
 547: DESC    *c_desc;
 548: char    *key;
 549: char    *tuple;
 550: char    *relid;
 551: int id_attno;
 552: char    *relowner;
 553: int own_attno;
 554: int bit;
 555: {
 556:     TID     tid;
 557:     register int    i;
 558: 
 559: 
 560: #	ifdef xZTR1
 561:     if (tTf(43, 7))
 562:         printf("chk_const: relid %s id_attno %d relowner %s own_attno %d bit 0%o)\n",
 563:         relid, id_attno, relowner, own_attno, bit);
 564: #	endif
 565: 
 566:     clearkeys(c_desc);
 567:     setkey(c_desc, key, relid, id_attno);
 568:     setkey(c_desc, key, relowner, own_attno);
 569:     if ((i = getequal(c_desc, key, tuple, &tid)) == 1)
 570:         r_relstat(r_desc, bit, 0);
 571:     else if (i < 0)
 572:         syserr("chk_const: getequal %d", i);
 573: }
 574: /*
 575: **  R_RELSTAT -- set or reset bits in the relation.relstat field
 576: **
 577: **	Does the above for relation described by desc.
 578: **
 579: **	Parameters:
 580: **		d -- relation to have relation.relstat field changed
 581: **		bit -- bits to set or reset
 582: **		action -- 0 reset, 1 set
 583: **
 584: **	Returns:
 585: **		none
 586: **
 587: **	Side Effects:
 588: **		relation is opened for READ/WRITE, relstat changed
 589: **
 590: **	Trace Flags:
 591: **		43, 8
 592: */
 593: 
 594: 
 595: r_relstat(d, bit, action)
 596: register DESC   *d;
 597: int     bit;
 598: int     action;
 599: {
 600:     struct relation tuple, key;
 601:     TID     tid;
 602:     register int    i;
 603:     extern DESC Reldes;
 604: 
 605: #	ifdef xZTR1
 606:     if (tTf(43, 8))
 607:         printf("r_relstat(bit=0%o, action %d)\n",
 608:         bit, action);
 609: #	endif
 610: 
 611:     opencatalog("relation", OR_WRITE);
 612:     clearkeys(&Reldes);
 613:     setkey(&Reldes, &key, d->reldum.relid, RELID);
 614:     setkey(&Reldes, &key, d->reldum.relowner, RELOWNER);
 615:     if (i = getequal(&Reldes, &key, &tuple, &tid))
 616:         syserr("r_relstat: getequal %s, %s, %d", d->reldum.relid,
 617:         d->reldum.relowner, i);
 618:     if (action)
 619:     {
 620:         if (tuple.relstat == (i = tuple.relstat | bit))
 621:             return;
 622:         tuple.relstat = i;
 623:     }
 624:     else
 625:     {
 626:         if (tuple.relstat == (i = tuple.relstat & ~bit))
 627:             return;
 628:         tuple.relstat = i;
 629:     }
 630:     if ((i = replace(&Reldes, &tid, &tuple, 0)) < 0 || i == 2)
 631:         syserr("r_relstat: replace %d", i);
 632:     if (i = flush_rel(&Reldes, FALSE))
 633:         syserr("r_relstat: flush_rel(&Reldes) %d", i);
 634: }
 635: /*
 636: **  TREE_CONST -- True predicate
 637: **
 638: **	Called indirectly by routines wishing to know if
 639: **	a integrity constraint has an associated tree tuple.
 640: **	As this is always the case, returns TRUE always.
 641: **
 642: **	Parameters:
 643: **		i -- integrity tuple
 644: **
 645: **	Returns:
 646: **		TRUE
 647: **
 648: **	Side Effects:
 649: **		none
 650: **
 651: **	Trace Flags:
 652: **		43, 9
 653: */
 654: 
 655: tree_const(i)
 656: struct integrity    *i;
 657: {
 658: #	ifdef xZTR1
 659:     if (tTf(43, 9))
 660:         printf("tree_const()\n");
 661: #	endif
 662: 
 663:     return (TRUE);
 664: }
 665: /*
 666: **  TREE_PROT -- Protection tuple tree predicate
 667: **
 668: **	Called indirectly by routines wishing to know if
 669: **	a protection constraint has an associated tree tuple.
 670: **
 671: **	Parameters:
 672: **		p -- protect tuple
 673: **
 674: **	Returns:
 675: **		TRUE -- if p->protree != -1
 676: **		FLASE -- otherwise
 677: **
 678: **	Side Effects:
 679: **		none
 680: **
 681: **	Trace Flags:
 682: **		43, 9
 683: */
 684: 
 685: tree_prot(p)
 686: struct protect  *p;
 687: {
 688: #	ifdef xZTR1
 689:     if (tTf(43, 9))
 690:         printf("tree_prot(p->protree=%d)\n", p->protree);
 691: #	endif
 692: 
 693:     if (p->protree == -1)
 694:         return (FALSE);
 695:     else
 696:         return (TRUE);
 697: }
 698: /*
 699: **  PROT_PROTREE -- get protree field of a protection tuple
 700: **
 701: **	Parameters:
 702: **		p -- protect tuple
 703: **
 704: **	Returns:
 705: **		p->protree
 706: **
 707: **	Side Effects:
 708: **		none
 709: **
 710: **	Trace Flags:
 711: **		43, 9
 712: */
 713: 
 714: prot_protree(p)
 715: struct protect  *p;
 716: {
 717: #	ifdef xZTR1
 718:     if (tTf(43, 9))
 719:         printf("prot_protree(protree=%d)\n", p->protree);
 720: #	endif
 721: 
 722:     return (p->protree);
 723: }
 724: /*
 725: **  INT_INTTREE -- get inttree field of a integrity tuple
 726: **
 727: **	Parameters:
 728: **		i -- integrity tuple
 729: **
 730: **	Returns:
 731: **		i->inttree
 732: **
 733: **	Side Effects:
 734: **		none
 735: **
 736: **	Trace Flags:
 737: **		43, 9
 738: */
 739: 
 740: int_inttree(i)
 741: struct integrity    *i;
 742: {
 743: #	ifdef xZTR1
 744:     if (tTf(43, 9))
 745:         printf("int_inttree(inttree=%d)\n", i->inttree);
 746: #	endif
 747: 
 748:     return (i->inttree);
 749: }

Defined functions

chk_const defined in line 545; used 2 times
del_all defined in line 351; used 2 times
del_int defined in line 427; used 2 times
del_tree defined in line 482; used 2 times
dest_const defined in line 61; used 2 times
dest_integ defined in line 115; used 1 times
  • in line 94
dest_prot defined in line 180; used 1 times
  • in line 92
i_cat defined in line 277; used 2 times
int_inttree defined in line 740; used 3 times
prot_protree defined in line 714; used 3 times
r_relstat defined in line 595; used 5 times
tree_const defined in line 655; used 3 times
tree_prot defined in line 685; used 3 times

Defined variables

RmqmFn defined in line 25; never used
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1803
Valid CSS Valid XHTML 1.0 Strict