OSDN Git Service

オリジナルのtrunkからwinバイナリ用ソースをインポート。
[coroid/inqubus.git] / win / cookie / cookie.c
1 /*\r
2  * Windows\97pCookie\8eæ\93¾\83v\83\8d\83O\83\89\83\80\r
3  * copyright (c) 2008 \83Õ\81i\83v\83T\83C\81j\r
4  *\r
5  * IE\82Ì\83N\83b\83L\81[\82ð\8eæ\93¾\82µ\82Ä\95\\8e¦\82·\82é\83v\83\8d\83O\83\89\83\80\82Å\82·\81B\r
6  *\r
7  * \82±\82Ì\83t\83@\83C\83\8b\82Í\81u\82³\82«\82ã\82Î\82·\81v\82Ì\88ê\95\94\82Å\82 \82è\81A\r
8  * \82±\82Ì\83\\81[\83X\83R\81[\83h\82ÍGPL\83\89\83C\83Z\83\93\83X\82Å\94z\95z\82³\82ê\82Ü\82·\82Å\82·\81B\r
9  */\r
10 #include <windows.h>\r
11 #include <stdio.h>\r
12 \r
13 //\83j\83R\83j\83R\93®\89æURL\r
14 #define NICO_URL "http://www.nicovideo.jp/"\r
15 //\94O\82Ì\82½\82ß\88ê\89ñ\8dí\8f\9c\82·\82é\82½\82ß\82Ì\8eg\82¤\83N\83b\83L\81[\81B\r
16 #define NICO_CLEAR_COOKIE "dummy; expires=Thu, 1-Jan-1970 00:00:00 GMT; domain=.nicovideo.jp; path=/;"\r
17 #define COOKIE_MAX 4096\r
18 \r
19 int getCookie(void* dynamic){\r
20         //\83N\83b\83L\81[\8eæ\93¾\8aÖ\90\94\82ð\8eæ\93¾\r
21         int (*get_cookie)(const char* url,const char* str,char* buff,int* size) = (void*)GetProcAddress((HMODULE)dynamic, "InternetGetCookieA");\r
22         if(!get_cookie){\r
23         fputs("failed to load InternetGetCookieA",stderr);\r
24         return -1;\r
25         }\r
26         //\83o\83b\83t\83@\97p\83\81\83\82\83\8a\82Ì\8am\95Û\81B\r
27         char* str = malloc(COOKIE_MAX);\r
28         if(!str){\r
29         fputs("failed to malloc memory",stderr);\r
30         return -1;\r
31         }\r
32         int size = COOKIE_MAX;\r
33         if(get_cookie(NICO_URL,NULL,str,&size)){\r
34                 puts(str);\r
35         }else if(size > COOKIE_MAX){//\83o\83b\83t\83@\82ª\91«\82è\82È\82­\82Ä\8e¸\94s\82µ\82½\82Æ\8ev\82í\82ê\82é\81B\r
36                 //\83o\83b\83t\83@\8dÄ\8am\95Û\r
37                 str = realloc(str,size);\r
38                 if(!str){\r
39                 fputs("failed to realloc memory",stderr);\r
40                 return -1;\r
41                 }\r
42                 if(get_cookie(NICO_URL,NULL,str,&size)){\r
43                         puts(str);\r
44                 }else{//\82È\82ñ\82©\83\\81[\83X\82ª\91½\8f­\89\98\82¢\82¯\82Ç\93®\82¯\82Î\82æ\82ë\82µ\81B\r
45                 fputs("failed to get cookie",stderr);\r
46                 free(str);\r
47                 return -1;\r
48                 }\r
49         }else{\r
50         fputs("failed to get cookie",stderr);\r
51                 free(str);\r
52                 return -1;\r
53         }\r
54         free(str);\r
55         return 0;\r
56 }\r
57 \r
58 int setCookie(void* dynamic,const char* str){\r
59         //\83N\83b\83L\81[\8eæ\93¾\8aÖ\90\94\82ð\8eæ\93¾\r
60         int (*set_cookie)(const char* url,const char* name,const char* data) = (void*)GetProcAddress((HMODULE)dynamic, "InternetSetCookieA");\r
61         if(!set_cookie){\r
62         fputs("failed to load InternetGetCookieA",stderr);\r
63         return -1;\r
64         }\r
65         //\96¼\91O\82Æ\83f\81[\83^\82Ì\95ª\97£\r
66         int i=0;\r
67         int length = strlen(str);\r
68         char* tmp = malloc(length+1);\r
69         memcpy(tmp,str,length);\r
70         tmp[length] = '\0';\r
71         char* name = tmp;\r
72         char* data = NULL;\r
73         for(i=0;i<length;i++){\r
74                 if(tmp[i] == '='){\r
75                         tmp[i] = '\0';\r
76                         data = &tmp[i+1];\r
77                         break;\r
78                 }\r
79         }\r
80         if(data == NULL){\r
81         fputs("Cookie str is invalid.",stderr);\r
82         free(tmp);\r
83                 return -1;\r
84         }\r
85         //\93o\98^\82·\82é\91O\82É\82Æ\82è\82 \82¦\82¸\8dí\8f\9c\82µ\82Ä\82Ý\82é\r
86         if(set_cookie(NICO_URL,name,NICO_CLEAR_COOKIE) == FALSE){\r
87         fputs("failed to clear cookie.",stderr);\r
88         free(tmp);\r
89                 return -1;\r
90         }\r
91         //\8eÀ\8dÛ\82É\93o\98^\82µ\82Ä\82Ý\82é\r
92         if(set_cookie(NICO_URL,name,data) == TRUE){\r
93         free(tmp);\r
94                 return 0;\r
95         }else{\r
96         fputs("failed to set cookie.",stderr);\r
97         free(tmp);\r
98                 return -1;\r
99         }\r
100 }\r
101 \r
102 int main(int argc,char* argv[]){\r
103         //wininet.dll\82Ì\83_\83C\83i\83~\83b\83N\93Ç\82Ý\8d\9e\82Ý\81B\r
104     void* dynamic = (void*)LoadLibrary("wininet.dll");\r
105     if (!dynamic) {\r
106         fputs("failed to load wininet.dll",stderr);\r
107         return -1;\r
108     }\r
109         int ret = 0;\r
110         if(argc > 1){/* set\82·\82é\83N\83b\83L\81[\82ª\91\8dÝ\82·\82é */\r
111                 ret = setCookie(dynamic,argv[1]);\r
112         }else{/*\91\8dÝ\82µ\82È\82¢*/\r
113                 ret = getCookie(dynamic);\r
114         }\r
115         //\8aJ\95ú\81A\8fI\97¹\81B\r
116         FreeLibrary((HMODULE)dynamic);\r
117         return ret;\r
118 }\r