/* ** (c) 2004 Herbert Poetzl ** ** V0.01 flag ioctls ** */ #include #include #include #include #include #include #include #include #include #include #include "vutil.h" #include "linux/inode.h" #ifdef O_LARGEFILE #define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE) #else #define OPEN_FLAGS (O_RDONLY|O_NONBLOCK) #endif #define OPTIONS "+hdDeEf:" static void usage() { fprintf(stderr, "vproc " VERSION "\n" "vproc options filepath ...\n" "\n" "options are:\n" " -h print this help message\n" " -d hide in context > 1\n" " -D hide in any context\n" " -e show everywhere\n" " -E show only in context 1\n"); } int main(int argc, char *argv[]) { extern int optind; char c; int errflg = 0; { struct utsname uts; if (uname(&uts)!=-1){ //printf ("sysname :%s:\n",uts.sysname); //printf ("release :%s:\n",uts.release); if (strcmp(uts.release,"2.6.")< 0){ fprintf (stderr,"vproc: Do nothing on old kernel\n"); exit (0); } }else{ // Can't tell the version of the OS, better do nothing fprintf (stderr,"Can't tell the version of the OS. Weird\n"); exit (-1); } } int flag = 0; bool setflag = false; while ((c = getopt(argc, argv, OPTIONS)) != (char)EOF) { switch (c) { case 'h': usage(); exit(0); break; case 'd': flag = IATTR_HIDE; setflag = true; break; case 'D': flag = IATTR_HIDE; setflag = true; break; case 'e': flag = IATTR_HIDE; setflag = false; break; case 'E': flag = IATTR_HIDE; setflag = false; break; default: errflg++; break; } } if (errflg) { usage(); exit(2); } if (optind == argc){ usage(); exit (0); } for (; optind < argc; optind++){ const char *name = argv[optind]; unsigned cur_flag; int r = call_get_iattr(name,&cur_flag); //fprintf (stderr,"get_iattr r=%d flag=%08x num_flag=%08x\n",r,cur_flag,flag); if (r){ fprintf (stderr,"Can't get the flag on file %s (%s)\n",name,strerror(errno)); errflg = 1; break; }else if (!r){ r = call_set_iattr(name, setflag,flag); // fprintf (stderr,"set_iattr r=%d\n",r); if (r){ fprintf (stderr,"Can't set the flag on file %s (%s)\n",name,strerror(errno)); errflg = 1; break; } } #if 0 if (!opt_flag) { static const char *where[] = { "visible everywhere", "visible on the host only", "visible in context 1 only", "hidden in user contexts" }; fprintf(stdout,"%s is %s.\n",name, where[flag & 0x3]); } #endif } return errflg?1:0; }