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; }
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; }
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; }
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; }