int main(int argc, char **argv) { if (argc < 3) return -1; if (dfs_connect("127.0.0.1") == -1) // Conectarse al servidor return -1; FD src = dfs_open(argv[1]); // Abrir el archivo origen dfs_rm(argv[2]); // Borro el archivo por si existiera dfs_create(argv[2]); FD dst = dfs_open(argv[2]); // Abrir destino char c; // Copiar el contenido while (dfs_read(src, 1, &c) != EOF) { dfs_write(dst, 1, &c); } // Cerrar archivos dfs_close(dst); dfs_close(src); // Cerrar conexion dfs_disconnect(); return 0; }
int cmain() { int i; struct dfs *fs; char use_stdio = 0; char mount_self = 0; char *use_socket = (char *)0; char next_socket = 0; char had_rules_file = 0; char initialise_common = 0; char o_foreground = 0; // terminate_on_allocation_errors(); multiplex_io(); dfs_update_ids(); multiplex_sexpr(); for (i = 1; curie_argv[i]; i++) { if (curie_argv[i][0] == '-') { int j; for (j = 1; curie_argv[i][j] != (char)0; j++) { switch (curie_argv[i][j]) { case 'o': use_stdio = 1; break; case 'p': sys_mount ("proc", "/proc", "proc", 0, (char *)0); sys_mount ("sys", "/sys", "sysfs", 0, (char *)0); break; case 'i': initialise_common = 1; break; case 'm': mount_self = 1; break; case 's': next_socket = 1; break; case 'f': o_foreground = 1; break; default: print_help(); } } continue; } if (next_socket) { use_socket = curie_argv[i]; next_socket = 0; continue; } multiplex_add_sexpr(sx_open_io (io_open_read (curie_argv[i]), io_open (-1)), on_rules_read, (void *)0); while (multiplex() != mx_nothing_to_do); had_rules_file = 1; } if ((use_socket == (char *)0) && (use_stdio == 0) && (mount_self == 0)) { print_help(); } if (!had_rules_file) { multiplex_add_sexpr(sx_open_io (io_open_read (DEFAULT_RULES), io_open (-1)), on_rules_read, (void *)0); while (multiplex() != mx_nothing_to_do); } fs = dfs_create ((void *)0, (void *)0); fs->root->c.mode |= 0111; struct dfs_directory *d_dev9 = dfs_mk_directory (fs->root, "dev9"); struct dfs_file *d_dev9_ctl = dfs_mk_file (d_dev9, "control", (char *)0, (int_8 *)"(nop)\n", 6, (void *)0, (void *)0, on_control_write); queue_io = io_open_special(); d_dev9->c.mode = 0550; d_dev9->c.uid = "dev9"; d_dev9->c.gid = "dev9"; d_dev9_ctl->c.mode = 0660; d_dev9_ctl->c.uid = "dev9"; d_dev9_ctl->c.gid = "dev9"; queue = sx_open_io (queue_io, queue_io); multiplex_add_sexpr (queue, mx_sx_ctl_queue_read, (void *)0); if (initialise_common) { struct dfs_directory *d; d = dfs_mk_directory (fs->root, "pts"); d->c.mode |= 0111; d = dfs_mk_directory (fs->root, "shm"); d->c.mode |= 0111; dfs_mk_symlink (fs->root, "fd", "/proc/self/fd"); dfs_mk_symlink (fs->root, "stdin", "fd/0"); dfs_mk_symlink (fs->root, "stdout", "fd/1"); dfs_mk_symlink (fs->root, "stderr", "fd/2"); } connect_to_netlink(fs); multiplex_all_processes(); multiplex_d9s(); if (use_stdio) { multiplex_add_d9s_stdio (fs); } else if (o_foreground == 0) { struct exec_context *context = execute(EXEC_CALL_NO_IO, (char **)0, (char **)0); switch (context->pid) { case -1: cexit (11); case 0: break; default: cexit (0); } } if (use_socket != (char *)0) { multiplex_add_d9s_socket (use_socket, fs); } if (mount_self) { static char options[] = "access=any,trans=fd,rfdno=000000,wfdno=000000"; struct io *in, *out; int fdi[2], fdo[2]; if ((sys_pipe (fdi) != -1) && (sys_pipe (fdo) != -1)) { struct exec_context *context; in = io_open(fdi[0]); out = io_open(fdo[1]); multiplex_add_d9s_io(in, out, fs); if (!((fdo[0] > 999999) || (fdi[1] > 999999) || (fdo[0] < 1) || (fdi[1] < 1))) { int tj, ti, mn, s2 = 44; for (tj = 31, ti = fdo[0], mn = 6; ti > 0; tj--, ti /= 10, mn--) { options[tj] = '0' + (ti % 10); } for (tj = 26, ti = tj + mn; options[ti]; tj++, ti++) { options[tj] = options[ti]; } options[tj] = options[ti]; s2 -= mn; for (tj = s2, ti = fdi[1], mn = 6; ti > 0; tj--, ti /= 10, mn--) { options[tj] = '0' + (ti % 10); } for (tj = s2-5, ti = tj + mn; options[ti]; tj++, ti++) { options[tj] = options[ti]; } options[tj] = options[ti]; context = execute(EXEC_CALL_NO_IO, (char **)0, (char **)0); switch (context->pid) { case -1: cexit (30); case 0: sys_close (fdi[0]); sys_close (fdo[1]); sys_mount ("dev9", "/dev", "9p", 0, options); if (initialise_common) { sys_mount ("devpts", "/dev/pts", "devpts", 0, (void *)0); sys_mount ("shm", "/dev/shm", "tmpfs", 0, (void *)0); } cexit (0); default: sys_close (fdo[0]); sys_close (fdi[1]); multiplex_add_process(context, mx_on_subprocess_death, (void *)0); } } } } while (multiplex() != mx_nothing_to_do); return 0; }