Como parsear los distintos permisos chmod() c / c++

Iniciado por d91, 1 Junio 2018, 01:42 AM

0 Miembros y 1 Visitante están viendo este tema.

d91

Hola, tengo una tarea de quitar / poner permisos a archivos asi como lo hace chmod(), pero el usuario me dira cuales quitara / pondra, entonces estoy buscando una forma de almacenar los diversos codigos para pasarselo a chmod() segun me los diga el usuario (ya intente meter los codigos en un arreglo pero me lanza errores y como cadena no funciona), alguien me puede brindar una idea o tenga algun algoritmo
Código (cpp) [Seleccionar]

#include <stdio.h>
#include <sys/stat.h>
#include <iostream>
#include <sys/types.h>

using namespace std;

int main(int argc, char *argv[]){

int resultado;

char archivo[100];

//char permisos[100] = "S_IWOTH | S_IROTH";

cout<<"\nIngrese nombre del archivo: ";
cin>>archivo;

//resultado = chmod(archivo, permisos);

resultado = chmod(archivo, S_IWOTH | S_IROTH);

cout<<"\nResultado: "<<resultado<<"\n";

return 0;

}

SrMcLister

#1
Buenas d91.

Los permisos disponibles para chmod son:
0 (cero) = Sin permisos
1 = permiso de ejecutar únicamente
2 = permiso de escribir solamente
3 = escribir y ejecutar
4 = permiso de leer
5 = leer y ejecutar
6 = leer y escribir
7 = leer, escribir y ejecutar

Al usar CHMOD tienes 3 grupos de números, lo cual representa igualmente 3 grupos de usuarios:
1. Owner o User, el cual de manera general es el webmaster
2. Group, un grupo de usuarios configurado por el webmaster
3. World o Anyone, que es básicamente cualquier usuario que usa tu sitio web.

Como tu tarea será a nivel de usuario el 2 y el 3 no se toca, o le pones los mismos que al owner.

Por lo tanto yo haría un programilla tal que fuera un menú y un switch.

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <sstream>
#include <stdlib.h>
#include <iostream>
using namespace std;

int menuChmod(){
  int eleccion;
  cout << "+++++++MENU+++++++" << endl;
  cout << "1 - Solo ejecutar" << endl;
  cout << "2 - Solo escribir" << endl;
  cout << "3 - Escribir y ejecutar" << endl;
  cout << "4 - Solo leer" << endl;
  cout << "5 - Leer y ejecutar" << endl;
  cout << "6 - Leer y escribir" << endl;
  cout << "7 - Leer, escribir y ejecutar" << endl;
  cout << "Ingrese eleccion: ";
  cin >> eleccion;
  return eleccion;
}

int main(int argc, char *argv[]){

   char archivo[100];
   ostringstream oss;
   oss << "chmod ";
   
    cout<<"\nIngrese nombre del archivo: ";
   cin>>archivo;

   switch(menuChmod()){
       case 1: {oss << "100 "<<archivo;
                system((oss.str()).c_str());
                break;
               }
       case 2: {oss << "200 "<<archivo;
               system((oss.str()).c_str());
               break;
               }
       case 3: {oss << "300 "<<archivo;
                system((oss.str()).c_str());
                break;
               }
       case 4: {oss << "400 "<<archivo;
               system((oss.str()).c_str());
               break;
              }
       case 5: {oss << "500 "<<archivo;
                system((oss.str()).c_str());
                break;
               }
       case 6: {oss << "600 "<<archivo;
                system((oss.str()).c_str());
                break;
               }
       case 7: {oss << "700 "<<archivo;
                system((oss.str()).c_str());
                break;
               }
       default:;
   }

   ostringstream ls;
   ls << "ls -la | grep " << archivo;
   system((ls.str()).c_str());

   return 0;
}


Lo hice con system porque desconozco como funciona chmod en la libreria que usaste.
La idea está en el codigo.
SI al grupo y a todo el mundo quieres asignarle los mismos permisos, en vez de 100, sería 111, y así con todos.

Espero haberme explicado bien.
Un Saludo.
Código (cpp) [Seleccionar]

return((u.areHappy() && u.knowIt()) ? u.clapYourHands() : u.goFuckYourself());