int rm_files(char *homedir, char *user, int flags) { if (rm_homedir(homedir, flags) != 0) { errmsg(M_RMFILES); return (EX_HOMEDIR); } return (EX_SUCCESS); }
int rm_files(char *homedir, char *user) { struct stat stbuf; char *dname, *bname; int autofs = 0; (void) strcpy(dhome, homedir); (void) strcpy(bhome, homedir); dname = dirname(dhome); bname = basename(bhome); (void) strcpy(pdir, dname); if ((stat(pdir, &stbuf) != 0) || !S_ISDIR(stbuf.st_mode)) return (EX_SUCCESS); if (strcmp(stbuf.st_fstype, MNTTYPE_AUTOFS) == 0) autofs = 1; if (autofs) { (void) umount2(homedir, 0); (void) strcpy(pdir, EXPORTDIR); (void) strlcat(pdir, dname, PATH_MAX + 1); (void) snprintf(homedir, PATH_MAX + 1, "%s/%s", pdir, bname); } if (rm_homedir(homedir) != 0) { errmsg(M_RMFILES); return (EX_HOMEDIR); } if (autofs) (void) edit_autofs_home(bname, (char *)NULL, (char *) NULL); return (EX_SUCCESS); }
/* Create a home directory and populate with files from skeleton directory. */ int create_home(char *homedir, char *skeldir, uid_t uid, gid_t gid, int newfs) /* home directory to create */ /* skel directory to copy if indicated */ /* uid of new user */ /* group id of new user */ /* allow filesystem creation */ { struct stat stbuf; char *dname, *bname; char *dataset; if (g_zfs == NULL) g_zfs = libzfs_init(); (void) strcpy(dhome, homedir); (void) strcpy(bhome, homedir); dname = dirname(dhome); bname = basename(bhome); (void) strcpy(pdir, dname); if ((stat(pdir, &stbuf) != 0) || !S_ISDIR(stbuf.st_mode)) { errmsg(M_OOPS, "access the parent directory", strerror(errno)); return (EX_HOMEDIR); } if (strcmp(stbuf.st_fstype, MNTTYPE_AUTOFS) == 0) { (void) strcpy(pdir, EXPORTDIR); (void) strlcat(pdir, dname, PATH_MAX + 1); (void) snprintf(homedir, PATH_MAX + 1, "%s/%s", pdir, bname); if (stat(pdir, &stbuf) == 0) (void) edit_autofs_home(bname, bname, pdir); } if ((strcmp(stbuf.st_fstype, MNTTYPE_ZFS) == 0) && (g_zfs != NULL) && newfs && ((dataset = get_mnt_special(pdir, stbuf.st_fstype)) != NULL)) { char nm[ZFS_MAXNAMELEN]; zfs_handle_t *zhp; (void) snprintf(nm, ZFS_MAXNAMELEN, "%s/%s", dataset, bname); if ((zfs_create(g_zfs, nm, ZFS_TYPE_FILESYSTEM, NULL) != 0) || ((zhp = zfs_open(g_zfs, nm, ZFS_TYPE_FILESYSTEM)) == NULL)) { errmsg(M_OOPS, "create the home directory", libzfs_error_description(g_zfs)); return (EX_HOMEDIR); } if (zfs_mount(zhp, NULL, 0) != 0) { errmsg(M_OOPS, "mount the home directory", libzfs_error_description(g_zfs)); (void) zfs_destroy(zhp, B_FALSE); return (EX_HOMEDIR); } zfs_close(zhp); if (chmod(homedir, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) != 0) { errmsg(M_OOPS, "change permissions of home directory", strerror(errno)); return (EX_HOMEDIR); } } else { if (mkdir(homedir, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) != 0) { errmsg(M_OOPS, "create the home directory", strerror(errno)); return (EX_HOMEDIR); } } if( chown(homedir, uid, gid) != 0 ) { errmsg(M_OOPS, "change ownership of home directory", strerror(errno)); return( EX_HOMEDIR ); } if(skeldir) { /* copy the skel_dir into the home directory */ (void) sprintf( cmdbuf, "cd %s && find . -print | cpio -pd %s", skeldir, homedir); if( system( cmdbuf ) != 0 ) { errmsg(M_OOPS, "copy skeleton directory into home " "directory", strerror(errno)); (void) rm_homedir( homedir ); return( EX_HOMEDIR ); } /* make sure contents in the home dirctory have correct owner */ (void) sprintf( cmdbuf,"cd %s && find . -exec chown %ld {} \\;", homedir, uid ); if( system( cmdbuf ) != 0) { errmsg(M_OOPS, "change owner of files home directory", strerror(errno)); (void) rm_homedir( homedir ); return( EX_HOMEDIR ); } /* and group....... */ (void) sprintf( cmdbuf, "cd %s && find . -exec chgrp %ld {} \\;", homedir, gid ); if( system( cmdbuf ) != 0) { errmsg(M_OOPS, "change group of files home directory", strerror(errno)); (void) rm_homedir( homedir ); return( EX_HOMEDIR ); } } return( EX_SUCCESS ); }
/* * Create a home directory and populate with files from skeleton * directory. */ int create_home(char *homedir, char *skeldir, uid_t uid, gid_t gid, int flags) /* home directory to create */ /* skel directory to copy if indicated */ /* uid of new user */ /* group id of new user */ /* miscellaneous flags */ { struct stat stbuf; char *dataset; char *dname, *bname, *rp; int created_fs = 0; rp = realpath(homedir, NULL); if (rp && (strcmp(rp, "/") == 0)) { return (EX_HOMEDIR); } (void) strcpy(dhome, homedir); (void) strcpy(bhome, homedir); dname = dirname(dhome); bname = basename(bhome); (void) strcpy(pdir, dname); if ((stat(pdir, &stbuf) != 0) || !S_ISDIR(stbuf.st_mode)) { errmsg(M_OOPS, "access the parent directory", strerror(errno)); return (EX_HOMEDIR); } if ((strcmp(stbuf.st_fstype, MNTTYPE_ZFS) == 0) && (flags & MANAGE_ZFS)) { if (g_zfs == NULL) g_zfs = libzfs_init(); if (g_zfs == NULL) { errmsg(M_OOPS, "libzfs_init failure", strerror(errno)); return (EX_HOMEDIR); } if ((dataset = get_mnt_special(pdir, stbuf.st_fstype)) != NULL) { char nm[ZFS_MAX_DATASET_NAME_LEN]; zfs_handle_t *zhp; (void) snprintf(nm, sizeof (nm), "%s/%s", dataset, bname); if ((zfs_create(g_zfs, nm, ZFS_TYPE_FILESYSTEM, NULL) != 0) || ((zhp = zfs_open(g_zfs, nm, ZFS_TYPE_FILESYSTEM)) == NULL)) { errmsg(M_OOPS, "create the home directory", libzfs_error_description(g_zfs)); libzfs_fini(g_zfs); g_zfs = NULL; return (EX_HOMEDIR); } if (zfs_mount(zhp, NULL, 0) != 0) { errmsg(M_OOPS, "mount the home directory", libzfs_error_description(g_zfs)); (void) zfs_destroy(zhp, B_FALSE); zfs_close(zhp); libzfs_fini(g_zfs); g_zfs = NULL; return (EX_HOMEDIR); } zfs_close(zhp); if (chmod(homedir, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) != 0) { errmsg(M_OOPS, "change permissions of home directory", strerror(errno)); libzfs_fini(g_zfs); g_zfs = NULL; return (EX_HOMEDIR); } created_fs = 1; } else { errmsg(M_NO_ZFS_MOUNTPOINT, pdir); } } if (!created_fs) { if (mkdir(homedir, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) != 0) { errmsg(M_OOPS, "create the home directory", strerror(errno)); if (g_zfs != NULL) { libzfs_fini(g_zfs); g_zfs = NULL; } return (EX_HOMEDIR); } } if (chown(homedir, uid, gid) != 0) { errmsg(M_OOPS, "change ownership of home directory", strerror(errno)); if (g_zfs != NULL) { libzfs_fini(g_zfs); g_zfs = NULL; } return (EX_HOMEDIR); } if (skeldir != NULL) { /* copy the skel_dir into the home directory */ (void) sprintf(cmdbuf, "cd %s && find . -print | cpio -pd %s", skeldir, homedir); if (system(cmdbuf) != 0) { errmsg(M_OOPS, "copy skeleton directory into home " "directory", strerror(errno)); (void) rm_homedir(homedir, flags); if (g_zfs != NULL) { libzfs_fini(g_zfs); g_zfs = NULL; } return (EX_HOMEDIR); } /* make sure contents in the home dirctory have correct owner */ (void) sprintf(cmdbuf, "cd %s && find . -exec chown %ld:%ld {} \\;", homedir, uid, gid); if (system(cmdbuf) != 0) { errmsg(M_OOPS, "change owner and group of files home directory", strerror(errno)); (void) rm_homedir(homedir, flags); if (g_zfs != NULL) { libzfs_fini(g_zfs); g_zfs = NULL; } return (EX_HOMEDIR); } } if (g_zfs != NULL) { libzfs_fini(g_zfs); g_zfs = NULL; } return (EX_SUCCESS); }