# HG changeset patch # User taiki # Date 1407978092 36000 # Node ID 76bd473f3b784269edb32e77d8b01f308162828f # Parent 1c4fb56f3cd5676718167084cb31fc9047a78504 change how to define and be used name diff -r 1c4fb56f3cd5 -r 76bd473f3b78 ie-virsh.c --- a/ie-virsh.c Mon Jul 21 12:14:12 2014 -1000 +++ b/ie-virsh.c Wed Aug 13 15:01:32 2014 -1000 @@ -1,4 +1,3 @@ - #include #include @@ -25,8 +24,27 @@ #define dumpxml_command "dumpxml" #define console_command "console" + +const char *guests[] = {"mata"}; +const char *managers[] = {"taiki"}; +const char students_sym[] = "students"; +const char managers_sym[] = "managers"; +const char guests_sym[] = "guests"; +const char delimiter[] = "_"; + static char bad_name[] = "Bad vmname. Try students/e11/e115711/01 or teachers/kono/02\n"; +enum { + NAME_LENGTH = 50, + VM_NAME_LENGTH = 50 +}; + +enum { + STUDENTS, + GUESTS, + MANAGERS +}; + #define VMNAME_MAX (512) typedef struct vmlist { @@ -97,6 +115,82 @@ printf(" vm-name should be students/e11/e115711/01 or teachers/kono/02\n"); } +int +check_user_name(const char *account_name) +{ + const char *regex = "[ek]([0-9]{6})"; + + regex_t *pattern = (regex_t *)malloc(sizeof(regex_t*)); + int ret = 1; + + if (regcomp(pattern, regex, REG_EXTENDED|REG_NEWLINE) != 0) { + exit(0); + } + + ret = regexec(pattern, account_name, (size_t) 0, NULL, 0); + regfree(pattern); + + if (!ret){ + return STUDENTS; + } + + const int managers_num = sizeof(managers) / sizeof(managers[0]); + int i = 0; + for (; i < managers_num; i++) { + if (strncmp(account_name, managers[i], NAME_LENGTH) == 0) { + return MANAGERS; + } + } + + const int guests_num = sizeof(guests) / sizeof(guests[0]); + int j = 0; + for (; j < guests_num; j++) { + if (strncmp(account_name, guests[j], NAME_LENGTH) == 0) { + return GUESTS; + } + } + + return -1; +} + +void +bind_name(char *name, const char *first, const char *second) +{ + strncat(name, first, VM_NAME_LENGTH); + strncat(name, delimiter, VM_NAME_LENGTH); + strncat(name, second, VM_NAME_LENGTH); + strncat(name, delimiter, VM_NAME_LENGTH); + return; +} + +void +make_vm_name(char *vm_name, const int account_type, const char *account_name, const char *vm_num) +{ + switch(account_type) { + case STUDENTS: + strncat(vm_name, students_sym, VM_NAME_LENGTH); + strncat(vm_name, delimiter, VM_NAME_LENGTH); + strncat(vm_name, account_name, 3); + strncat(vm_name, delimiter, VM_NAME_LENGTH); + strncat(vm_name, account_name, VM_NAME_LENGTH); + strncat(vm_name, delimiter, VM_NAME_LENGTH); + break; + case GUESTS: + bind_name(vm_name, guests_sym, account_name); + break; + case MANAGERS: + bind_name(vm_name, managers_sym, account_name); + break; + default : + fprintf(stderr, "Error: no registered type name."); + return; + } + + strncat(vm_name, vm_num, VM_NAME_LENGTH); + + printf("%s\n", vm_name); +} + /* main(int argc, char **argv) - main process loop */ int main(int argc, char **argv) @@ -118,6 +212,11 @@ exit(0); } + int account_type = check_user_name(name); + + char *vm_name = (char *)malloc(sizeof(char) * VM_NAME_LENGTH); + make_vm_name(vm_name, account_type, name, argv[1]); + /* Confirm user is in GROUP(999) group */ /*