mirror of
				https://github.com/brmlab/osmo-tetra.git
				synced 2025-10-31 15:33:59 +01:00 
			
		
		
		
	Import tunctl from uml-utilities project
This commit is contained in:
		
							parent
							
								
									4911ba91ef
								
							
						
					
					
						commit
						ceaf34016a
					
				
					 1 changed files with 156 additions and 0 deletions
				
			
		
							
								
								
									
										156
									
								
								src/tunctl.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								src/tunctl.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,156 @@ | |||
| /* Copyright 2002 Jeff Dike
 | ||||
|  * Licensed under the GPL | ||||
|  */ | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
| #include <unistd.h> | ||||
| #include <pwd.h> | ||||
| #include <grp.h> | ||||
| #include <net/if.h> | ||||
| #include <sys/ioctl.h> | ||||
| #include <linux/if_tun.h> | ||||
| 
 | ||||
| /* TUNSETGROUP appeared in 2.6.23 */ | ||||
| #ifndef TUNSETGROUP | ||||
| #define TUNSETGROUP   _IOW('T', 206, int) | ||||
| #endif | ||||
| 
 | ||||
| static void Usage(char *name) | ||||
| { | ||||
|   fprintf(stderr, "Create: %s [-b] [-u owner] [-g group] [-t device-name] " | ||||
| 	  "[-f tun-clone-device]\n", name); | ||||
|   fprintf(stderr, "Delete: %s -d device-name [-f tun-clone-device]\n\n", | ||||
| 	  name); | ||||
|   fprintf(stderr, "The default tun clone device is /dev/net/tun - some systems" | ||||
| 	  " use\n/dev/misc/net/tun instead\n\n"); | ||||
|   fprintf(stderr, "-b will result in brief output (just the device name)\n"); | ||||
|   exit(1); | ||||
| } | ||||
| 
 | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|   struct ifreq ifr; | ||||
|   struct passwd *pw; | ||||
|   struct group *gr; | ||||
|   uid_t owner = -1; | ||||
|   gid_t group = -1; | ||||
|   int tap_fd, opt, delete = 0, brief = 0; | ||||
|   char *tun = "", *file = "/dev/net/tun", *name = argv[0], *end; | ||||
| 
 | ||||
|   while((opt = getopt(argc, argv, "bd:f:t:u:g:")) > 0){ | ||||
|     switch(opt) { | ||||
|       case 'b': | ||||
|         brief = 1; | ||||
|         break; | ||||
|       case 'd': | ||||
|         delete = 1; | ||||
| 	tun = optarg; | ||||
|         break; | ||||
|       case 'f': | ||||
| 	file = optarg; | ||||
| 	break; | ||||
|       case 'u': | ||||
| 	pw = getpwnam(optarg); | ||||
| 	if(pw != NULL){ | ||||
| 	  owner = pw->pw_uid; | ||||
| 	  break; | ||||
| 	} | ||||
|         owner = strtol(optarg, &end, 0); | ||||
| 	if(*end != '\0'){ | ||||
| 	  fprintf(stderr, "'%s' is neither a username nor a numeric uid.\n", | ||||
| 		  optarg); | ||||
| 	  Usage(name); | ||||
| 	} | ||||
|         break; | ||||
|       case 'g': | ||||
| 	gr = getgrnam(optarg); | ||||
| 	if(gr != NULL){ | ||||
| 	  group = gr->gr_gid; | ||||
| 	  break; | ||||
| 	} | ||||
|         group = strtol(optarg, &end, 0); | ||||
| 	if(*end != '\0'){ | ||||
| 	  fprintf(stderr, "'%s' is neither a groupname nor a numeric group.\n", | ||||
| 		  optarg); | ||||
| 	  Usage(name); | ||||
| 	} | ||||
|         break; | ||||
| 
 | ||||
|       case 't': | ||||
|         tun = optarg; | ||||
|         break; | ||||
|       case 'h': | ||||
|       default: | ||||
|         Usage(name); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   argv += optind; | ||||
|   argc -= optind; | ||||
| 
 | ||||
|   if(argc > 0) | ||||
|     Usage(name); | ||||
| 
 | ||||
|   if((tap_fd = open(file, O_RDWR)) < 0){ | ||||
|     fprintf(stderr, "Failed to open '%s' : ", file); | ||||
|     perror(""); | ||||
|     exit(1); | ||||
|   } | ||||
| 
 | ||||
|   memset(&ifr, 0, sizeof(ifr)); | ||||
| 
 | ||||
|   ifr.ifr_flags = IFF_TAP | IFF_NO_PI; | ||||
|   strncpy(ifr.ifr_name, tun, sizeof(ifr.ifr_name) - 1); | ||||
|   if(ioctl(tap_fd, TUNSETIFF, (void *) &ifr) < 0){ | ||||
|     perror("TUNSETIFF"); | ||||
|     exit(1); | ||||
|   } | ||||
| 
 | ||||
|   if(delete){ | ||||
|     if(ioctl(tap_fd, TUNSETPERSIST, 0) < 0){ | ||||
|       perror("disabling TUNSETPERSIST"); | ||||
|       exit(1); | ||||
|     } | ||||
|     printf("Set '%s' nonpersistent\n", ifr.ifr_name); | ||||
|   } | ||||
|   else { | ||||
|     /* emulate behaviour prior to TUNSETGROUP */ | ||||
|     if(owner == -1 && group == -1) { | ||||
|       owner = geteuid(); | ||||
|     } | ||||
| 
 | ||||
|     if(owner != -1) { | ||||
|       if(ioctl(tap_fd, TUNSETOWNER, owner) < 0){ | ||||
|       	perror("TUNSETOWNER"); | ||||
|       	exit(1); | ||||
|       } | ||||
|     } | ||||
|     if(group != -1) { | ||||
|       if(ioctl(tap_fd, TUNSETGROUP, group) < 0){ | ||||
|       	perror("TUNSETGROUP"); | ||||
|       	exit(1); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if(ioctl(tap_fd, TUNSETPERSIST, 1) < 0){ | ||||
|       perror("enabling TUNSETPERSIST"); | ||||
|       exit(1); | ||||
|     } | ||||
| 
 | ||||
|     if(brief) | ||||
|       printf("%s\n", ifr.ifr_name); | ||||
|     else { | ||||
|       printf("Set '%s' persistent and owned by", ifr.ifr_name); | ||||
|       if(owner != -1) | ||||
|           printf(" uid %d", owner); | ||||
|       if(group != -1) | ||||
|           printf(" gid %d", group); | ||||
|       printf("\n"); | ||||
|     } | ||||
|   } | ||||
|   return(0); | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Harald Welte
						Harald Welte