int main(int argc, char *argv[]) { const char *action; char *file = NULL; char *dbfile = NULL; PWInfo pwinfo; int fodder; int ret = 0; int with_chroot = 1; int with_mkdb = 0; if (argc < 2) { help(); } #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, ""); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, ""); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, ""); # endif #endif #ifdef PROBE_RANDOM_AT_RUNTIME pw_zrand_probe(); #endif pwinfo.pwd = NULL; pwinfo.gecos = NULL; pwinfo.home = NULL; pwinfo.allow_local_ip = pwinfo.deny_local_ip = NULL; pwinfo.allow_client_ip = pwinfo.deny_client_ip = NULL; pwinfo.has_bw_dl = 0; pwinfo.has_bw_ul = 0; pwinfo.has_quota_files = 0; pwinfo.has_quota_size = 0; pwinfo.has_ul_ratio = 0; pwinfo.has_dl_ratio = 0; pwinfo.has_time = 0; pwinfo.time_begin = pwinfo.time_end = 0U; pwinfo.has_per_user_max = 0; pwinfo.per_user_max = 0U; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) pwinfo.uid = (uid_t) 42U; pwinfo.gid = (gid_t) 42U; #else pwinfo.uid = (uid_t) 0U; pwinfo.gid = (gid_t) 0U; #endif argv++; argc--; action = *argv; if (argc > 1) { argv++; argc--; pwinfo.login = *argv; } else { pwinfo.login = NULL; } filter_pw_line_sep(pwinfo.login); while ((fodder = getopt(argc, argv, "c:d:D:f:F:g:hi:I:mn:N:q:Q:r:R:t:T:u:y:z:")) != -1) { switch(fodder) { case 'c' : { if ((pwinfo.gecos = strdup(optarg)) == NULL) { no_mem(); } filter_pw_line_sep(pwinfo.gecos); break; } case 'D' : with_chroot = 0; case 'd' : { char *optarg_copy; size_t sizeof_home; size_t optarg_len; if ((optarg_copy = strdup(optarg)) == NULL) { no_mem(); } again: optarg_len = strlen(optarg_copy); if (optarg_len < (size_t) 1U) { fprintf(stderr, "home directory is missing\n"); exit(EXIT_FAILURE); } if (optarg_copy[optarg_len - 1U] == '/') { optarg_len--; optarg_copy[optarg_len] = 0; goto again; } sizeof_home = optarg_len + sizeof "/./"; if ((pwinfo.home = malloc(sizeof_home)) == NULL) { no_mem(); } snprintf(pwinfo.home, sizeof_home, "%s%s", optarg_copy, with_chroot != 0 ? "/./" : ""); filter_pw_line_sep(pwinfo.home); break; } case 'f' : { if ((file = strdup(optarg)) == NULL) { no_mem(); } break; } case 'F' : { if ((dbfile = strdup(optarg)) == NULL) { no_mem(); } break; } case 'g' : { struct group *gr; if (pwinfo.gid > (gid_t) 0 && pwinfo.uid <= (uid_t) 0) { fprintf(stderr, "You already gave a gid\n"); exit(EXIT_FAILURE); } if ((gr = getgrnam(optarg)) != NULL) { pwinfo.gid = gr->gr_gid; } else { pwinfo.gid = (gid_t) strtoul(optarg, NULL, 10); } break; } case 'h' : { help(); /* doesn't return */ } case 'i' : { if ((pwinfo.allow_local_ip = strdup(optarg)) == NULL) { no_mem(); } break; } case 'I' : { if ((pwinfo.deny_local_ip = strdup(optarg)) == NULL) { no_mem(); } break; } case 'm' : { with_mkdb = 1; break; } case 'n' : { if (*optarg == 0) { pwinfo.has_quota_files = -1; } else { pwinfo.quota_files = strtoull(optarg, NULL, 10); pwinfo.has_quota_files = 1; } break; } case 'N' : { if (*optarg == 0) { pwinfo.has_quota_size = -1; } else { pwinfo.quota_size = strtoull(optarg, NULL, 10) * (1024ULL * 1024ULL); pwinfo.has_quota_size = 1; } break; } case 'q' : { if (*optarg == 0) { pwinfo.has_ul_ratio = -1; } else { pwinfo.ul_ratio = (unsigned int) strtoul(optarg, NULL, 10); if (pwinfo.ul_ratio < 1U) { fprintf(stderr, "Illegal upload ratio\n"); exit(EXIT_FAILURE); } pwinfo.has_ul_ratio = 1; } break; } case 'Q' : { if (*optarg == 0) { pwinfo.has_dl_ratio = -1; } else { pwinfo.dl_ratio = (unsigned int) strtoul(optarg, NULL, 10); if (pwinfo.dl_ratio < 1U) { fprintf(stderr, "Illegal download ratio\n"); exit(EXIT_FAILURE); } pwinfo.has_dl_ratio = 1; } break; } case 'r' : { if ((pwinfo.allow_client_ip = strdup(optarg)) == NULL) { no_mem(); } break; } case 'R' : { if ((pwinfo.deny_client_ip = strdup(optarg)) == NULL) { no_mem(); } break; } case 't' : { if (*optarg == 0) { pwinfo.has_bw_dl = -1; } else { if ((pwinfo.bw_dl = strtoul(optarg, NULL, 10)) > 0UL) { pwinfo.bw_dl *= 1024UL; pwinfo.has_bw_dl = 1; } } break; } case 'T' : { if (*optarg == 0) { pwinfo.has_bw_ul = -1; } else { if ((pwinfo.bw_ul = strtoul(optarg, NULL, 10)) > 0UL) { pwinfo.bw_ul *= 1024UL; pwinfo.has_bw_ul = 1; } } break; } case 'u' : { struct passwd *pw; if (pwinfo.uid > (uid_t) 0) { fprintf(stderr, "You already gave an uid\n"); exit(EXIT_FAILURE); } if ((pw = getpwnam(optarg)) != NULL) { pwinfo.uid = pw->pw_uid; if (pwinfo.gid <= (gid_t) 0) { pwinfo.gid = pw->pw_gid; } } else { pwinfo.uid = (uid_t) strtoul(optarg, NULL, 10); } break; } case 'y' : { if ((pwinfo.per_user_max = (unsigned int) strtoul(optarg, NULL, 10)) <= 0U) { pwinfo.has_per_user_max = -1; } else { pwinfo.has_per_user_max = 1; } break; } case 'z' : { if (sscanf(optarg, "%u-%u", &pwinfo.time_begin, &pwinfo.time_end) == 2 && pwinfo.time_begin < 2360 && (pwinfo.time_begin % 100) < 60 && pwinfo.time_end < 2360 && (pwinfo.time_end % 100) < 60) { pwinfo.has_time = 1; } else if (*optarg != 0) { fprintf(stderr, "Time should be given as hhmm-hhmm\n" "Example : 0900-1800 (9 am to 6 pm)\n"); exit(EXIT_FAILURE); } else { pwinfo.has_time = -1; } break; } case '?' : help(); } } if (file == NULL) { char *file_; if ((file_ = getenv(ENV_DEFAULT_PW_FILE)) != NULL && *file_ != 0) { file = file_; } else if ((file = strdup(DEFAULT_PW_FILE)) == NULL) { no_mem(); } } (void) umask(0177); init_zrand(); if (strcasecmp(action, "useradd") == 0) { ret = do_useradd(file, &pwinfo); if (with_mkdb != 0) { ret |= do_mkdb(dbfile, file); } } else if (strcasecmp(action, "usermod") == 0) { ret = do_usermod(file, &pwinfo); if (with_mkdb != 0) { ret |= do_mkdb(dbfile, file); } } else if (strcasecmp(action, "userdel") == 0) { ret = do_userdel(file, &pwinfo); if (with_mkdb != 0) { ret |= do_mkdb(dbfile, file); } } else if (strcasecmp(action, "passwd") == 0) { ret = do_passwd(file, &pwinfo); if (with_mkdb != 0) { ret |= do_mkdb(dbfile, file); } } else if (strcasecmp(action, "show") == 0) { ret = do_show(file, &pwinfo); } else if (strcasecmp(action, "mkdb") == 0) { ret = do_mkdb(pwinfo.login, file); } else if (strcasecmp(action, "list") == 0) { ret = do_list(file); } else { ret = PW_ERROR_UNEXPECTED_ERROR; help(); } return ret; }
int main(int argc, char *argv[]){ int c; u_info user_info; const char* action = argv[1]; user_info.fconf = NULL ; user_info.pwd =NULL; user_info.gid = 0 ; user_info.uid = 0 ; user_info.home =NULL; if (argc < 2) { help(); } opterr = 0; while ((c = getopt(argc, argv, ":l:u:d:g:f:")) != -1) { switch(c) { case 'l':{ user_info.login= optarg; break; } case 'u':{ user_info.uid = (uid_t)strtoul(optarg, NULL, 10); break; } case 'd':{ user_info.home = optarg; break; } case 'g':{ user_info.gid =(gid_t) strtoul(optarg, NULL, 10); break; } case 'f':{ user_info.fconf = optarg; break; } case '?': help(); } } /*end while*/ if(user_info.fconf == NULL) user_info.fconf = ENV_CONFIG_FILE; if (strcasecmp(action, "useradd") == 0) { if(do_check_user(&user_info)){ printf("User already exists ...\n"); return 0; } do_useradd(&user_info); } else if (strcasecmp(action, "usermod") == 0) { do_usermod(&user_info); } else if (strcasecmp(action, "userdel") == 0) { if(!(do_check_user(&user_info))){ printf("This user does not exist ...\n"); return 0; } do_userdel(&user_info); } else if (strcasecmp(action, "passwd") == 0) { do_passwd(&user_info); } else if (strcasecmp(action, "show") == 0) { do_show(&user_info); } else if (strcasecmp(action, "list") == 0) { do_list(&user_info); } else { help(); } return 0; }