예제 #1
0
파일: psshfs.c 프로젝트: ryo/netbsd-src
void
psshfs_notify(struct puffs_usermount *pu, int fd, int what)
{
	struct psshfs_ctx *pctx = puffs_getspecific(pu);
	int nretry, which, newfd, dummy;

	if (fd == pctx->sshfd) {
		which = PSSHFD_META;
	} else {
		assert(fd == pctx->sshfd_data);
		which = PSSHFD_DATA;
	}

	if (puffs_getstate(pu) != PUFFS_STATE_RUNNING)
		return;

	if (what != (PUFFS_FBIO_READ | PUFFS_FBIO_WRITE)) {
		puffs_framev_removefd(pu, fd, ECONNRESET);
		return;
	}
	close(fd);

	/* deal with zmobies, beware of half-eaten brain */
	while (waitpid(-1, &dummy, WNOHANG) > 0)
		continue;

	for (nretry = 0;;nretry++) {
		if ((newfd = pssh_connect(pu, which)) == -1)
			goto retry2;

		if (puffs_framev_addfd(pu, newfd,
		    PUFFS_FBIO_READ | PUFFS_FBIO_WRITE) == -1)
			goto retry1;

		break;
 retry1:
		fprintf(stderr, "reconnect failed... ");
		close(newfd);
 retry2:
		if (nretry < RETRY_MAX) {
			fprintf(stderr, "retry (%d left)\n", RETRY_MAX-nretry);
			sleep(nretry);
		} else {
			fprintf(stderr, "retry count exceeded, going south\n");
			exit(1); /* XXXXXXX */
		}
	}
}
예제 #2
0
파일: psshfs.c 프로젝트: glk/puffs
int
main(int argc, char *argv[])
{
	struct psshfs_ctx pctx;
	struct puffs_usermount *pu;
	struct puffs_ops *pops;
	struct psshfs_node *root = &pctx.psn_root;
	struct puffs_node *pn_root;
	puffs_framev_fdnotify_fn notfn;
	struct vattr *rva;
	char **sshargs;
	char *userhost;
	char *hostpath;
	int mntflags, pflags, ch;
	int detach;
	int exportfs, refreshival, numconnections;
	int nargs;

	setprogname(argv[0]);

	if (argc < 3)
		usage();

	mntflags = pflags = exportfs = nargs = 0;
	numconnections = 1;
	detach = 1;
	refreshival = DEFAULTREFRESH;
	notfn = puffs_framev_unmountonclose;
	sshargs = NULL;
	add_ssharg(&sshargs, &nargs, SSH_PATH);
	add_ssharg(&sshargs, &nargs, "-axs");
	add_ssharg(&sshargs, &nargs, "-oClearAllForwardings=yes");

	while ((ch = getopt(argc, argv, "c:eF:o:O:pr:st:")) != -1) {
		switch (ch) {
		case 'c':
			numconnections = atoi(optarg);
			if (numconnections < 1 || numconnections > 2) {
				fprintf(stderr, "%s: only 1 or 2 connections "
				    "permitted currently\n", getprogname());
				usage();
				/*NOTREACHED*/
			}
			break;
		case 'e':
			exportfs = 1;
			break;
		case 'F':
			add_ssharg(&sshargs, &nargs, "-F");
			add_ssharg(&sshargs, &nargs, optarg);
			break;
		case 'O':
			add_ssharg(&sshargs, &nargs, "-o");
			add_ssharg(&sshargs, &nargs, optarg);
			break;
		case 'o':
			getmntopts(optarg, puffsmopts, &mntflags, &pflags);
			break;
		case 'p':
			notfn = psshfs_notify;
			break;
		case 'r':
			max_reads = atoi(optarg);
			break;
		case 's':
			detach = 0;
			break;
		case 't':
			refreshival = atoi(optarg);
			if (refreshival < 0 && refreshival != -1)
				errx(1, "invalid timeout %d", refreshival);
			break;
		default:
			usage();
			/*NOTREACHED*/
		}
	}
	argc -= optind;
	argv += optind;

	if (pflags & PUFFS_FLAG_OPDUMP)
		detach = 0;
	pflags |= PUFFS_FLAG_BUILDPATH;
	pflags |= PUFFS_KFLAG_WTCACHE | PUFFS_KFLAG_IAONDEMAND;

	if (argc != 2)
		usage();

	PUFFSOP_INIT(pops);

	PUFFSOP_SET(pops, psshfs, fs, unmount);
	PUFFSOP_SETFSNOP(pops, sync); /* XXX */
	PUFFSOP_SET(pops, psshfs, fs, statvfs);
	PUFFSOP_SET(pops, psshfs, fs, nodetofh);
	PUFFSOP_SET(pops, psshfs, fs, fhtonode);

	PUFFSOP_SET(pops, psshfs, node, lookup);
	PUFFSOP_SET(pops, psshfs, node, create);
	PUFFSOP_SET(pops, psshfs, node, open);
	PUFFSOP_SET(pops, psshfs, node, inactive);
	PUFFSOP_SET(pops, psshfs, node, readdir);
	PUFFSOP_SET(pops, psshfs, node, getattr);
	PUFFSOP_SET(pops, psshfs, node, setattr);
	PUFFSOP_SET(pops, psshfs, node, mkdir);
	PUFFSOP_SET(pops, psshfs, node, remove);
	PUFFSOP_SET(pops, psshfs, node, readlink);
	PUFFSOP_SET(pops, psshfs, node, rmdir);
	PUFFSOP_SET(pops, psshfs, node, symlink);
	PUFFSOP_SET(pops, psshfs, node, rename);
	PUFFSOP_SET(pops, psshfs, node, read);
	PUFFSOP_SET(pops, psshfs, node, write);
	PUFFSOP_SET(pops, psshfs, node, reclaim);

	pu = puffs_init(pops, argv[0], "psshfs", &pctx, pflags);
	if (pu == NULL)
		err(1, "puffs_init");

	memset(&pctx, 0, sizeof(pctx));
	pctx.mounttime = time(NULL);
	pctx.refreshival = refreshival;
	pctx.numconnections = numconnections;

	userhost = argv[0];
	hostpath = strchr(userhost, ':');
	if (hostpath) {
		*hostpath++ = '\0';
		pctx.mountpath = hostpath;
	} else
		pctx.mountpath = ".";

	add_ssharg(&sshargs, &nargs, argv[0]);
	add_ssharg(&sshargs, &nargs, "sftp");
	pctx.sshargs = sshargs;

	pctx.nextino = 2;
	memset(root, 0, sizeof(struct psshfs_node));
	pn_root = puffs_pn_new(pu, root);
	if (pn_root == NULL)
		return errno;
	puffs_setroot(pu, pn_root);

	puffs_framev_init(pu, psbuf_read, psbuf_write, psbuf_cmp, NULL, notfn);

	signal(SIGHUP, takehup);
	puffs_ml_setloopfn(pu, psshfs_loopfn);
	if (pssh_connect(pu, PSSHFD_META) == -1)
		err(1, "can't connect meta");
	if (puffs_framev_addfd(pu, pctx.sshfd,
	    PUFFS_FBIO_READ | PUFFS_FBIO_WRITE) == -1)
		err(1, "framebuf addfd meta");
	if (numconnections == 2) {
		if (pssh_connect(pu, PSSHFD_DATA) == -1)
			err(1, "can't connect data");
		if (puffs_framev_addfd(pu, pctx.sshfd_data,
		    PUFFS_FBIO_READ | PUFFS_FBIO_WRITE) == -1)
			err(1, "framebuf addfd data");
	} else {
		pctx.sshfd_data = pctx.sshfd;
	}

	if (exportfs)
		puffs_setfhsize(pu, sizeof(struct psshfs_fid),
		    PUFFS_FHFLAG_NFSV2 | PUFFS_FHFLAG_NFSV3);

	rva = &pn_root->pn_va;
	rva->va_fileid = pctx.nextino++;
	rva->va_nlink = 101; /* XXX */

	if (detach)
		if (puffs_daemon(pu, 1, 1) == -1)
			err(1, "puffs_daemon");

	if (puffs_mount(pu, argv[1], mntflags, puffs_getroot(pu)) == -1)
		err(1, "puffs_mount");
	if (puffs_setblockingmode(pu, PUFFSDEV_NONBLOCK) == -1)
		err(1, "setblockingmode");

	if (puffs_mainloop(pu) == -1)
		err(1, "mainloop");
	puffs_exit(pu, 1);

	return 0;
}
예제 #3
0
파일: psshfs.c 프로젝트: ryo/netbsd-src
int
main(int argc, char *argv[])
{
	struct psshfs_ctx pctx;
	struct puffs_usermount *pu;
	struct puffs_ops *pops;
	struct psshfs_node *root = &pctx.psn_root;
	struct puffs_node *pn_root;
	puffs_framev_fdnotify_fn notfn;
	struct vattr *rva;
	mntoptparse_t mp;
	char **sshargs;
	char *user;
	char *host;
	char *path;
	int mntflags, pflags, ch;
	int detach;
	int exportfs, refreshival, numconnections;
	int nargs;

	setprogname(argv[0]);
	puffs_unmountonsignal(SIGINT, true);
	puffs_unmountonsignal(SIGTERM, true);

	if (argc < 3)
		usage();

	memset(&pctx, 0, sizeof(pctx));
	mntflags = pflags = exportfs = nargs = 0;
	numconnections = 1;
	detach = 1;
	refreshival = DEFAULTREFRESH;
	notfn = puffs_framev_unmountonclose;
	sshargs = NULL;
	add_ssharg(&sshargs, &nargs, SSH_PATH);
	add_ssharg(&sshargs, &nargs, "-axs");
	add_ssharg(&sshargs, &nargs, "-oClearAllForwardings=yes");

	while ((ch = getopt(argc, argv, "c:eF:g:o:O:pr:st:u:")) != -1) {
		switch (ch) {
		case 'c':
			numconnections = atoi(optarg);
			if (numconnections < 1 || numconnections > 2) {
				fprintf(stderr, "%s: only 1 or 2 connections "
				    "permitted currently\n", getprogname());
				usage();
				/*NOTREACHED*/
			}
			break;
		case 'e':
			exportfs = 1;
			break;
		case 'F':
			add_ssharg(&sshargs, &nargs, "-F");
			add_ssharg(&sshargs, &nargs, optarg);
			break;
		case 'g':
			pctx.domanglegid = 1;
			pctx.manglegid = atoi(optarg);
			if (pctx.manglegid == (gid_t)-1)
				errx(1, "-1 not allowed for -g");
			pctx.mygid = getegid();
			break;
		case 'O':
			add_ssharg(&sshargs, &nargs, "-o");
			add_ssharg(&sshargs, &nargs, optarg);
			break;
		case 'o':
			mp = getmntopts(optarg, puffsmopts, &mntflags, &pflags);
			if (mp == NULL)
				err(1, "getmntopts");
			freemntopts(mp);
			break;
		case 'p':
			notfn = psshfs_notify;
			break;
		case 'r':
			max_reads = atoi(optarg);
			break;
		case 's':
			detach = 0;
			break;
		case 't':
			refreshival = atoi(optarg);
			if (refreshival < 0 && refreshival != -1)
				errx(1, "invalid timeout %d", refreshival);
			break;
		case 'u':
			pctx.domangleuid = 1;
			pctx.mangleuid = atoi(optarg);
			if (pctx.mangleuid == (uid_t)-1)
				errx(1, "-1 not allowed for -u");
			pctx.myuid = geteuid();
			break;
		default:
			usage();
			/*NOTREACHED*/
		}
	}
	argc -= optind;
	argv += optind;

	if (pflags & PUFFS_FLAG_OPDUMP)
		detach = 0;
	pflags |= PUFFS_FLAG_BUILDPATH;
	pflags |= PUFFS_KFLAG_WTCACHE | PUFFS_KFLAG_IAONDEMAND;

	if (argc != 2)
		usage();

	PUFFSOP_INIT(pops);

	PUFFSOP_SET(pops, psshfs, fs, unmount);
	PUFFSOP_SETFSNOP(pops, sync); /* XXX */
	PUFFSOP_SET(pops, psshfs, fs, statvfs);
	PUFFSOP_SET(pops, psshfs, fs, nodetofh);
	PUFFSOP_SET(pops, psshfs, fs, fhtonode);

	PUFFSOP_SET(pops, psshfs, node, lookup);
	PUFFSOP_SET(pops, psshfs, node, create);
	PUFFSOP_SET(pops, psshfs, node, open);
	PUFFSOP_SET(pops, psshfs, node, inactive);
	PUFFSOP_SET(pops, psshfs, node, readdir);
	PUFFSOP_SET(pops, psshfs, node, getattr);
	PUFFSOP_SET(pops, psshfs, node, setattr);
	PUFFSOP_SET(pops, psshfs, node, mkdir);
	PUFFSOP_SET(pops, psshfs, node, remove);
	PUFFSOP_SET(pops, psshfs, node, readlink);
	PUFFSOP_SET(pops, psshfs, node, rmdir);
	PUFFSOP_SET(pops, psshfs, node, symlink);
	PUFFSOP_SET(pops, psshfs, node, rename);
	PUFFSOP_SET(pops, psshfs, node, read);
	PUFFSOP_SET(pops, psshfs, node, write);
	PUFFSOP_SET(pops, psshfs, node, reclaim);

	pu = puffs_init(pops, argv[0], "psshfs", &pctx, pflags);
	if (pu == NULL)
		err(1, "puffs_init");

	pctx.mounttime = time(NULL);
	pctx.refreshival = refreshival;
	pctx.numconnections = numconnections;

	user = strdup(argv[0]);
	if ((host = strrchr(user, '@')) == NULL) {
		host = user;
	} else {
		*host++ = '\0';		/* break at the '@' */
		if (user[0] == '\0') {
			fprintf(stderr, "Missing username\n");
			usage();
		}
		add_ssharg(&sshargs, &nargs, "-l");
		add_ssharg(&sshargs, &nargs, user);
	}

	if ((path = colon(host)) != NULL) {
		*path++ = '\0';		/* break at the ':' */
		pctx.mountpath = path;
	} else {
		pctx.mountpath = ".";
	}

	host = cleanhostname(host);
	if (host[0] == '\0') {
		fprintf(stderr, "Missing hostname\n");
		usage();
	}

	add_ssharg(&sshargs, &nargs, host);
	add_ssharg(&sshargs, &nargs, "sftp");
	pctx.sshargs = sshargs;

	pctx.nextino = 2;
	memset(root, 0, sizeof(struct psshfs_node));
	TAILQ_INIT(&root->pw);
	pn_root = puffs_pn_new(pu, root);
	if (pn_root == NULL)
		return errno;
	puffs_setroot(pu, pn_root);

	puffs_framev_init(pu, psbuf_read, psbuf_write, psbuf_cmp, NULL, notfn);

	signal(SIGHUP, takehup);
	puffs_ml_setloopfn(pu, psshfs_loopfn);
	if (pssh_connect(pu, PSSHFD_META) == -1)
		err(1, "can't connect meta");
	if (puffs_framev_addfd(pu, pctx.sshfd,
	    PUFFS_FBIO_READ | PUFFS_FBIO_WRITE) == -1)
		err(1, "framebuf addfd meta");
	if (numconnections == 2) {
		if (pssh_connect(pu, PSSHFD_DATA) == -1)
			err(1, "can't connect data");
		if (puffs_framev_addfd(pu, pctx.sshfd_data,
		    PUFFS_FBIO_READ | PUFFS_FBIO_WRITE) == -1)
			err(1, "framebuf addfd data");
	} else {
		pctx.sshfd_data = pctx.sshfd;
	}

	if (exportfs)
		puffs_setfhsize(pu, sizeof(struct psshfs_fid),
		    PUFFS_FHFLAG_NFSV2 | PUFFS_FHFLAG_NFSV3);

	rva = &pn_root->pn_va;
	rva->va_fileid = pctx.nextino++;

	/*
	 * For root link count, just guess something ridiculously high.
	 * Guessing too high has no known adverse effects, but fts(3)
	 * doesn't like too low values.  This guess will be replaced
	 * with the real value when readdir is first called for
	 * the root directory.
	 */
	rva->va_nlink = 8811;

	if (detach)
		if (puffs_daemon(pu, 1, 1) == -1)
			err(1, "puffs_daemon");

	if (puffs_mount(pu, argv[1], mntflags, puffs_getroot(pu)) == -1)
		err(1, "puffs_mount");
	if (puffs_setblockingmode(pu, PUFFSDEV_NONBLOCK) == -1)
		err(1, "setblockingmode");

	if (puffs_mainloop(pu) == -1)
		err(1, "mainloop");
	puffs_exit(pu, 1);

	return 0;
}
예제 #4
0
파일: ex.c 프로젝트: rushba/libpssh
int main(int argc, char *argv[])
{
    int ret;
    int i, j;
    char name[20];
    char l_fn[50];
    struct pssh_sess_entry *ent;
    struct pssh_task_t *task;
    struct rusage ru;
    unsigned long utime, stime;

    /* add */
#if 1
    for (j = 2; j < SRV_GROUP_CNT; j++) {
        printf("start group # %d\n", j);
        pssh = pssh_init("rushba", "/home/rushba/tmp/id_dsa.pub", NULL, "", PSSH_OPT_NO_SEARCH);
        if (old_pssh)
            pssh_free(old_pssh);
        old_pssh = pssh;
        assert(pssh != NULL);

        for (i = 1; i < SRV_IN_GROUP; i++) {
            /* if (i == 6 || i == 77) */
            /*     continue; */
            sprintf(name, "www%d.mlan", j*SRV_IN_GROUP + i);
            ret = pssh_server_add(pssh, name, 22);
        }
        /* pssh_server_add(pssh, "blah", 22); */
        /* pssh_server_add(pssh, "test", 22); */
        /* pssh_server_add(pssh, "main1.mlan", 22); */

        /* pssh_server_add(pssh, "www1", 22); */
        /* pssh_server_add(pssh, "www3", 22); */
        /* pssh_server_add(pssh, "www5", 22); */
        /* pssh_server_add(pssh, "joppa", 22); */
        /* pssh_server_add(pssh, "joppa2", 22); */
        /* pssh_server_add(pssh, "www6", 22); */

        i = 0;

        /* wrong call, need be still! */
        pssh_server_next(pssh);

        /* connect */
        do {
            ret = pssh_connect(pssh, &ent, TIMEOUT);
            printf("ret = %s for %s\n", conn_ret_str[ret], pssh_serv_name(ent));
            i++;
        } while (ret == PSSH_CONNECTED);
        printf("ret = %s\n", conn_ret_str[ret]);
        printf("i = %d\n", i);

        /* stat */
        ent = pssh_server_first(pssh);
        while (ent != NULL) {
            printf("%s: %s\n", pssh_serv_name(ent), pssh_stat_str(ent));
            ent = pssh_server_next(pssh);
        }

/*     if (ret == PSSH_TIMEOUT) */
/*         exit(0); */

        /* add cp & exec */
        task_list = pssh_task_list_init(pssh);
        assert(task_list != NULL);

        /* Err */
        ret = pssh_cp_to_server(task_list, "", "a", "b");
        assert(ret == -1);
        ret = pssh_cp_to_server(task_list, "s", "", "b");
        assert(ret == -1);
        ret = pssh_cp_to_server(task_list, "s", "a", "");
        assert(ret == -1);
        ret = pssh_add_cmd(task_list, "", "c");
        assert(ret == -1);
        ret = pssh_add_cmd(task_list, "s", "");
        assert(ret == -1);
        

        for (i = 1; i < SRV_IN_GROUP; i++) {
            sprintf(name, "www%d.mlan", j*SRV_IN_GROUP + i);
#if 0
            sprintf(l_fn, "/tmp/passwd.%s", name);
            pssh_cp_from_server(task_list, name, l_fn, "/etc/passwd");
            sprintf(l_fn, "/tmp/group.%s", name);
            pssh_cp_from_server(task_list, name, l_fn, "/etc/group");
            sprintf(l_fn, "/tmp/profile.%s", name);
            pssh_cp_from_server(task_list, name, l_fn, "/etc/profile");
#else
            
            if ((i == 2) || (i == 4)) {
                pssh_cp_to_server(task_list, name, "/etc", "/tmp/profile");
            } else {
                pssh_cp_to_server(task_list, name, "/etc", "/tmp/profile");
                pssh_cp_to_server(task_list, name, "/etc/profile", "/tmp/profile");
                pssh_cp_to_server(task_list, name, "/etc/passwd", "/tmp/passwd");
                pssh_cp_to_server(task_list, name, "/etc/hosts", "/tmp/hosts");
            }
/*         pssh_add_cmd(task_list, name, "cat /tmp/profile"); */
#endif
        }
        /* pssh_cp_from_server(task_list, "www1", "/tmp/group.www1", "/etc/group"); */
        /* pssh_cp_from_server(task_list, "www1", "/tmp/profile.www1", "/etc/profile"); */
        /* pssh_cp_from_server(task_list, "www1", "/tmp/passwd.www1", "/etc/passwd"); */

        /* pssh_cp_from_server(task_list, "www3", "/tmp/profile.www3", "/etc/profile"); */
        /* pssh_cp_from_server(task_list, "www3", "/tmp/group.www3", "/etc/group"); */
        /* pssh_cp_from_server(task_list, "www3", "/tmp/passwd.www3", "/etc/passwd"); */

        /* pssh_cp_from_server(task_list, "www5", "/tmp/profile.www5", "/etc/profile"); */
        /* pssh_cp_from_server(task_list, "www5", "/tmp/group.www5", "/etc/group"); */
        /* pssh_cp_from_server(task_list, "www5", "/tmp/passwd.www5", "/etc/passwd"); */

        /* pssh_cp_from_server(task_list, "joppa", "/tmp/passwd.j", "/etc/profile"); */
        /* pssh_cp_from_server(task_list, "joppa2", "/tmp/passwd.j2", "/etc/profile"); */
        /* pssh_cp_from_server(task_list, "www6", "/tmp/passwd.www6", "/etc/profile"); */

        /* run */
        i = 0;
        do {
            i++;
            ret = pssh_exec(task_list, &task, TIMEOUT);
            printf("time: %ld, ret = %s for %s\n", time(0), conn_ret_str[ret], pssh_task_server_name(task));
        } while (ret == PSSH_RUNNING);

        printf("ret = %s\n", conn_ret_str[ret]);
        printf("i = %d\n", i);

        task = pssh_task_first(task_list);
        while (task != NULL) {
            printf("%s: get_cmd: <%s>\n", pssh_task_server_name(task), pssh_task_get_cmd(task));
            if (pssh_task_type(task) == PSSH_TASK_TYPE_EXEC) {
                if (pssh_task_stat(task) == PSSH_TASK_DONE) {
/*                 printf("host: %s exit_status: %d\n", */
/*                        pssh_task_server_name(task), pssh_task_exit_status(task)); */
/*                 printf("stdout <%.*s>\n", pssh_task_stdout_len(task), pssh_task_stdout(task)); */
/*                 printf("stderr <%.*s>\n", pssh_task_stderr_len(task), pssh_task_stderr(task)); */
                }
            } else if (pssh_task_type(task) == PSSH_TASK_TYPE_COPY) {
            } else {
                printf("shit happened. unknown task type %d\n", pssh_task_type(task));
                abort();
            }
            task = pssh_task_next(task_list);
        }

    }
#else

    pssh = pssh_init("rushba", "/home/rushba/tmp/id_dsa.pub", NULL, "");
    assert(pssh != NULL);
    pssh_server_add(pssh, "www110", 22);
    /* connect */
    do {
        ret = pssh_connect(pssh, &ent, TIMEOUT);
        printf("ret = %s for %s\n", conn_ret_str[ret], pssh_serv_name(ent));
        i++;
    } while (ret == PSSH_CONNECTED);

    /* add cp & exec */
    task_list = pssh_task_list_init(pssh);
    assert(task_list != NULL);

pssh_cp_to_server(task_list, "www110", "/etc/raw", "/tmp/raw");
pssh_cp_to_server(task_list, "www110", "/etc/rpc", "/tmp/rpc");
pssh_cp_to_server(task_list, "www110", "/etc/nsswitch.conf", "/tmp/nsswitch.conf");
pssh_cp_to_server(task_list, "www110", "/etc/motd", "/tmp/motd");
pssh_cp_to_server(task_list, "www110", "/etc/mtab", "/tmp/mtab");
pssh_cp_to_server(task_list, "www110", "/etc/defaultdomain", "/tmp/defaultdomain");
pssh_cp_to_server(task_list, "www110", "/etc/wvdial.conf", "/tmp/wvdial.conf");
pssh_cp_to_server(task_list, "www110", "/etc/ltrace.conf", "/tmp/ltrace.conf");
pssh_cp_to_server(task_list, "www110", "/etc/smpppd.conf", "/tmp/smpppd.conf");
pssh_cp_to_server(task_list, "www110", "/etc/issue.net", "/tmp/issue.net");
pssh_cp_to_server(task_list, "www110", "/etc/ftpusers", "/tmp/ftpusers");
pssh_cp_to_server(task_list, "www110", "/etc/securetty", "/tmp/securetty");
pssh_cp_to_server(task_list, "www110", "/etc/shadow.YaST2save", "/tmp/shadow.YaST2save");
pssh_cp_to_server(task_list, "www110", "/etc/crontab", "/tmp/crontab");
pssh_cp_to_server(task_list, "www110", "/etc/csh.cshrc", "/tmp/csh.cshrc");
pssh_cp_to_server(task_list, "www110", "/etc/auto.master", "/tmp/auto.master");
pssh_cp_to_server(task_list, "www110", "/etc/csh.login", "/tmp/csh.login");
pssh_cp_to_server(task_list, "www110", "/etc/generateCRL.conf", "/tmp/generateCRL.conf");
pssh_cp_to_server(task_list, "www110", "/etc/HOSTNAME", "/tmp/HOSTNAME");
pssh_cp_to_server(task_list, "www110", "/etc/defkeymap.map", "/tmp/defkeymap.map");
pssh_cp_to_server(task_list, "www110", "/etc/modprobe.conf", "/tmp/modprobe.conf");
pssh_cp_to_server(task_list, "www110", "/etc/fdprm", "/tmp/fdprm");
pssh_cp_to_server(task_list, "www110", "/etc/fstab", "/tmp/fstab");
pssh_cp_to_server(task_list, "www110", "/etc/group", "/tmp/group");
pssh_cp_to_server(task_list, "www110", "/etc/hosts", "/tmp/hosts");
pssh_cp_to_server(task_list, "www110", "/etc/issue", "/tmp/issue");
pssh_cp_to_server(task_list, "www110", "/etc/magic", "/tmp/magic");
pssh_cp_to_server(task_list, "www110", "/etc/vimrc", "/tmp/vimrc");
pssh_cp_to_server(task_list, "www110", "/etc/zshrc", "/tmp/zshrc");
pssh_cp_to_server(task_list, "www110", "/etc/Muttrc", "/tmp/Muttrc");
pssh_cp_to_server(task_list, "www110", "/etc/microcode.dat", "/tmp/microcode.dat"); 
pssh_cp_to_server(task_list, "www110", "/etc/yp.conf", "/tmp/yp.conf");
pssh_cp_to_server(task_list, "www110", "/etc/smartd.conf", "/tmp/smartd.conf");
pssh_cp_to_server(task_list, "www110", "/etc/krb5.conf", "/tmp/krb5.conf");
pssh_cp_to_server(task_list, "www110", "/etc/defkeymap.name", "/tmp/defkeymap.name");
pssh_cp_to_server(task_list, "www110", "/etc/scpm.users", "/tmp/scpm.users");
pssh_cp_to_server(task_list, "www110", "/etc/insserv.conf", "/tmp/insserv.conf");
pssh_cp_to_server(task_list, "www110", "/etc/lesskey", "/tmp/lesskey");
pssh_cp_to_server(task_list, "www110", "/etc/c-client.cf", "/tmp/c-client.cf");
pssh_cp_to_server(task_list, "www110", "/etc/mysqlaccess.conf", "/tmp/mysqlaccess.conf");
pssh_cp_to_server(task_list, "www110", "/etc/auto.net", "/tmp/auto.net");
pssh_cp_to_server(task_list, "www110", "/etc/auto.smb", "/tmp/auto.smb");
pssh_cp_to_server(task_list, "www110", "/etc/nscd.conf", "/tmp/nscd.conf");
pssh_cp_to_server(task_list, "www110", "/etc/grub.conf", "/tmp/grub.conf");
pssh_cp_to_server(task_list, "www110", "/etc/cron.deny", "/tmp/cron.deny");
pssh_cp_to_server(task_list, "www110", "/etc/mail.rc", "/tmp/mail.rc");
pssh_cp_to_server(task_list, "www110", "/etc/mailcap", "/tmp/mailcap");
pssh_cp_to_server(task_list, "www110", "/etc/permissions", "/tmp/permissions");
pssh_cp_to_server(task_list, "www110", "/etc/slp.reg", "/tmp/slp.reg");
pssh_cp_to_server(task_list, "www110", "/etc/slp.spi", "/tmp/slp.spi");
pssh_cp_to_server(task_list, "www110", "/etc/pythonstart", "/tmp/pythonstart");
pssh_cp_to_server(task_list, "www110", "/etc/slsh.rc", "/tmp/slsh.rc");
pssh_cp_to_server(task_list, "www110", "/etc/filesystems", "/tmp/filesystems");
pssh_cp_to_server(task_list, "www110", "/etc/DIR_COLORS", "/tmp/DIR_COLORS");
pssh_cp_to_server(task_list, "www110", "/etc/permissions.paranoid", "/tmp/permissions.paranoid");
pssh_cp_to_server(task_list, "www110", "/etc/idn.conf", "/tmp/idn.conf");
pssh_cp_to_server(task_list, "www110", "/etc/idnalias.conf", "/tmp/idnalias.conf");
pssh_cp_to_server(task_list, "www110", "/etc/xinetd.conf", "/tmp/xinetd.conf");
pssh_cp_to_server(task_list, "www110", "/etc/rpasswd.conf", "/tmp/rpasswd.conf");
pssh_cp_to_server(task_list, "www110", "/etc/scsi_id.config", "/tmp/scsi_id.config");
pssh_cp_to_server(task_list, "www110", "/etc/hosts.allow", "/tmp/hosts.allow");
pssh_cp_to_server(task_list, "www110", "/etc/uniconf.conf", "/tmp/uniconf.conf");
pssh_cp_to_server(task_list, "www110", "/etc/hosts.equiv", "/tmp/hosts.equiv");
pssh_cp_to_server(task_list, "www110", "/etc/screenrc", "/tmp/screenrc");
pssh_cp_to_server(task_list, "www110", "/etc/sudoers", "/tmp/sudoers");
pssh_cp_to_server(task_list, "www110", "/etc/modprobe.conf.local", "/tmp/modprobe.conf.local");
pssh_cp_to_server(task_list, "www110", "/etc/exports", "/tmp/exports");
pssh_cp_to_server(task_list, "www110", "/etc/ethers", "/tmp/ethers");
pssh_cp_to_server(task_list, "www110", "/etc/rc.splash", "/tmp/rc.splash");
pssh_cp_to_server(task_list, "www110", "/etc/rc.status", "/tmp/rc.status");
pssh_cp_to_server(task_list, "www110", "/etc/smpppd-c.conf", "/tmp/smpppd-c.conf");
pssh_cp_to_server(task_list, "www110", "/etc/permissions.local", "/tmp/permissions.local");
pssh_cp_to_server(task_list, "www110", "/etc/fb.modes", "/tmp/fb.modes");
pssh_cp_to_server(task_list, "www110", "/etc/shadow.old", "/tmp/shadow.old");
pssh_cp_to_server(task_list, "www110", "/etc/rsyncd.secrets", "/tmp/rsyncd.secrets");
pssh_cp_to_server(task_list, "www110", "/etc/evms.conf", "/tmp/evms.conf");
pssh_cp_to_server(task_list, "www110", "/etc/my.cnf", "/tmp/my.cnf");
pssh_cp_to_server(task_list, "www110", "/etc/hushlogins", "/tmp/hushlogins");
pssh_cp_to_server(task_list, "www110", "/etc/ttytype", "/tmp/ttytype");
pssh_cp_to_server(task_list, "www110", "/etc/adjtime", "/tmp/adjtime");
pssh_cp_to_server(task_list, "www110", "/etc/suseRegister.conf", "/tmp/suseRegister.conf");
pssh_cp_to_server(task_list, "www110", "/etc/passwd", "/tmp/passwd");
pssh_cp_to_server(task_list, "www110", "/etc/group.YaST2save", "/tmp/group.YaST2save");
pssh_cp_to_server(task_list, "www110", "/etc/sysctl.conf", "/tmp/sysctl.conf");
pssh_cp_to_server(task_list, "www110", "/etc/.pwd.lock", "/tmp/.pwd.lock");
pssh_cp_to_server(task_list, "www110", "/etc/aliases.db", "/tmp/aliases.db");
pssh_cp_to_server(task_list, "www110", "/etc/bash.bashrc.local", "/tmp/bash.bashrc.local");
pssh_cp_to_server(task_list, "www110", "/etc/papersize", "/tmp/papersize");
pssh_cp_to_server(task_list, "www110", "/etc/logindevperm", "/tmp/logindevperm");
pssh_cp_to_server(task_list, "www110", "/etc/slp.conf", "/tmp/slp.conf");
pssh_cp_to_server(task_list, "www110", "/etc/shadow", "/tmp/shadow");
pssh_cp_to_server(task_list, "www110", "/etc/shells", "/tmp/shells");
pssh_cp_to_server(task_list, "www110", "/etc/netgroup", "/tmp/netgroup");
pssh_cp_to_server(task_list, "www110", "/etc/localtime", "/tmp/localtime");
pssh_cp_to_server(task_list, "www110", "/etc/networks", "/tmp/networks");
pssh_cp_to_server(task_list, "www110", "/etc/auto.misc", "/tmp/auto.misc");
pssh_cp_to_server(task_list, "www110", "/etc/idmapd.conf", "/tmp/idmapd.conf");
pssh_cp_to_server(task_list, "www110", "/etc/ld.so.conf", "/tmp/ld.so.conf");
pssh_cp_to_server(task_list, "www110", "/etc/aliases", "/tmp/aliases");
pssh_cp_to_server(task_list, "www110", "/etc/wgetrc", "/tmp/wgetrc");
pssh_cp_to_server(task_list, "www110", "/etc/rc.d.README", "/tmp/rc.d.README");
pssh_cp_to_server(task_list, "www110", "/etc/openct.conf", "/tmp/openct.conf");
pssh_cp_to_server(task_list, "www110", "/etc/printcap_nodefault", "/tmp/printcap_nodefault");
pssh_cp_to_server(task_list, "www110", "/etc/printcap", "/tmp/printcap");
pssh_cp_to_server(task_list, "www110", "/etc/opiekeys", "/tmp/opiekeys");
pssh_cp_to_server(task_list, "www110", "/etc/group.old", "/tmp/group.old");
pssh_cp_to_server(task_list, "www110", "/etc/ntp.conf", "/tmp/ntp.conf");
pssh_cp_to_server(task_list, "www110", "/etc/environment", "/tmp/environment");
pssh_cp_to_server(task_list, "www110", "/etc/at.deny", "/tmp/at.deny");
pssh_cp_to_server(task_list, "www110", "/etc/hosts.YaST2save", "/tmp/hosts.YaST2save");
pssh_cp_to_server(task_list, "www110", "/etc/services", "/tmp/services");
pssh_cp_to_server(task_list, "www110", "/etc/SuSE-release", "/tmp/SuSE-release");
pssh_cp_to_server(task_list, "www110", "/etc/sensors.conf", "/tmp/sensors.conf");
pssh_cp_to_server(task_list, "www110", "/etc/zshenv", "/tmp/zshenv");
pssh_cp_to_server(task_list, "www110", "/etc/ld.so.cache", "/tmp/ld.so.cache");
pssh_cp_to_server(task_list, "www110", "/etc/permissions.easy", "/tmp/permissions.easy");
pssh_cp_to_server(task_list, "www110", "/etc/rsyncd.conf", "/tmp/rsyncd.conf");
pssh_cp_to_server(task_list, "www110", "/etc/gssapi_mech.conf", "/tmp/gssapi_mech.conf");
pssh_cp_to_server(task_list, "www110", "/etc/opensc.conf", "/tmp/opensc.conf");
pssh_cp_to_server(task_list, "www110", "/etc/aclocal_dirlist", "/tmp/aclocal_dirlist");
pssh_cp_to_server(task_list, "www110", "/etc/hosts.deny", "/tmp/hosts.deny");
pssh_cp_to_server(task_list, "www110", "/etc/nntpserver", "/tmp/nntpserver");
pssh_cp_to_server(task_list, "www110", "/etc/logrotate.conf", "/tmp/logrotate.conf");
pssh_cp_to_server(task_list, "www110", "/etc/lesskey.bin", "/tmp/lesskey.bin");
pssh_cp_to_server(task_list, "www110", "/etc/bindresvport.blacklist", "/tmp/bindresvport.blacklist");
pssh_cp_to_server(task_list, "www110", "/etc/bash.bashrc", "/tmp/bash.bashrc");
pssh_cp_to_server(task_list, "www110", "/etc/inittab", "/tmp/inittab");
pssh_cp_to_server(task_list, "www110", "/etc/inputrc", "/tmp/inputrc");
pssh_cp_to_server(task_list, "www110", "/etc/host.conf", "/tmp/host.conf");
pssh_cp_to_server(task_list, "www110", "/etc/powerd.conf", "/tmp/powerd.conf");
pssh_cp_to_server(task_list, "www110", "/etc/login.defs", "/tmp/login.defs");
pssh_cp_to_server(task_list, "www110", "/etc/protocols", "/tmp/protocols");
pssh_cp_to_server(task_list, "www110", "/etc/passwd.YaST2save", "/tmp/passwd.YaST2save");
pssh_cp_to_server(task_list, "www110", "/etc/ldap.conf", "/tmp/ldap.conf");
pssh_cp_to_server(task_list, "www110", "/etc/passwd.old", "/tmp/passwd.old");
pssh_cp_to_server(task_list, "www110", "/etc/resolv.conf", "/tmp/resolv.conf");
pssh_cp_to_server(task_list, "www110", "/etc/manpath.config", "/tmp/manpath.config");
pssh_cp_to_server(task_list, "www110", "/etc/profile", "/tmp/profile");
pssh_cp_to_server(task_list, "www110", "/etc/resmgr.conf", "/tmp/resmgr.conf");
pssh_cp_to_server(task_list, "www110", "/etc/hosts.lpd", "/tmp/hosts.lpd");
pssh_cp_to_server(task_list, "www110", "/etc/permissions.secure", "/tmp/permissions.secure");
pssh_cp_to_server(task_list, "www110", "/etc/mime.types", "/tmp/mime.types");
#endif
    /* run */
    i = 0;
    do {
        i++;
        ret = pssh_exec(task_list, &task, TIMEOUT);
        printf("time: %ld, ret = %s for %s <%s>\n", time(0), conn_ret_str[ret], pssh_task_server_name(task), pssh_task_get_cmd(task));
    } while (ret == PSSH_RUNNING);
    
    task = pssh_task_first(task_list);
    while (task != NULL) {
        printf("%s: get_cmd: <%s> stat %s\n", pssh_task_server_name(task), pssh_task_get_cmd(task),
               statstr[pssh_task_stat(task)]);
        task = pssh_task_next(task_list);
    }

    pssh_task_list_free(task_list);
    pssh_free(pssh);
    printf("ret = %s\n", conn_ret_str[ret]);

    /* Cleanup */
    getrusage(RUSAGE_SELF, &ru);
    utime = (ru.ru_utime.tv_usec + ru.ru_utime.tv_sec*1000000) / 1000;
    stime = (ru.ru_stime.tv_usec + ru.ru_stime.tv_sec*1000000) / 1000;
    printf("utime : %lu, stime: %lu\n", utime, stime);

    (void) argc;
    (void) argv;
    return 0;
}