Example #1
0
static int
sp_socksrv_connect(Socksrv *ss)
{
    if (bind(ss->sock, ss->saddr, ss->saddrlen) < 0) {
        sp_suerror("cannot bind socket", errno);
        return -1;
    }

    if (listen(ss->sock, 128) < 0) {
        sp_suerror("cannot listen on socket", errno);
        return -1;
    }

    return 0;
}
Example #2
0
static Socksrv*
sp_socksrv_create_common(int domain, int type, int proto)
{
    Socksrv *ss;
    int flag = 1;

    ss = sp_malloc(sizeof(*ss));
    if (!ss)
        return NULL;

    ss->domain = domain;
    ss->type = type;
    ss->proto = proto;
    ss->shutdown = 0;
    ss->sock = socket(domain, type, proto);
    if (ss->sock < 0) {
        sp_suerror("cannot create socket", errno);
        free(ss);
        return NULL;
    }

    setsockopt(ss->sock, SOL_SOCKET, SO_REUSEADDR, (char *)&flag, sizeof(int));

    return ss;
}
Example #3
0
Spsrv*
sp_socksrv_create_tcp(int *port)
{
    socklen_t n;
    Spsrv *srv;
    Socksrv *ss;
    int addrlen;
    static struct sockaddr_in saddr;
    char *address;

    ss = sp_socksrv_create_common(PF_INET, SOCK_STREAM, 0);
    if (!ss)
        return NULL;

    addrlen = sizeof(saddr);
    memset(&saddr, '\0', addrlen);

    address = getenv("SPFS_IP");
    if (!address) {
      address = "127.0.0.1";
    }

    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = inet_addr(address);
    saddr.sin_port = htons(*port);

    ss->saddr = (struct sockaddr *) &saddr;
    ss->saddrlen = addrlen;

    if (sp_socksrv_connect(ss) < 0) {
        free(ss);
        return NULL;
    }

    if (getsockname(ss->sock, ss->saddr, &n) < 0) {
        sp_suerror("cannot get socket address", errno);
        free(ss);
        return NULL;
    }

    srv = sp_srv_create();
    if (!srv) {
        free(ss);
        return NULL;
    }

    srv->srvaux = ss;
    srv->start = sp_socksrv_start;
    srv->shutdown = sp_socksrv_shutdown;
    srv->destroy = sp_socksrv_destroy;

    return srv;
}
Example #4
0
int
main(int argc, char **argv)
{
	int c, ecode, port = STAT_PORT;
	u32 userid;
	char cmd[9], ukeypath[1024], userkey[4096];
	char *nodeset, *ename, *username, *groupname;
	char *adminkey = NULL, *end;
	Xpnodeset *nds, *nds2;
	int allflag = 0, passwdfile = 0;
	struct passwd *pw;
	struct group *gr;
	struct pwent {
		char *pw_name;
		uid_t pw_uid;
		gid_t pw_gid;
		char *pw_key;
		struct pwent *next;
	} *users, *head;

	while((c = getopt(argc, argv, "aA:dhup")) != -1) {
		switch(c) {
		case 'd':
			spc_chatty = 1;
			break;
		case 'A':
			adminkey = strdup(optarg);
			break;
		case 'a':
			allflag++;
			break;
		case 'u':
			passwdfile++;
			break;
		case 'p':
			port = strtol(optarg, &end, 10);
			if (*end != '\0')
				usage(argv[0]);
			break;
		case 'h':
		default:
			usage(argv[0]);
		}
	}

	if (argc < 2)
		usage(argv[0]);

	snprintf(cmd, 9 * sizeof(char), "%s", argv[optind++]);
	if (!strcmp("add", cmd) && !passwdfile) {
		if (argc < 7)
			usage(argv[0]);
	} else if (!strcmp("delete", cmd) && !passwdfile) {
		if (argc < 4)
			usage(argv[0]);
	} else if (!strcmp("addgroup", cmd) || !strcmp("delgroup", cmd)) {
		if (argc < 5)
			usage(argv[0]);		
	} else if (!strcmp("flush", cmd) || passwdfile)
		;
	else
		usage(argv[0]);

	if (!allflag && ((nodeset = getenv("NODES")) == NULL)) {
		if ((argc - optind) < 1 && !passwdfile)
			usage(argv[0]);
		nodeset = argv[optind++];
	}

	if (allflag) {
		char statserver[32];
		sprintf(statserver, "localhost!%d", port);
		nds = xp_nodeset_list(NULL);
		if(nds == NULL)
			nds = xp_nodeset_list(statserver);
		if (nds != NULL) {
			nds2 = xp_nodeset_create();
			if (nds2 != NULL) {
				if (xp_nodeset_filter_by_state(nds2, nds, "up") >= 0) {
					free(nds);
					nds = nds2;
				} else {
					free(nds2);
				}
			} /* if filter is unsuccessful just use the full set */
		}
	} else
		nds = xp_nodeset_from_string(nodeset);

	if (!nds)
		goto error;

	if (!strcmp("flush", cmd)) {
		if (xp_user_flush(nds, adminkey) < 0)
			goto error;
	} else if (!strcmp("delete", cmd)) {
		if (passwdfile) {
			setpwent();
			while ((pw = getpwent()) != NULL)
				xp_user_del(nds, adminkey, pw->pw_name);
			endpwent();
		} else {
			if ((argc - optind) < 1)
				usage(argv[0]);
			username = argv[optind++];
			if (xp_user_del(nds, adminkey, username) < 0)
				return -1;
		}
	} else if (!strcmp("add", cmd)) {
		if (passwdfile) {
			setpwent();
			head = NULL;
			while ((pw = getpwent()) != NULL) {
				snprintf(ukeypath, sizeof(ukeypath), "%s/.ssh/id_rsa.pub", pw->pw_dir);
				if (!access(ukeypath, R_OK)) {
					users = (struct pwent *)malloc(sizeof(struct pwent));
					users->pw_name = strdup(pw->pw_name);
					users->pw_uid = pw->pw_uid;
					users->pw_gid = pw->pw_gid;					
					users->pw_key = strdup(ukeypath);
					users->next = head;
					head = users;
				}
			}
			endpwent();

			for(; users; users = users->next) {
				if (get_user_key(users->pw_key, userkey, sizeof(userkey)) < 0)
					continue;
			
				if ((gr = getgrgid(users->pw_gid)) == NULL)
					continue;
			
				xp_user_add(nds, adminkey, users->pw_name, users->pw_uid,
					    gr->gr_name, userkey);
			}
		} else {
			if ((argc - optind) < 4)
				usage(argv[0]);
			username = argv[optind++];
			userid = strtol(argv[optind++], NULL, 10);
			groupname = argv[optind++];
			
			if (get_user_key(argv[optind], userkey, sizeof(userkey)) < 0) {
				sp_suerror("get_user_key", errno);
				goto error;
			}
			
			if (xp_user_add(nds, adminkey, username, userid,
					groupname, userkey) < 0)
				return -1;
		}
	} else { /* group operations */
		if ((argc - optind) < 2)
			usage(argv[0]);
		username = argv[optind++];
		groupname = argv[optind++];

		if (!strcmp("addgroup", cmd)) {
			if (xp_user_add_group(nds, adminkey, username,
					      groupname) < 0)
				return -1;
		} else { /* !strcmp("delgroup", cmd) */			
			if (xp_user_del_group(nds, adminkey, username,
					      groupname) < 0)
				return -1;
		}
	}
	return 0;
error:
	sp_rerror(&ename, &ecode);
	fprintf(stderr, "Error: %s\n", ename);
	return -1;
}