diff options
Diffstat (limited to 'plpnfsd/mp_main.c')
-rw-r--r-- | plpnfsd/mp_main.c | 277 |
1 files changed, 141 insertions, 136 deletions
diff --git a/plpnfsd/mp_main.c b/plpnfsd/mp_main.c index e83e15a..719af42 100644 --- a/plpnfsd/mp_main.c +++ b/plpnfsd/mp_main.c @@ -46,11 +46,11 @@ time_t devcache_stamp = 0; fattr root_fattr = { - NFDIR, 0040500, 1, 0, 0, - BLOCKSIZE, BLOCKSIZE, FID, 1, FID, 1, - {0, 0}, - {0, 0}, - {0, 0} + NFDIR, 0040500, 1, 0, 0, + BLOCKSIZE, BLOCKSIZE, FID, 1, FID, 1, + {0, 0}, + {0, 0}, + {0, 0} }; #if defined(hpux) || defined(__SVR4) || defined(__sgi) @@ -59,11 +59,11 @@ void usleep(usec) int usec; { - struct timeval t; + struct timeval t; - t.tv_sec = (long) (usec / 1000000); - t.tv_usec = (long) (usec % 1000000); - select(0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &t); + t.tv_sec = (long) (usec / 1000000); + t.tv_usec = (long) (usec % 1000000); + select(0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &t); } #endif #endif /* hpux */ @@ -71,154 +71,159 @@ int usec; int debuglog(char *fmt, ...) { - va_list ap; - char *buf; - - if (!debug) - return 0; - buf = (char *)malloc(1024); - va_start(ap, fmt); - vsnprintf(buf, 1024, fmt, ap); - syslog(LOG_DEBUG, buf); - free(buf); - va_end(ap); + va_list ap; + char *buf; + + if (!debug) return 0; + buf = (char *)malloc(1024); + va_start(ap, fmt); + vsnprintf(buf, 1024, fmt, ap); + syslog(LOG_DEBUG, buf); + free(buf); + va_end(ap); + return 0; } int errorlog(char *fmt, ...) { - va_list ap; - char *buf = (char *)malloc(1024); - - va_start(ap, fmt); - vsnprintf(buf, 1024, fmt, ap); - va_end(ap); - syslog(LOG_ERR, buf); - free(buf); - return 0; + va_list ap; + char *buf = (char *)malloc(1024); + + va_start(ap, fmt); + vsnprintf(buf, 1024, fmt, ap); + va_end(ap); + syslog(LOG_ERR, buf); + free(buf); + return 0; } int infolog(char *fmt, ...) { - va_list ap; - char *buf = (char *)malloc(1024); - - va_start(ap, fmt); - vsnprintf(buf, 1024, fmt, ap); - syslog(LOG_INFO, buf); - free(buf); - va_end(ap); - return 0; + va_list ap; + char *buf = (char *)malloc(1024); + + va_start(ap, fmt); + vsnprintf(buf, 1024, fmt, ap); + syslog(LOG_INFO, buf); + free(buf); + va_end(ap); + return 0; } int force_cache_clean = 0; int set_owner(char *user, int logstdio) { - struct passwd *pw = NULL; - - if (user && *user) { - if (!(pw = getpwnam(user))) { - if (logstdio) - fprintf(stderr, "User %s not found.\n", user); - else - errorlog("User %s not found.\n", user); - endpwent(); - return 1; - } - if (getuid() && pw->pw_uid != getuid()) { - if (logstdio) - fprintf(stderr, "Only root can set owner to someone other.\n"); - else - errorlog("Only root can set owner to someone other.\n"); - endpwent(); - return 1; - } - } else { - if (!logstdio) { - errorlog("Request to change owner with empty argument.\n"); - return 1; - } - if (!(pw = getpwuid(getuid()))) { - fprintf(stderr, "You don't exist, go away!\n"); - endpwent(); - return 1; - } + struct passwd *pw = NULL; + + if (user && *user) { + if (!(pw = getpwnam(user))) { + if (logstdio) + fprintf(stderr, "User %s not found.\n", user); + else + errorlog("User %s not found.\n", user); + endpwent(); + return 1; } - if (pw) { - if ((root_fattr.uid != pw->pw_uid) || (root_fattr.gid != pw->pw_gid)) { - struct group *g = getgrgid(pw->pw_gid); - char *gname = (g && g->gr_name && *(g->gr_name)) ? g->gr_name : "???"; - - root_fattr.uid = pw->pw_uid; - root_fattr.gid = pw->pw_gid; - if (logstdio) - printf("Owner set to %s.%s\n", pw->pw_name, gname); - else - infolog("Owner set to %s.%s\n", pw->pw_name, gname); - endgrent(); - force_cache_clean = 1; - cache_flush(); - } + if (getuid() && pw->pw_uid != getuid()) { + if (logstdio) + fprintf(stderr, "Only root can set owner to someone other.\n"); + else + errorlog("Only root can set owner to someone other.\n"); + endpwent(); + return 1; } - endpwent(); - return 0; + } else { + if (!logstdio) { + errorlog("Request to change owner with empty argument.\n"); + return 1; + } + if (!(pw = getpwuid(getuid()))) { + fprintf(stderr, "You don't exist, go away!\n"); + endpwent(); + return 1; + } + } + if (pw) { + if ((root_fattr.uid != pw->pw_uid) || (root_fattr.gid != pw->pw_gid)) { + struct group *g = getgrgid(pw->pw_gid); + char *gname = (g && g->gr_name && *(g->gr_name)) ? g->gr_name : "???"; + root_fattr.uid = pw->pw_uid; + root_fattr.gid = pw->pw_gid; + if (logstdio) + printf("Owner set to %s.%s\n", pw->pw_name, gname); + else + infolog("Owner set to %s.%s\n", pw->pw_name, gname); + endgrent(); + force_cache_clean = 1; + cache_flush(); + } + } + endpwent(); + return 0; } int mp_main(int verbose, char *dir, char *user) { - struct passwd *pw; - struct timeval tv; - struct timezone tz; - p_inode *rp; - nfs_fh root_fh; - DIR *dirp; - DIRENT *diep; - int i; - - - if (!(pw = getpwuid(getuid()))) { - fprintf(stderr, "You don't exist, go away!\n"); - return 1; - } - if (!user) { - if (!(user = (char *) getenv("USER"))) - user = (char *) getenv("logname"); - } - endpwent(); - if (set_owner(user, 1)) - return 1; - gettimeofday(&tv, &tz); - - debug = verbose; - if (debug) - printf("plpnfsd: version %s, mounting on %s ...\n", VERSION, dir); - - /* Check if mountdir is empty (or else you can overmount e.g /etc) - It is done here, because exit hangs, if hardware flowcontrol is - not present. Bugreport Nov 28 1996 by Olaf Flebbe */ - if (!(dirp = opendir(dir))) { - perror(dir); - return 1; - } - i = 0; - while ((diep = readdir(dirp)) != 0) - if (strcmp(diep->d_name, ".") && strcmp(diep->d_name, "..")) - i++; - closedir(dirp); - if (i) { - fprintf(stderr, "Sorry, directory %s is not empty, exiting.\n", dir); - return 1; - } - openlog("plpnfsd", LOG_PID|LOG_CONS, LOG_DAEMON); - rp = get_nam(""); - inode2fh(rp->inode, root_fh.data); - root_fattr.fileid = rp->inode; - root_fattr.atime.seconds = root_fattr.mtime.seconds = - root_fattr.ctime.seconds = tv.tv_sec; - - mount_and_run(dir, nfs_program_2, &root_fh); - return 0; + struct passwd *pw; + struct timeval tv; + struct timezone tz; + p_inode *rp; + nfs_fh root_fh; + DIR *dirp; + DIRENT *diep; + int i; + + + if (!(pw = getpwuid(getuid()))) { + fprintf(stderr, "You don't exist, go away!\n"); + return 1; + } + if (!user) { + if (!(user = (char *) getenv("USER"))) + user = (char *) getenv("logname"); + } + endpwent(); + if (set_owner(user, 1)) + return 1; + gettimeofday(&tv, &tz); + + debug = verbose; + if (debug) + printf("plpnfsd: version %s, mounting on %s ...\n", VERSION, dir); + + /* Check if mountdir is empty (or else you can overmount e.g /etc) + It is done here, because exit hangs, if hardware flowcontrol is + not present. Bugreport Nov 28 1996 by Olaf Flebbe */ + if (!(dirp = opendir(dir))) { + perror(dir); + return 1; + } + i = 0; + while ((diep = readdir(dirp)) != 0) + if (strcmp(diep->d_name, ".") && strcmp(diep->d_name, "..")) + i++; + closedir(dirp); + if (i) { + fprintf(stderr, "Sorry, directory %s is not empty, exiting.\n", dir); + return 1; + } + openlog("plpnfsd", LOG_PID|LOG_CONS, LOG_DAEMON); + rp = get_nam(""); + inode2fh(rp->inode, root_fh.data); + root_fattr.fileid = rp->inode; + root_fattr.atime.seconds = root_fattr.mtime.seconds = + root_fattr.ctime.seconds = tv.tv_sec; + + mount_and_run(dir, nfs_program_2, &root_fh); + return 0; } + +/* + * Local variables: + * c-basic-offset: 4 + * End: + */ |