changeset 26:76bd473f3b78

change how to define and be used name
author taiki <taiki@cr.ie.u-ryukyu.ac.jp>
date Wed, 13 Aug 2014 15:01:32 -1000
parents 1c4fb56f3cd5
children b731ce75cd35
files ie-virsh.c
diffstat 1 files changed, 100 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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 <stdlib.h>
 #include <unistd.h>
@@ -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 */
 
     /*