ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] RC redirect - 2.0
@ 2001-07-17 13:47 Stanislav Ievlev
  0 siblings, 0 replies; only message in thread
From: Stanislav Ievlev @ 2001-07-17 13:47 UTC (permalink / raw)
  To: devel

[-- Attachment #1: Type: text/plain, Size: 498 bytes --]

Для любителей копаться в ядре второе поколение патча для перенаправления 
по RC-ролям
на этот раз это перенаправление по каталогам

Как заводится:
1. Создается каталог /tmp/redirect
2. Создаются подкаталоги /tmp/redirect/1, /tmp/redirect/2,...
3. Устанавливается rc_initial_role для /tmp/redirect в 99.
4. Теперь при заходе в каталог /tmp/redirect пользователь будет реально 
попадать в /tmp/redirect/<role-num>

Патч прилагается (патчатся d_path() и path_walk() )
------------
Станислав Иевлев.



[-- Attachment #2: rsbac-rc-redirect-2.patch --]
[-- Type: text/plain, Size: 6121 bytes --]

diff -Naur linux.orig/fs/dcache.c linux/fs/dcache.c
--- linux.orig/fs/dcache.c	Tue Jul 17 17:19:14 2001
+++ linux/fs/dcache.c	Tue Jul 17 17:20:55 2001
@@ -26,6 +26,14 @@
 
 #include <asm/uaccess.h>
 
+//REDIRECTION
+/* RSBAC */
+#ifdef CONFIG_RSBAC
+#include <rsbac/adf.h>
+#include <rsbac/fs.h>
+#endif
+//REDIRECTION
+
 #define DCACHE_PARANOIA 1
 /* #define DCACHE_DEBUG 1 */
 
@@ -948,6 +956,10 @@
 	char * end = buffer+buflen;
 	char * retval;
 	int namelen;
+//REDIRECTION
+        union rsbac_target_id_t       redir_rsbac_target_id;
+        union rsbac_attribute_value_t redir_rsbac_attribute_value;
+//REDIRECTION
 
 	*--end = '\0';
 	buflen--;
@@ -963,7 +975,7 @@
 
 	for (;;) {
 		struct dentry * parent;
-
+		
 		if (dentry == root && vfsmnt == rootmnt)
 			break;
 		if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
@@ -974,6 +986,29 @@
 			vfsmnt = vfsmnt->mnt_parent;
 			continue;
 		}
+//REDIRECTION
+	    	redir_rsbac_target_id.dir.device = dentry->d_parent->d_inode->i_dev;
+            	redir_rsbac_target_id.dir.inode  = dentry->d_parent->d_inode->i_ino;
+            	redir_rsbac_target_id.dir.dentry_p = dentry->d_parent;
+            	redir_rsbac_attribute_value.dummy = 0;
+		    
+		if (rsbac_get_attr(T_DIR,
+		                  redir_rsbac_target_id,
+		                  A_rc_initial_role,
+		                  &redir_rsbac_attribute_value,
+		                  FALSE))
+		{
+		    printk(KERN_WARNING "d_path(): rsbac_get_attr() returned error!\n");
+		}
+			    
+		if (redir_rsbac_attribute_value.rc_initial_role==99){
+			//printk("d_path: super dir!\n");
+			dentry = dentry->d_parent;
+			continue;
+		}
+		//printk(KERN_EMERG "d_path: %lu\n",dentry->d_inode->i_ino);
+//REDIRECTION
+
 		parent = dentry->d_parent;
 		namelen = dentry->d_name.len;
 		buflen -= namelen + 1;
diff -Naur linux.orig/fs/namei.c linux/fs/namei.c
--- linux.orig/fs/namei.c	Tue Jul 17 17:19:37 2001
+++ linux/fs/namei.c	Tue Jul 17 16:56:52 2001
@@ -453,6 +453,11 @@
         union rsbac_target_id_t       rsbac_target_id;
         union rsbac_attribute_value_t rsbac_attribute_value;
         #endif
+//REDIRECTION
+        union rsbac_target_id_t       redir_rsbac_target_id;
+        union rsbac_attribute_value_t redir_rsbac_attribute_value;
+//REDIRECTION
+	
 
 	while (*name=='/')
 		name++;
@@ -513,6 +518,7 @@
 		while (*++name == '/');
 		if (!*name)
 			goto last_with_slashes;
+		
 
 		/*
 		 * "." and ".." are special - ".." especially so because it has
@@ -531,6 +537,7 @@
 			case 1:
 				continue;
 		}
+		
 		/*
 		 * See if the low-level filesystem might want
 		 * to use its own hash..
@@ -579,6 +586,59 @@
 		err = -ENOTDIR; 
 		if (!inode->i_op->lookup)
 			break;
+		
+//REDIRECTION
+		if (inode){
+            	    redir_rsbac_target_id.dir.device = inode->i_dev;
+            	    redir_rsbac_target_id.dir.inode  = inode->i_ino;
+            	    redir_rsbac_target_id.dir.dentry_p = nd->dentry;
+            	    redir_rsbac_attribute_value.dummy = 0;
+		    
+		    if (rsbac_get_attr(T_DIR,
+		                      redir_rsbac_target_id,
+		                      A_rc_initial_role,
+		                      &redir_rsbac_attribute_value,
+		                      FALSE))
+		    {
+			printk(KERN_WARNING "path_walk(): rsbac_get_attr() returned error!\n");
+		    }
+			    
+		    if (redir_rsbac_attribute_value.rc_initial_role==99)
+		    {
+			char	*new_name=kmalloc(10,GFP_KERNEL);
+			int	new_error;
+			unsigned int old_lookup_flags = nd->flags;
+			
+			redir_rsbac_target_id.process = current->pid;
+			if (rsbac_get_attr(T_PROCESS,
+					    redir_rsbac_target_id,
+					    A_rc_role,
+					    &redir_rsbac_attribute_value,
+					    FALSE))
+			{
+			    printk(KERN_WARNING "path_walk(): rsbac_get_attr() returned error!\n");
+			}
+			
+			sprintf(new_name,"%u",redir_rsbac_attribute_value.rc_role);
+			nd->flags=LOOKUP_FOLLOW|LOOKUP_POSITIVE;
+			//strcpy (new_name,"2");
+			
+			new_error=path_walk(new_name,nd);
+			nd->flags=old_lookup_flags;
+			
+			if (new_error>=0)
+			{
+			    //printk (KERN_EMERG "1>> REDIRECT %s %lu\n",new_name,nd->dentry->d_inode->i_ino);
+			    dentry=nd->dentry;
+			    inode=dentry->d_inode;
+			};
+			
+			kfree(new_name);
+		    }
+		    //printk(KERN_EMERG "1>>`%s` %lu\n",this.name,inode->i_ino);
+		}
+//REDIRECTION
+
 		continue;
 		/* here ends the main loop */
 
@@ -633,6 +693,58 @@
 			if (!inode->i_op || !inode->i_op->lookup)
 				break;
 		}
+//REDIRECTION
+		if (inode){
+            	    redir_rsbac_target_id.dir.device = inode->i_dev;
+            	    redir_rsbac_target_id.dir.inode  = inode->i_ino;
+            	    redir_rsbac_target_id.dir.dentry_p = nd->dentry;
+            	    redir_rsbac_attribute_value.dummy = 0;
+		    
+		    if (rsbac_get_attr(T_DIR,
+		                      redir_rsbac_target_id,
+		                      A_rc_initial_role,
+		                      &redir_rsbac_attribute_value,
+		                      FALSE))
+		    {
+			printk(KERN_WARNING "path_walk()-2: rsbac_get_attr() returned error!\n");
+		    }
+			    
+		    if (redir_rsbac_attribute_value.rc_initial_role==99)
+		    {
+			char	*new_name=kmalloc(10,GFP_KERNEL);
+			int	new_error;
+			unsigned int old_lookup_flags = nd->flags;
+
+			redir_rsbac_target_id.process = current->pid;
+			if (rsbac_get_attr(T_PROCESS,
+					    redir_rsbac_target_id,
+					    A_rc_role,
+					    &redir_rsbac_attribute_value,
+					    FALSE))
+			{
+			    printk(KERN_WARNING "path_walk()-2: rsbac_get_attr() returned error!\n");
+			}
+			
+			sprintf(new_name,"%u",redir_rsbac_attribute_value.rc_role);
+			
+			nd->flags=LOOKUP_FOLLOW|LOOKUP_POSITIVE;
+			//strcpy (new_name,"2");
+			
+			new_error=path_walk(new_name,nd);
+			nd->flags=old_lookup_flags;
+			
+			if (new_error>=0)
+			{
+			    //printk (KERN_EMERG "2>> REDIRECT %s %lu\n",new_name,nd->dentry->d_inode->i_ino);
+			    dentry=nd->dentry;
+			    inode=dentry->d_inode;
+			};
+			
+			kfree(new_name);
+		    }
+		    //printk(KERN_EMERG "2>>`%s` %lu\n",this.name,inode->i_ino);
+		}
+//REDIRECTION
 		goto return_base;
 no_inode:
 		err = -ENOENT;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2001-07-17 13:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-07-17 13:47 [devel] RC redirect - 2.0 Stanislav Ievlev

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git