Creando unidades virtuales en Mac

Últimamente se ha visto nacer varios servicios de almacenamiento de ficheros online, o como algunos medios lo califican, almacenamiento en la nube.

Uno de los rasgos comunes de algunos de estos softwares es que crean una nueva unidad en nuestro sistema operativo, esta unidad virtual, es la forma de interactuar con el propio software.

Crear este tipo de aplicaciones a priori no parece sencillo, pues para crear una unidad hay que tratar con aspectos bastante complejos del sistema operativo.

Afortunadamente para nosotros existen varias librerías para ayudarnos en este cometido.

Hablando de las diferentes librerías podemos crear una linea que dividiría las soluciones para windows donde por ejemplo tenmos el opensource Dokan o el producto comercial de Eldos. Y del otro lado de la linea, estarían aquellas librerías para sistemas basados en Unix, como Linux o el propio OSX. Para estos sistemas un solo nombre sale a escena FUSE.

FUSE, además de ser el nombre de un fantastico emulador de Spectrum, es un modulo del kernel y una librería para el desarrollo de aplicaciones que quieran crear unidades virtuales.

En OSX, la versión de FUSE se llama MacFUSE, desde luego el nombre era fácil de adivinar🙂

Desde el punto de vista de desarrollador, programar una aplicación que cree una unidad virtual usando una de estas librerías es infinitamente mas sencillo que lidiar con los apectos internos del sistema operativo.

El proceso de crear una de estas aplicaciones es muy similar en los tres sistemas operativos, las librerías utilizan un sistema de callbacks. Nuestra aplicación debe proporcionar una serie de funciones a las que la librería irá llamando según las operaciones del sistema operativo, operaciones como abrir, leer o escribir en un fichero, o abrir o crear directorios.

Concretamente usando MacFUSE, la estructura de punteros a funciones que atienden a los eventos habituales del sistema de ficheros es:

static struct fuse_operations hello_filesystem_operations = {
.getattr   = hello_getattr,
    /* To provide size, permissions, etc.             */
.open      = hello_open,
    /* To enforce read-only access.                   */
.read      = hello_read,
    /* To provide file content.                       */
.readdir   = hello_readdir,
    /* To provide directory listing.                  */
.listxattr = hello_listxattr, 
    /* To provide com.apple.{FinderInfo,ResourceFork} */
.getxattr  = hello_getxattr,
    /* To provide com.apple.(FinderInfo,ResourceFork) */
};

Aunque el ejemplo de aquí arriba es C, realmente se puede programar en muchos lenguajes, como no podia ser de otra manera MacFUSE además permite programar en Objective-C, pero ademas se puede programar aplicaciones usando otros lenguajes como Python, Ruby o Java, lo cual, hace que incorporar esta funcionalidad a nuestra aplicación sea más accesible.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: