all :
$(foreach dir, $(subdirectories), \
- if [ -f $(dir)/makefile ]; then \
+ if [ -f $(dir)/7_makefile ]; then \
make -C $(dir) all && make -C $(dir) install; \
fi;\
)
clean :
$(foreach dir, $(subdirectories), \
- if [ -f ./$(dir)/makefile ]; then \
+ if [ -f ./$(dir)/7_makefile ]; then \
make -C $(dir) clean; \
fi;\
)
-dist_clean :
+dist-clean :
$(foreach dir, $(subdirectories), \
- if [ -f ./$(dir)/makefile ]; then \
- make -C $(dir) dist_clean; \
+ if [ -f ./$(dir)/7_makefile ]; then \
+ make -C $(dir) dist-clean; \
fi;\
)
#undef INTERFACE
#include <sqlite3.h>
int subudb_Masteru_Subu_rm(sqlite3 *db,char *masteru_name,char *subuname,char *subu_username);
-int subudb_Masteru_Subu_get(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
+int subudb_Masteru_Subu_get_subu_username(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
#include <stdbool.h>
#include <errno.h>
int subu_rm_0(char **mess,sqlite3 *db,char *subuname);
void dispatch_f_mess(char *fname,int err,char *dispatchee);
#define ERR_DISPATCH -1024
int dispatch_f_euid_egid(char *fname,int(*f)(void *arg),void *f_arg,uid_t euid,gid_t egid);
-int db_commit(sqlite3 *db);
-int subudb_number_init(sqlite3 *db,char *masteru_name,int n);
-typedef unsigned int uint;
-extern uint First_Max_Subunumber;
-int db_rollback(sqlite3 *db);
-int subudb_number_set(sqlite3 *db,char *masteru_name,int n);
-int subudb_number_get(sqlite3 *db,char *masteru_name,int *n);
-int db_begin(sqlite3 *db);
int dbprintf(const char *format,...);
int subu_mk_0(char **mess,sqlite3 *db,char *subuname);
extern char Subuland_Extension[];
+int db_commit(sqlite3 *db);
+int db_rollback(sqlite3 *db);
+int subudb_number_set(sqlite3 *db,int n);
+int subudb_number_get(sqlite3 *db,int *n);
+int db_begin(sqlite3 *db);
+typedef unsigned int uint;
extern uint Subuhome_Perms;
extern char DB_File[];
void subu_err(char *fname,int err,char *mess);
#define SUBU_ERR_N 14
-#define SUBU_ERR_CONFIG_SUBU_NOT_FOUND 13
+#define SUBU_ERR_SUBU_NOT_FOUND 13
#define SUBU_ERR_FAILED_USERDEL 12
#define SUBU_ERR_FAILED_USERADD 11
#define SUBU_ERR_BUG_SSS 10
/* \aThis file was automatically generated. Do not edit! */
#undef INTERFACE
#include <sqlite3.h>
+int db_commit(sqlite3 *db);
+int db_rollback(sqlite3 *db);
int subudb_schema(sqlite3 *db);
+int db_begin(sqlite3 *db);
#include <stdbool.h>
#include <errno.h>
#define SUBU_ERR_DB_FILE 8
/* \aThis file was automatically generated. Do not edit! */
#undef INTERFACE
#include <sqlite3.h>
-int subudb_number_get(sqlite3 *db,char *masteru_name,int *n);
-int subudb_number_set(sqlite3 *db,char *masteru_name,int n);
+int subudb_number_get(sqlite3 *db,int *n);
+int subudb_number_set(sqlite3 *db,int n);
#include <stdbool.h>
#include <errno.h>
#define SUBU_ERR_N 14
/* \aThis file was automatically generated. Do not edit! */
#undef INTERFACE
#include <sqlite3.h>
-int subudb_Masteru_Subu_get(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
+int subudb_Masteru_Subu_get_subu_username(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
#include <stdbool.h>
#include <errno.h>
#define SUBU_ERR_DB_FILE 8
--- /dev/null
+/* \aThis file was automatically generated. Do not edit! */
+#undef INTERFACE
+#include <sqlite3.h>
+typedef struct subudb_subu_element subudb_subu_element;
+int subudb_Masteru_Subu_get_subus(sqlite3 *db,char *masteru_name,subudb_subu_element **sa_pt,subudb_subu_element **sa_end_pt);
+struct subudb_subu_element {
+ char *subuname;
+ char *subu_username;
+};
+#include <stdbool.h>
+#include <errno.h>
+#define SUBU_ERR_DB_FILE 8
+extern char DB_File[];
+#define SUBU_ERR_ARG_CNT 1
#undef INTERFACE
#include <sqlite3.h>
int subudb_Masteru_Subu_rm(sqlite3 *db,char *masteru_name,char *subuname,char *subu_username);
-int subudb_Masteru_Subu_get(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
+typedef struct subudb_subu_element subudb_subu_element;
+int subudb_Masteru_Subu_get_subus(sqlite3 *db,char *masteru_name,subudb_subu_element **sa_pt,subudb_subu_element **sa_end_pt);
+void subu_element_free(subudb_subu_element *base,subudb_subu_element *end_pt);
+struct subudb_subu_element {
+ char *subuname;
+ char *subu_username;
+};
+int subudb_Masteru_Subu_get_subu_username(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
int subudb_Masteru_Subu_put(sqlite3 *db,char *masteru_name,char *subuname,char *subu_username);
-int subudb_number_rm(sqlite3 *db,char *masteru_name);
-int subudb_number_set(sqlite3 *db,char *masteru_name,int n);
-int subudb_number_get(sqlite3 *db,char *masteru_name,int *n);
-int subudb_number_init(sqlite3 *db,char *masteru_name,int n);
+int subudb_number_set(sqlite3 *db,int n);
+int subudb_number_get(sqlite3 *db,int *n);
+typedef unsigned int uint;
+extern uint First_Max_Subunumber;
int subudb_schema(sqlite3 *db);
int db_rollback(sqlite3 *db);
int db_commit(sqlite3 *db);
CC=gcc
CFLAGS=-std=gnu11 -fPIC -I. -ggdb -Werror -DDEBUG -DDEBUGDB
#CFLAGS=-std=gnu11 -fPIC -I. -Werror
-LIB=2_lib/libsubu.a
+LIBDIR=2_lib/
+LIB=$(LIBDIR)libsubu.a
LINKFLAGS=-L2_lib -lsubu -lsqlite3
#these are the source files that exist
@echo '---- make $@:------------------------------------------------------------'
@echo `pwd`'>'
make clean
- if [ -d $(APPLICATION) ]; then cd $(APPLICATION); make clean; fi
- if [ -d 1_tests ]; then cd 1_tests; make dist_clean; fi
- if [ -d 1_try ] ; then cd 1_try; make dist_clean; fi
+# if [ -d $(APPLICATION) ]; then cd $(APPLICATION); make clean; fi
+# if [ -d 1_tests ]; then cd 1_tests; make dist_clean; fi
+# if [ -d 1_try ] ; then cd 1_try; make dist_clean; fi
@echo '______end make $@_____'
#
perror(fname);
break;
case SUBU_ERR_DB_FILE:
- fprintf(stderr, "db file error: %s", DB_File); // DB_File is in common
+ fprintf(stderr, "error on %s", DB_File); // DB_File is in common
+ fprintf(stderr, ": %s", mess);
break;
case SUBU_ERR_MASTERU_HOMELESS:
fprintf(stderr,"Masteru, \"%s\", has no home directory", mess);
//--------------------------------------------------------------------------------
// build strings
//
-static int mk_subu_user(char **mess, sqlite3 *db, char *masteru_name, int n, char **subu_username){
+static int mk_subu_username(char **mess, sqlite3 *db, char **subu_username){
+ int rc,n;
+ db_begin(db);
+ if(
+ (rc = subudb_number_get(db, &n))
+ ||
+ (rc = subudb_number_set(db, ++n))
+ ){
+ db_rollback(db);
+ return SUBU_ERR_DB_FILE;
+ }
+ db_commit(db);
+
size_t len = 0;
FILE* name_stream = open_memstream(subu_username, &len);
fprintf(name_stream, "s%d", n);
}
//--------------------------------------------------------------------------------
- // lookup the masteru name
char *masteru_name = 0;
char *masteru_home = 0;
- rc = mk_masteru_name(masteru_uid, &masteru_name, &masteru_home);
- if(rc) return rc;
- #ifdef DEBUG
- dbprintf("masteru_name: \"%s\"\n", masteru_name);
- #endif
-
- db_begin(db);
- int n;
- rc = subudb_number_get(db, masteru_name, &n);
- if( rc == SQLITE_OK ){
- n++;
- rc = subudb_number_set(db, masteru_name, n);
- if( rc != SQLITE_OK ){
- db_rollback(db);
- return SUBU_ERR_DB_FILE;
- }
- }else{ // perhaps this masteru's first subu, so we will try init
- n = First_Max_Subunumber;
- rc = subudb_number_init(db, masteru_name, n);
- if( rc != SQLITE_OK ){
- db_rollback(db);
- return SUBU_ERR_DB_FILE;
- }
- }
- db_commit(db);
- #ifdef DEBUG
- dbprintf("masteru max subunumber: %d\n", n);
- #endif
-
- //--------------------------------------------------------------------------------
- // subu details
char *subu_username = 0;
char *subuland = 0;
char *subuhome = 0; // the name of the directory to put in subuland, not subu_user home dir
rc =
- mk_subu_user(mess, db, masteru_name, n, &subu_username)
+ mk_masteru_name(masteru_uid, &masteru_name, &masteru_home)
+ ||
+ mk_subu_username(mess, db, &subu_username)
||
mk_subuland(masteru_home, &subuland)
||
#endif
{
int rc = subudb_Masteru_Subu_put(db, masteru_name, subuname, subu_username);
- if( rc != SQLITE_DONE ){
+ if( rc != SQLITE_OK ){
if(mess)*mess = strdup("insert of masteru subu relation failed");
RETURN(SUBU_ERR_DB_FILE);
}
char *masteru_home = 0;
char *subuland = 0;
char *subuhome = 0; // the name of the directory to put in subuland, not subu_user home dir
+ char *subu_username = 0;
rc =
mk_masteru_name(masteru_uid, &masteru_name, &masteru_home)
||
db_begin(db);
- char *subu_username = 0;
rc = subudb_Masteru_Subu_get_subu_username(db, masteru_name, subuname, &subu_username);
if( rc != SQLITE_OK ){
if(mess) *mess = strdup("subu requested for removal not found under this masteru in db file");
rc = SUBU_ERR_SUBU_NOT_FOUND;
- db_rollback();
+ db_rollback(db);
RETURN(rc);
}
#ifdef DEBUG
rc = subudb_Masteru_Subu_rm(db, masteru_name, subuname, subu_username);
if( rc != SQLITE_OK ){
if(mess)*mess = strdup("removal of masteru subu relation failed");
- db_rollback();
+ db_rollback(db);
RETURN(SUBU_ERR_DB_FILE);
}
#ifdef DEBUG
}
#endif
char *command = "/usr/sbin/userdel";
- char *argv[3];
+ char *argv[4];
argv[0] = command;
argv[1] = subu_username;
- argv[2] = (char *) NULL;
+ argv[2] = "-r";
+ argv[3] = (char *) NULL;
char *envp[1];
envp[0] = (char *) NULL;
int dispatch_err = dispatch_exec(argv, envp);
fprintf(stderr, "error exit, could not open db file \"%s\"\n", DB_File);
return SUBU_ERR_DB_FILE;
}
+ db_begin(db);
if( subudb_schema(db) != SQLITE_OK ){
+ db_rollback(db);
fprintf(stderr, "error exit, opened db file but could not build schema\n");
return SUBU_ERR_DB_FILE;
}
+ db_commit(db);
if( sqlite3_close(db) != SQLITE_OK ){
fprintf(stderr, "error exit, could not close the db\n");
return SUBU_ERR_DB_FILE;
int main(int argc, char **argv){
- if( argc < 2 || argc > 3){
- fprintf(stderr, "usage: %s masteru_name [n]\n",argv[0]);
+ if( argc < 1 || argc > 2){
+ fprintf(stderr, "usage: %s [n]\n",argv[0]);
return SUBU_ERR_ARG_CNT;
}
- char *masteru_name = argv[1];
int rc;
sqlite3 *db;
return SUBU_ERR_DB_FILE;
}
- // then arg[2] holds a number to set the max to
- if(argc == 3){
- long int i = strtol(argv[2], NULL, 10);
+ // then arg[1] holds a number to set the max to
+ if(argc == 2){
+ long int i = strtol(argv[1], NULL, 10);
if( i < 0 ){
fprintf(stderr, "n must be positive\n");
sqlite3_close(db);
sqlite3_close(db);
return SUBU_ERR_N;
}
- int n = i;
- subudb_number_set(db, masteru_name, n);
+ rc = subudb_number_set(db, i);
+ if( rc != SQLITE_OK ){
+ fprintf(stderr, "couldn't set Max_Subunumber: %s\n", sqlite3_errmsg(db));
+ return SUBU_ERR_N;
+ }
}
// read and print the current max
int n;
- rc = subudb_number_get(db, masteru_name, &n);
- if( rc == SQLITE_DONE ){
+ rc = subudb_number_get(db, &n);
+ if( rc == SQLITE_OK ){
printf("%d\n", n);
}else{
- fprintf(stderr, "lookup failed %s\n", sqlite3_errmsg(db));
+ fprintf(stderr, "couldn't get Max_Subunumber: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return SUBU_ERR_DB_FILE;
}
}}
int ret = subudb_Masteru_Subu_put(db, masteru_name, subuname, subu_username);
- if( ret != SQLITE_DONE ){
+ if( ret != SQLITE_OK ){
fprintf(stderr, "subudb_Masteru_Subu_put indicates failure by returning %d\n",ret);
fprintf(stderr, "sqlite3 issues message, %s\n", sqlite3_errmsg(db));
- printf("put failed\n");
return SUBU_ERR_DB_FILE;
}
ret = sqlite3_close(db);
--- /dev/null
+/*
+Set or get a new maximum subu number. Currently doesn't do the setting part.
+
+*/
+#include "subudb-subus.cli.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+int main(int argc, char **argv){
+
+ if( argc != 2){
+ fprintf(stderr, "usage: %s masteru_name\n",argv[0]);
+ return SUBU_ERR_ARG_CNT;
+ }
+ char *masteru_name = argv[1];
+
+ int rc;
+ sqlite3 *db;
+ rc = sqlite3_open_v2(DB_File, &db, SQLITE_OPEN_READWRITE, NULL);
+ if( rc != SQLITE_OK ){
+ fprintf(stderr, "error exit, could not open db file\n");
+ sqlite3_close(db);
+ return SUBU_ERR_DB_FILE;
+ }
+
+ subudb_subu_element *sa;
+ subudb_subu_element *sa_end;
+ rc = subudb_Masteru_Subu_get_subus(db, masteru_name, &sa, &sa_end);
+ if( rc == SQLITE_OK ){
+ subudb_subu_element *pt = sa;
+ while( pt != sa_end ){
+ printf("%s\n", *pt);
+ pt++;
+ }
+ rc = sqlite3_close(db);
+ if( rc != SQLITE_OK ){
+ fprintf(stderr, "when closing db, %s\n", sqlite3_errmsg(db));
+ return SUBU_ERR_DB_FILE;
+ }
+ return 0;
+ }
+ fprintf(stderr, "lookup failed %s\n", sqlite3_errmsg(db));
+ sqlite3_close(db);
+ return SUBU_ERR_DB_FILE;
+
+}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <stdbool.h>
//--------------------------------------------------------------------------------
// sqlite transactions don't nest. There is a way to use save points, but still
//--------------------------------------------------------------------------------
int subudb_schema(sqlite3 *db){
- char sql[] =
- "CREATE TABLE Masteru_Subu(masteru_name TEXT, subuname TEXT, subu_username TEXT);"
- "CREATE TABLE Masteru_Max(masteru_name TEXT, max_subu_number INT);"
- ;
- return sqlite3_exec(db, sql, NULL, NULL, NULL);
-}
-
-//--------------------------------------------------------------------------------
-int subudb_number_init(sqlite3 *db, char *masteru_name, int n){
int rc;
- char *sql = "INSERT INTO Masteru_Max (masteru_name, max_subu_number) VALUES (?1, ?2);";
- sqlite3_stmt *stmt;
- sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
- sqlite3_bind_text(stmt, 1, masteru_name, -1, SQLITE_STATIC);
- sqlite3_bind_int(stmt, 2, n);
- rc = sqlite3_step(stmt);
- sqlite3_finalize(stmt);
- if( rc == SQLITE_DONE ) return SQLITE_OK;
- return rc;
+
+ { // build tables
+ char sql[] =
+ "CREATE TABLE Masteru_Subu(masteru_name TEXT, subuname TEXT, subu_username TEXT);"
+ "CREATE TABLE Attribute_Int(attribute TEXT, value INT);"
+ ;
+ rc = sqlite3_exec(db, sql, NULL, NULL, NULL);
+ if(rc != SQLITE_OK) return rc;
+ }
+
+ { // data initialization
+ char *sql = "INSERT INTO Attribute_Int (attribute, value) VALUES ('Max_Subunumber', ?1);";
+ sqlite3_stmt *stmt;
+ sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
+ sqlite3_bind_int(stmt, 1, First_Max_Subunumber);
+ rc = sqlite3_step(stmt);
+ sqlite3_finalize(stmt);
+ if( rc != SQLITE_DONE ) return rc;
+ }
+
+ return SQLITE_OK;
}
-int subudb_number_get(sqlite3 *db, char *masteru_name, int *n){
- char *sql = "SELECT max_subu_number FROM Masteru_Max WHERE masteru_name = ?1;";
+//--------------------------------------------------------------------------------
+int subudb_number_get(sqlite3 *db, int *n){
+ char *sql = "SELECT value FROM Attribute_Int WHERE attribute = 'Max_Subunumber';";
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
- sqlite3_bind_text(stmt, 1, masteru_name, -1, SQLITE_STATIC);
int rc = sqlite3_step(stmt);
if( rc == SQLITE_ROW ){
*n = sqlite3_column_int(stmt,0);
rc = sqlite3_step(stmt);
sqlite3_finalize(stmt);
- if( rc == SQLITE_DONE ) return SQLITE_OK;
- return rc;
+ if( rc != SQLITE_DONE ) return rc;
+ return SQLITE_OK;
}
// should have a message return, suppose
sqlite3_finalize(stmt);
return SQLITE_NOTFOUND;
}
-// on success returns SQLITE_DONE
-int subudb_number_set(sqlite3 *db, char *masteru_name, int n){
+int subudb_number_set(sqlite3 *db, int n){
int rc;
- char *sql = "UPDATE Masteru_Max SET max_subu_number = ?1 WHERE masteru_name = ?2;";
+ char *sql = "UPDATE Attribute_Int SET value = ?1 WHERE attribute = 'Max_Subunumber';";
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
sqlite3_bind_int(stmt, 1, n);
- sqlite3_bind_text(stmt, 2, masteru_name, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
sqlite3_finalize(stmt);
if( rc == SQLITE_DONE ) return SQLITE_OK;
return rc;
}
-// returns SQLITE_DONE or an error code
-// removes masteru/max_number relation from table
-int subudb_number_rm(sqlite3 *db, char *masteru_name){
- char *sql = "DELETE FROM Masteru_Max WHERE masteru_name = ?1;";
- sqlite3_stmt *stmt;
- sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
- sqlite3_bind_text(stmt, 1, masteru_name, -1, SQLITE_STATIC);
- int rc = sqlite3_step(stmt);
- sqlite3_finalize(stmt);
- if( rc == SQLITE_DONE ) return SQLITE_OK;
- return rc;
-}
-
//--------------------------------------------------------------------------------
// put relation into Masteru_Subu table
int subudb_Masteru_Subu_put(sqlite3 *db, char *masteru_name, char *subuname, char *subu_username){
sqlite3_bind_text(stmt, 3, subu_username, -1, SQLITE_STATIC);
int rc = sqlite3_step(stmt);
sqlite3_finalize(stmt);
+ if( rc == SQLITE_DONE ) return SQLITE_OK;
return rc;
}
return rc; // woops this needs to return an error!, be sure it is not SQLITE_DONE
}
rc = sqlite3_step(stmt);
- sqlite3_finalize(stmt);
+ if( rc == SQLITE_DONE ) return SQLITE_OK;
return rc;
}
free(base);
*base = new_base;
*pt = new_base + offset;
- s = new_s;
+ *s = new_s;
}
static bool off_alloc(void *base, void *pt, size_t s){
return pt == base + s;
}
// we return and array of subudb_subu_info
-struct subudb_subu_info{
+#if INTERFACE
+struct subudb_subu_element{
char *subuname;
char *subu_username;
};
-static void subu_info_alloc(subudb_subu_info **base, size_t *s){
- *s = 4 * sizeof(subudb_subu_info);
- *base = malloc(s)
+#endif
+static void subu_element_alloc(subudb_subu_element **base, size_t *s){
+ *s = 4 * sizeof(subudb_subu_element);
+ *base = malloc(*s);
}
-static void subu_info_free(subudb_subu_info *base, subu_db_subu_info *end_pt){
- subudb_subu_info *pt = base;
+void subu_element_free(subudb_subu_element *base, subudb_subu_element *end_pt){
+ subudb_subu_element *pt = base;
while( pt != end_pt ){
- pt->free(subuname);
- pt->free(subu_username);
+ free(pt->subuname);
+ free(pt->subu_username);
pt++;
}
free(base);
}
-int subudb_Masteru_Subu_get_subu_info
+int subudb_Masteru_Subu_get_subus
(
sqlite3 *db,
char *masteru_name,
- subudb_subu_info **si,
- subudb_subu_info **si_end
+ subudb_subu_element **sa_pt,
+ subudb_subu_element **sa_end_pt
){
char *sql = "SELECT subuname, subu_username"
- "FROM Masteru_Subu"
- "WHERE masteru_name = ?1;";
+ " FROM Masteru_Subu"
+ " WHERE masteru_name = ?1;";
size_t sql_len = strlen(sql);
sqlite3_stmt *stmt;
int rc;
if( rc != SQLITE_OK ) return rc;
sqlite3_bind_text(stmt, 1, masteru_name, strlen(masteru_name), SQLITE_STATIC);
- size_t subu_info_size;
- subudb_subu_info *subu_info;
- subu_info_alloc(&subu_info, &subu_info_size);
- subudb_subu_info *pt = subu_info;
+ size_t subu_element_size;
+ subudb_subu_element *subu_element;
+ subu_element_alloc(&subu_element, &subu_element_size);
+ subudb_subu_element *pt = subu_element;
rc = sqlite3_step(stmt);
while( rc == SQLITE_ROW ){
- if( off_alloc(subu_info, pt) ) expand(&subu_info, &pt, &subu_info_size);
+ if( off_alloc(subu_element, pt, subu_element_size) ) expand((void **)&subu_element, (void **)&pt, &subu_element_size);
pt->subuname = strdup(sqlite3_column_text(stmt, 0));
pt->subu_username = strdup(sqlite3_column_text(stmt, 1));
rc = sqlite3_step(stmt);
if( rc != SQLITE_DONE ){
return rc; // woops this needs to return an error!, be sure it is not SQLITE_DONE
}
- *si = subu_info;
- *si_end = pt;
- return SQLTIE_OK;
+ *sa_pt = subu_element;
+ *sa_end_pt = pt;
+ return SQLITE_OK;
}
sqlite3_bind_text(stmt, 3, subu_username, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
sqlite3_finalize(stmt);
+ if( rc == SQLITE_DONE ) return SQLITE_OK;
return rc;
}
#!/bin/bash
set -x
-make dist_clean
+make dist-clean
git add "$@"