From 0e504612c8f4276f11dd3b8e7456ec0ee0ce8e0b Mon Sep 17 00:00:00 2001 From: Michael Spang Date: Fri, 23 Apr 2010 23:00:55 -0400 Subject: [PATCH] Readd quota support --- src/homedir.c | 15 +++++++++++++++ src/homedir.h | 1 + src/net.h | 1 + src/op-adduser.c | 17 +++++++++++++---- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/homedir.c b/src/homedir.c index 23384ab..9077be0 100644 --- a/src/homedir.c +++ b/src/homedir.c @@ -154,3 +154,18 @@ int ceo_create_home(char *homedir, char *skel, uid_t uid, gid_t gid, char *acces return 0; } + +int ceo_set_quota(char *proto, int id) { + char user[128]; + char *sqargs[] = { "setquota", "-a", "-p", proto, NULL, NULL }; + + snprintf(user, sizeof(user), "%d", id); + sqargs[4] = user; + + if (spawnv("/usr/sbin/setquota", sqargs)) { + error("failed to set quota for %s", user); + return -1; + } + + return 0; +} diff --git a/src/homedir.h b/src/homedir.h index 63ed38e..fa09ecc 100644 --- a/src/homedir.h +++ b/src/homedir.h @@ -3,3 +3,4 @@ #define CLUB_ACL "u::rwx,g::r-x,o::r-x,g:%d:rwx,m::rwx" int ceo_create_home(char *homedir, char *skel, uid_t uid, gid_t gid, char *access_acl, char *default_acl, char *email); +int ceo_set_quota(char *proto, int id); diff --git a/src/net.h b/src/net.h index 2015421..d4b774e 100644 --- a/src/net.h +++ b/src/net.h @@ -18,6 +18,7 @@ enum { #define EKERB -2 #define ELDAP -3 #define EHOME -4 +#define EQUOTA -5 int ceo_receive_message(int sock, struct strbuf *msg, uint32_t *msgtype); int ceo_send_message(int sock, void *msg, size_t len, uint32_t msgtype); diff --git a/src/op-adduser.c b/src/op-adduser.c index c7bf2dd..9c4d5a5 100644 --- a/src/op-adduser.c +++ b/src/op-adduser.c @@ -139,7 +139,7 @@ static void adduser_spam(Ceo__AddUser *in, Ceo__AddUserResponse *out, char *clie static int32_t addmember(Ceo__AddUser *in, Ceo__AddUserResponse *out) { char homedir[1024]; char principal[1024]; - int user_stat, group_stat, krb_stat, home_stat; + int user_stat, group_stat, krb_stat, home_stat, quota_stat; int id; if (snprintf(principal, sizeof(principal), "%s@%s", @@ -177,14 +177,18 @@ static int32_t addmember(Ceo__AddUser *in, Ceo__AddUserResponse *out) { else response_message(out, 0, "successfully created home directory"); + if ((quota_stat = ceo_set_quota("ctdalek", id))) + response_message(out, EQUOTA, "unable to set quota for %s", in->username); + else + response_message(out, 0, "successfully set quota"); - return krb_stat || user_stat || group_stat || home_stat; + return krb_stat || user_stat || group_stat || home_stat || quota_stat; } static int32_t addclub(Ceo__AddUser *in, Ceo__AddUserResponse *out) { char homedir[1024]; char acl[64]; - int krb_stat, user_stat, group_stat, sudo_stat, home_stat; + int krb_stat, user_stat, group_stat, sudo_stat, home_stat, quota_stat; int id; if (snprintf(homedir, sizeof(homedir), "%s/%s", club_home, in->username) >= sizeof(homedir)) @@ -221,7 +225,12 @@ static int32_t addclub(Ceo__AddUser *in, Ceo__AddUserResponse *out) { else response_message(out, 0, "successfully created home directory"); - return user_stat || group_stat || sudo_stat || home_stat; + if ((quota_stat = ceo_set_quota("csc", id))) + response_message(out, EQUOTA, "unable to set quota for %s", in->username); + else + response_message(out, 0, "successfully set quota"); + + return user_stat || group_stat || sudo_stat || home_stat || quota_stat; } static int32_t adduser(Ceo__AddUser *in, Ceo__AddUserResponse *out, char *client) {