1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1985-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Eclipse Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.eclipse.org/org/documents/epl-v10.html * 11* (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* Phong Vo <kpv@research.att.com> * 20* * 21***********************************************************************/ 22#pragma prototyped 23/* 24 * Glenn Fowler 25 * AT&T Bell Laboratories 26 * 27 * 3d fs operations 28 * only active for non-shared 3d library 29 */ 30 31#define mount ______mount 32 33#include <ast.h> 34 35#undef mount 36 37#include <fs3d.h> 38 39int 40fs3d(register int op) 41{ 42 register int cur; 43 register char* v; 44 char val[sizeof(FS3D_off) + 8]; 45 46 static int fsview; 47 static char on[] = FS3D_on; 48 static char off[] = FS3D_off; 49 50 if (fsview < 0) 51 return 0; 52 53 /* 54 * get the current setting 55 */ 56 57 if (!fsview && (!getenv("LD_PRELOAD") || mount("", "", 0, NiL))) 58 goto nope; 59 if (FS3D_op(op) == FS3D_OP_INIT && mount(FS3D_init, NiL, FS3D_VIEW, NiL)) 60 goto nope; 61 if (mount(on, val, FS3D_VIEW|FS3D_GET|FS3D_SIZE(sizeof(val)), NiL)) 62 goto nope; 63 if (v = strchr(val, ' ')) 64 v++; 65 else 66 v = val; 67 if (!strcmp(v, on)) 68 cur = FS3D_ON; 69 else if (!strncmp(v, off, sizeof(off) - 1) && v[sizeof(off)] == '=') 70 cur = FS3D_LIMIT((int)strtol(v + sizeof(off) + 1, NiL, 0)); 71 else 72 cur = FS3D_OFF; 73 if (cur != op) 74 { 75 switch (FS3D_op(op)) 76 { 77 case FS3D_OP_OFF: 78 v = off; 79 break; 80 case FS3D_OP_ON: 81 v = on; 82 break; 83 case FS3D_OP_LIMIT: 84 sfsprintf(val, sizeof(val), "%s=%d", off, FS3D_arg(op)); 85 v = val; 86 break; 87 default: 88 v = 0; 89 break; 90 } 91 if (v && mount(v, NiL, FS3D_VIEW, NiL)) 92 goto nope; 93 } 94 fsview = 1; 95 return cur; 96 nope: 97 fsview = -1; 98 return 0; 99} 100 101/* 102 * user code that includes <fs3d.h> will have mount() mapped to fs3d_mount() 103 * this restricts the various "standard" mount prototype conflicts to this spot 104 * this means that code that includes <fs3d.h> cannot access the real mount 105 * (at least without some additional macro hackery 106 */ 107 108#undef mount 109 110extern int mount(const char*, char*, int, void*); 111 112int 113fs3d_mount(const char* source, char* target, int flags, void* data) 114{ 115 return mount(source, target, flags, data); 116} 117